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 相关文章推荐
selenium + python 获取table数据的示例讲解
Oct 13 Python
Pandas中resample方法详解
Jul 02 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
django fernet fields字段加密实践详解
Aug 12 Python
Django Admin中增加导出Excel功能过程解析
Sep 04 Python
给大家整理了19个pythonic的编程习惯(小结)
Sep 25 Python
安装Pycharm2019以及配置anconda教程的方法步骤
Nov 11 Python
Python time库基本使用方法分析
Dec 13 Python
python随机生成大小写字母数字混合密码(仅20行代码)
Feb 01 Python
python让函数不返回结果的方法
Jun 22 Python
Python 使用生成器代替线程的方法
Aug 04 Python
Python Request类源码实现方法及原理解析
Aug 17 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实现博客,论坛图片防盗链的方法
2016/10/15 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
2019/04/02 PHP
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
jquery事件preventDefault()方法用法实例
2015/01/16 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
2015/08/10 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
2015/11/15 Javascript
JS不用正则验证输入的字符串是否为空(包含空格)的实现代码
2016/06/14 Javascript
教你如何在Node.js中使用jQuery
2016/08/28 Javascript
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
python控制台英汉汉英电子词典
2020/04/23 Python
python实现八大排序算法(1)
2017/09/14 Python
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
TensorFlow中权重的随机初始化的方法
2018/02/11 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
python读写csv文件方法详细总结
2019/07/05 Python
pandas读取CSV文件时查看修改各列的数据类型格式
2019/07/07 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
2019/10/11 Python
Python实现的北京积分落户数据分析示例
2020/03/27 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
浅谈CSS3 动画卡顿解决方案
2019/01/02 HTML / CSS
Java语言程序设计测试题判断题部分
2013/01/06 面试题
学生未请假就回家检讨书
2014/09/22 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
初中作文评语集锦
2014/12/25 职场文书
职工培训工作总结
2015/08/10 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
CSS 圆形进度栏
2021/04/06 HTML / CSS
JavaScript中的宏任务和微任务详情
2021/11/27 Javascript