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多进程并发(multiprocessing)用法实例详解
Jun 02 Python
Python爬虫获取整个站点中的所有外部链接代码示例
Dec 26 Python
Python3中关于cookie的创建与保存
Oct 21 Python
Python Django 实现简单注册功能过程详解
Jul 29 Python
解决pycharm不能自动补全第三方库的函数和属性问题
Mar 12 Python
PyQt5中向单元格添加控件的方法示例
Mar 24 Python
如何查看Django ORM执行的SQL语句的实现
Apr 20 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
Jun 28 Python
通过实例简单了解Python sys.argv[]使用方法
Aug 04 Python
详解pycharm2020.1.1专业版安装指南(推荐)
Aug 07 Python
python 如何使用find和find_all爬虫、找文本的实现
Oct 16 Python
实例讲解Python中sys.argv[]的用法
Jun 03 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 socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
php之curl实现http与https请求的方法
2014/10/21 PHP
php+xml编程之xpath的应用实例
2015/01/24 PHP
3种php生成唯一id的方法
2015/11/23 PHP
Laravel 5.3 学习笔记之 配置
2016/08/28 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
PHP实现微信小程序人脸识别刷脸登录功能
2018/05/24 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
prototype框架中美元符号$用法分析
2016/01/22 Javascript
js编写选项卡效果
2017/05/23 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
bootstrap模态框关闭后清除模态框的数据方法
2018/08/10 Javascript
js中实例与对象的区别讲解
2019/01/21 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
2020/09/04 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
python MNIST手写识别数据调用API的方法
2018/08/08 Python
python微信公众号之关注公众号自动回复
2018/10/25 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
2020/05/20 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
vscode配置anaconda3的方法步骤
2020/08/08 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
在canvas上实现元素图片镜像翻转动画效果的方法
2018/03/20 HTML / CSS
英国户外装备和冒险服装零售商:alloutdoor
2018/01/30 全球购物
英国鲜花速递:Serenata Flowers
2018/04/03 全球购物
爱心捐款倡议书范文
2014/05/12 职场文书
典型事迹材料范文
2014/12/29 职场文书
python实现web邮箱扫描的示例(附源码)
2021/03/30 Python
如何使用flask将模型部署为服务
2021/05/13 Python
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
2022/02/12 Servers