Python使用xpath实现图片爬取


Posted in Python onSeptember 16, 2020

高性能异步爬虫

目的:在爬虫中使用异步实现高性能的数据爬取操作

异步爬虫的方式:

- 多线程、多进程(不建议):

好处:可以为相关阻塞的操作单独开启多线程或进程,阻塞操作就可以异步执行;

弊端:无法无限制的开启多线程或多进程。

- 线程池、进程池(适当的使用):

好处:我们可以降低系统对进程或线程创建和销毁的一个频率,从而很好的降低系统的开销;

弊端:池中线程或进程的数据是有上限的。

代码如下

# _*_ coding:utf-8 _*_
"""
@FileName  :6.4k图片解析爬取(异步高性能测试).py
@CreateTime :2020/8/14 0014 10:01
@Author   : Lurker Zhang
@E-mail   : 289735192@qq.com
@Desc.   :
"""

import requests
from lxml import etree
from setting.config import *
import json
import os
import time
from multiprocessing.dummy import Pool


def main():
  # 图片采集源地址
  # source_url = 'http://pic.netbian.com/4kmeinv/'
  # temp_url = 'http://pic.netbian.com/4kmeinv/index_{}.html'
  # source_url = 'http://pic.netbian.com/4kdongman/'
  # temp_url = 'http://pic.netbian.com/4kdongman/index_{}.html'
  source_url = 'http://pic.netbian.com/4kmingxing/'
  temp_url = 'http://pic.netbian.com/4kmingxing/index_{}.html'
  # 本此采集前多少页,大于1的整数
  page_sum = 136
  all_pic_list_url = []
  if page_sum == 1:
    pic_list_url = source_url
    print('开始下载:' + pic_list_url)
    all_pic_list_url.append(pic_list_url)
  else:
    # 先采集第一页
    pic_list_url = source_url
    # 调用采集单页图片链接的函数
    all_pic_list_url.append(pic_list_url)
    # 再采集第二页开始后面的页数
    for page_num in range(2, page_sum + 1):
      pic_list_url = temp_url.format(page_num)
      all_pic_list_url.append(pic_list_url)
  # 单页图片多线程解析
  pool1 = Pool(10)
  pool1.map(down_pic, all_pic_list_url)

  print('采集完成,本地成功下载{0}张图片,失败{1}张图片。'.format(total_success, total_fail))
  # 存储已下载文件名列表:
  with open("../depository/mingxing/pic_name_list.json", 'w', encoding='utf-8') as fp:
    json.dump(pic_name_list, fp)


def down_pic(pic_list_url):
  print("准备解析图片列表页:",pic_list_url)
  # 获取图片列表页的网页数据
  pic_list_page_text = requests.get(url=pic_list_url, headers=headers).text
  tree_1 = etree.HTML(pic_list_page_text)
  # 获取图片地址列表
  pic_show_url_list = tree_1.xpath('//div[@class="slist"]/ul//a/@href')
  pic_url_list = [get_pic_url('http://pic.netbian.com' + pic_show_url) for pic_show_url in pic_show_url_list]

  # 开始下载并保存图片(多线程)
  pool2 = Pool(5)
  pool2.map(save_pic, pic_url_list)


def save_pic(pic_url):
  print("准备下载图片:",pic_url)
  global total_success, total_fail, pic_name_list,path
  picname = get_pic_name(pic_url)
  if not picname in pic_name_list:
    # 获取日期作为保存位置文件夹

    pic = requests.get(url=pic_url, headers=headers).content
    try:
      with open(path + picname, 'wb') as fp:
        fp.write(pic)
    except IOError:
      print(picname + "保存失败")
      total_fail += 1
    else:
      pic_name_list.append(picname)
      total_success += 1
      print("成功保存图片:{0},共成功采集{1}张。".format(picname, total_success))

  else:
    print("跳过,已下载过图片:" + picname)
    total_fail += 1


def get_pic_name(pic_url):
  return pic_url.split('/')[-1]


def get_pic_url(pic_show_url):
  tree = etree.HTML(requests.get(url=pic_show_url, headers=headers).text)
  return 'http://pic.netbian.com/' + tree.xpath('//div[@class="photo-pic"]/a/img/@src')[0]


if __name__ == '__main__':
  # 读入已采集图片的名称库,名称存在重复的表示已经采集过将跳过不采集
  if not os.path.exists('../depository/mingxing/pic_name_list.json'):
    with open("../depository/mingxing/pic_name_list.json", 'w', encoding="utf-8") as fp:
      json.dump([], fp)
  with open("../depository/mingxing/pic_name_list.json", "r", encoding="utf-8") as fp:
    pic_name_list = json.load(fp)
  path = '../depository/mingxing/' + time.strftime('%Y%m%d', time.localtime()) + '/'
  if not os.path.exists(path):
    os.mkdir(path)
  # 记录本次采集图片的数量
  total_success = 0
  total_fail = 0
  main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解如何在python中读写和存储matlab的数据文件(*.mat)
Feb 24 Python
python在文本开头插入一行的实例
May 02 Python
基于python实现KNN分类算法
Apr 23 Python
使用Python的SymPy库解决数学运算问题的方法
Mar 27 Python
详解用Python实现自动化监控远程服务器
May 18 Python
如何爬取通过ajax加载数据的网站
Aug 15 Python
python基于celery实现异步任务周期任务定时任务
Dec 30 Python
python with (as)语句实例详解
Feb 04 Python
python如何提取英语pdf内容并翻译
Mar 03 Python
Python3 pickle对象串行化代码实例解析
Mar 23 Python
Django xadmin安装及使用详解
Oct 26 Python
Python实现列表索引批量删除的5种方法
Nov 16 Python
Python自动创建Excel并获取内容
Sep 16 #Python
python如何实时获取tcpdump输出
Sep 16 #Python
基于python实现复制文件并重命名
Sep 16 #Python
详解python程序中的多任务
Sep 16 #Python
python实现简单的tcp 文件下载
Sep 16 #Python
实现Python3数组旋转的3种算法实例
Sep 16 #Python
Python私有属性私有方法应用实例解析
Sep 15 #Python
You might like
php绝对路径与相对路径之间关系的的分析
2010/03/03 PHP
php下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
浅析PHP 按位与或 (^ 、&)
2013/06/21 PHP
PHP实现的连贯操作、链式操作实例
2014/07/08 PHP
php中fgetcsv()函数用法实例
2014/11/28 PHP
Javascript 解疑
2009/11/11 Javascript
jQuery AJAX 调用WebService实现代码
2010/03/24 Javascript
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
纯css+js写的一个简单的tab标签页带样式
2014/01/28 Javascript
js实现鼠标感应图片展示的方法
2015/02/27 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
推荐10 个很棒的 jQuery 特效代码
2015/10/04 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
基于Vue2.X的路由和钩子函数详解
2018/02/09 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
vue移动端项目缓存问题实践记录
2018/10/29 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
2019/03/01 Python
使用虚拟环境打包python为exe 文件的方法
2019/08/29 Python
pygame实现俄罗斯方块游戏(AI篇1)
2019/10/29 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
Otiumberg官网:英国半精致珠宝品牌
2021/01/16 全球购物
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
JSF如何进行表格处理及取值
2012/08/06 面试题
大学生自我鉴定范文
2013/12/28 职场文书
大学班长竞选稿
2015/11/20 职场文书
pytorch 实现多个Dataloader同时训练
2021/05/29 Python
python turtle绘图命令及案例
2021/11/23 Python
MySQL新手入门进阶语句汇总
2022/09/23 MySQL