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协程的用法和例子详解
Sep 09 Python
Python实现的朴素贝叶斯分类器示例
Jan 06 Python
python list元素为tuple时的排序方法
Apr 18 Python
基于Python 装饰器装饰类中的方法实例
Apr 21 Python
python保存文件方法小结
Jul 27 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
Dec 12 Python
Python创建一个元素都为0的列表实例
Nov 28 Python
布隆过滤器的概述及Python实现方法
Dec 08 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
Mar 19 Python
python模拟实现分发扑克牌
Apr 22 Python
python/golang实现循环链表的示例代码
Sep 14 Python
python tqdm库的使用
Nov 30 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 采集心得技巧
2009/05/15 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
PHP的mysqli_stat()函数讲解
2019/01/23 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
JavaScript 字符串乘法
2009/08/20 Javascript
csdn 博客中实现运行代码功能实现
2009/08/29 Javascript
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
2012/10/11 Javascript
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
用jquery实现的一个超级简单的下拉菜单
2014/05/18 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
JS实现点击颜色块切换指定区域背景颜色的方法
2015/02/25 Javascript
JavaScript中使用指数方法Math.exp()的简介
2015/06/15 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
2018/05/16 Javascript
基于JavaScript判断两个对象内容是否相等
2020/01/10 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
JavaScript实现商品评价五星好评
2020/11/30 Javascript
python实现简单淘宝秒杀功能
2018/05/03 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
Python判断变量是否是None写法代码实例
2020/10/09 Python
HTML5+css3:3D旋转木马效果相册
2017/01/03 HTML / CSS
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
Windows和Linux动态库应用异同
2016/04/17 面试题
求职信结尾怎么写
2014/05/26 职场文书
企业法人代表任命书
2014/06/06 职场文书
学校三八妇女节活动总结
2015/02/06 职场文书
只用20行Python代码实现屏幕录制功能
2021/06/02 Python
python常见的占位符总结及用法
2021/07/02 Python
python之PySide2安装使用及QT Designer UI设计案例教程
2021/07/26 Python