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语言编写电脑时间自动同步小工具
Mar 08 Python
Python实现多行注释的另类方法
Aug 22 Python
python daemon守护进程实现
Aug 27 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
Python Datetime模块和Calendar模块用法实例分析
Apr 15 Python
Pytorch卷积层手动初始化权值的实例
Aug 17 Python
python爬虫爬取监控教务系统的思路详解
Jan 08 Python
新手入门学习python Numpy基础操作
Mar 02 Python
python数据处理——对pandas进行数据变频或插值实例
Apr 22 Python
python同时遍历两个list用法说明
May 02 Python
Pandas中两个dataframe的交集和差集的示例代码
Dec 13 Python
python利用xpath爬取网上数据并存储到django模型中
Feb 26 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
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
php自定义apk安装包实例
2014/10/20 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
php 生成加密公钥加密私钥实例详解
2017/06/16 PHP
Laravel实现通过blade模板引擎渲染视图
2019/10/25 PHP
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
原生js和jQuery实现淡入淡出轮播效果
2015/12/25 Javascript
理解javascript封装
2016/02/23 Javascript
详解堆的javascript实现方法
2016/11/29 Javascript
完美解决iview 的select下拉框选项错位的问题
2018/03/02 Javascript
微信小程序实现tab页面切换功能
2018/07/13 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
python调用机器喇叭发出蜂鸣声(Beep)的方法
2015/03/23 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
Python 点击指定位置验证码破解的实现代码
2019/09/11 Python
django框架中间件原理与用法详解
2019/12/10 Python
Python生成词云的实现代码
2020/01/14 Python
Jupyter Notebook打开任意文件夹操作
2020/04/14 Python
Python 在局部变量域中执行代码
2020/08/07 Python
使用HTML5拍照示例代码
2013/08/06 HTML / CSS
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
施华洛世奇日本官网:SWAROVSKI日本
2018/05/04 全球购物
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
异步传递消息系统的作用
2016/05/01 面试题
应征英语教师求职信
2013/11/27 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
班级体育活动总结
2014/07/05 职场文书
研究生毕业论文导师评语
2014/12/31 职场文书
乡镇法制宣传日活动总结
2015/05/05 职场文书
找规律教学反思
2016/02/23 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技