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 解析XML python模块xml.dom解析xml实例代码
Feb 07 Python
python实现数组插入新元素的方法
May 22 Python
python模块之time模块(实例讲解)
Sep 13 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
Sep 26 Python
python利用微信公众号实现报警功能
Jun 10 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
Jun 19 Python
python实现回旋矩阵方式(旋转矩阵)
Dec 04 Python
Python类反射机制使用实例解析
Dec 30 Python
基于python3抓取pinpoint应用信息入库
Jan 08 Python
pycharm 中mark directory as exclude的用法详解
Feb 14 Python
Python如何实现小程序 无限求和平均
Feb 18 Python
matplotlib基础绘图命令之imshow的使用
Aug 13 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 array_slice函数的使用以及参数详解
2008/08/30 PHP
php浏览历史记录的方法
2015/03/10 PHP
日常整理PHP中简单的图形处理(经典)
2015/10/26 PHP
Laravel与CI框架中截取字符串函数
2016/05/08 PHP
基于php判断客户端类型
2016/10/14 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
2017/09/13 PHP
实例分析PHP中PHPMailer发邮件
2017/12/13 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
jquery 子窗口操作父窗口的代码
2009/09/21 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
JavaScript实现的圆形浮动标签云效果实例
2015/08/06 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
2016/06/23 Javascript
Listloading.js移动端上拉下拉刷新组件
2016/08/04 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
Vue方法与事件处理器详解
2016/12/01 Javascript
微信小程序开发入门基础教程
2017/04/19 Javascript
在Web关闭页面时发送Ajax请求的实现方法
2019/03/07 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
2019/06/10 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
2019/09/11 Javascript
vue二选一tab栏切换新做法实现
2021/01/19 Vue.js
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
PHP webshell检查工具 python实现代码
2009/09/15 Python
python实现SMTP邮件发送功能
2020/06/16 Python
Python 学习教程之networkx
2019/04/15 Python
python opencv实现证件照换底功能
2019/08/19 Python
Python Celery异步任务队列使用方法解析
2020/08/10 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
《胡杨》教学反思
2014/02/16 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
故意杀人案辩护词
2015/05/21 职场文书
网络妈妈观后感
2015/06/08 职场文书
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技
Windows Server 2019 安装DHCP服务及相关配置
2022/04/28 Servers
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技