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实现抓取页面上链接的简单爬虫分享
Jan 21 Python
学习python类方法与对象方法
Mar 15 Python
python读取excel表格生成erlang数据
Aug 26 Python
Python定时器实例代码
Nov 01 Python
Python机器学习之决策树算法实例详解
Dec 06 Python
详解Python 装饰器执行顺序迷思
Aug 08 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
Feb 07 Python
Python -m参数原理及使用方法解析
Aug 21 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
python Scrapy爬虫框架的使用
Jan 21 Python
深入理解Pytorch微调torchvision模型
Nov 11 Python
Python使用pyecharts控件绘制图表
Jun 05 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编程之设置apache虚拟目录
2016/07/08 PHP
php接口技术实例详解
2016/12/07 PHP
js 深拷贝函数
2008/12/04 Javascript
防止按钮在短时间内被多次点击的方法
2014/03/10 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
探讨AngularJs中ui.route的简单应用
2016/11/16 Javascript
vue实现简单实时汇率计算功能
2017/01/15 Javascript
将angular-ui的分页组件封装成指令的方法详解
2017/05/10 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
JS 中document.write()的用法和清空的原因浅析
2017/12/04 Javascript
浅谈开发eslint规则
2018/10/01 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
详解JavaScript的数据类型以及数据类型的转换
2019/04/20 Javascript
jQuery插件实现图片轮播效果
2020/10/19 jQuery
js实现类选择器和name属性选择器的示例步骤
2021/02/07 Javascript
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
利用Fn.py库在Python中进行函数式编程
2015/04/22 Python
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
python对离散变量的one-hot编码方法
2018/07/11 Python
Scrapy框架实现的登录网站操作示例
2020/02/06 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
Python爬虫:Request Payload和Form Data的简单区别说明
2020/04/30 Python
Python flask框架实现查询数据库并显示数据
2020/06/04 Python
Pytorch 图像变换函数集合小结
2021/02/01 Python
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
BCBG官网:BCBGMAXAZRIA
2017/12/29 全球购物
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
2014自荐信的写作技巧
2014/01/28 职场文书
关于期中考试的反思
2014/02/02 职场文书
爱耳日活动总结
2014/04/30 职场文书
卫生系统先进事迹
2014/05/13 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
交通事故委托书范本(2篇)
2014/09/21 职场文书
2014年卫生工作总结
2014/11/27 职场文书
2015年后勤工作总结范文
2015/04/08 职场文书