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 相关文章推荐
web.py中调用文件夹内模板的方法
Aug 26 Python
Python实现合并字典的方法
Jul 07 Python
详解Python的Django框架中Manager方法的使用
Jul 21 Python
Python实现字符串逆序输出功能示例
Jun 24 Python
Python编程之string相关操作实例详解
Jul 22 Python
hmac模块生成加入了密钥的消息摘要详解
Jan 11 Python
破解安装Pycharm的方法
Oct 19 Python
Python中的字符串切片(截取字符串)的详解
May 15 Python
解决Django连接db遇到的问题
Aug 29 Python
Python 从attribute到property详解
Mar 05 Python
Python基于内置函数type创建新类型
Oct 22 Python
OpenCV-Python模板匹配人眼的实例
Jun 08 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_multisort函数 对数据库结果进行复杂排序
2013/06/08 PHP
PHP+memcache实现消息队列案例分享
2014/05/21 PHP
PHP实现GIF图片验证码
2015/11/04 PHP
基于php实现七牛抓取远程图片
2015/12/01 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
2016/11/16 PHP
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
jquery对dom的操作常用方法整理
2013/06/25 Javascript
JS OffsetParent属性深入解析
2014/01/13 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
2015/11/16 Javascript
原生JavaScript编写canvas版的连连看游戏
2016/05/29 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
详解vue-loader在项目中是如何配置的
2018/06/04 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
python3学生名片管理v2.0版
2018/11/29 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
StubHub中国:购买和出售全球活动门票
2020/01/01 全球购物
年级组长自我鉴定
2014/02/22 职场文书
电大毕业生自我鉴定
2014/04/10 职场文书
2014年师德师风自我剖析材料
2014/09/27 职场文书
整改报告格式
2014/11/06 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
MySQL Server 层四个日志
2022/03/31 MySQL
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS