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在校内发人人网状态(人人网看状态)
Feb 19 Python
python中根据字符串调用函数的实现方法
Jun 12 Python
详解python发送各类邮件的主要方法
Dec 22 Python
Python中的浮点数原理与运算分析
Oct 12 Python
基于Python os模块常用命令介绍
Nov 03 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
Nov 07 Python
Python中shapefile转换geojson的示例
Jan 03 Python
python中pip的使用和修改下载源的方法
Jul 08 Python
python学生管理系统的实现
Apr 05 Python
python自动提取文本中的时间(包含中文日期)
Aug 31 Python
Python中的流程控制详解
Feb 18 Python
python中tkinter复选框使用操作
Nov 11 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
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
php include类文件超时问题处理
2015/02/06 PHP
ThinkPHP3.2.3实现分页的方法详解
2016/06/03 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
在Javascript中定义对象类别
2006/12/22 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之二
2011/12/31 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
Vue.js项目部署到服务器的详细步骤
2017/07/17 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
Angular 组件之间的交互的示例代码
2018/03/24 Javascript
微信小程序自定义prompt组件步骤详解
2018/06/12 Javascript
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
Python写的创建文件夹自定义函数mkdir()
2014/08/25 Python
初学Python函数的笔记整理
2015/04/07 Python
Python使用tkinter库实现文本显示用户输入功能示例
2018/05/30 Python
Python爬虫之urllib基础用法教程
2019/10/12 Python
Pytorch之Variable的用法
2019/12/31 Python
Python 实现一个简单的web服务器
2021/01/03 Python
从零实现一个自定义html5播放器的示例代码
2017/08/01 HTML / CSS
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
腾讯公司的一个sql题
2013/01/22 面试题
个人自我鉴定怎么写
2013/10/28 职场文书
公司总经理工作职责管理办法
2014/02/28 职场文书
高级工程师英文求职信
2014/03/19 职场文书
幼儿园亲子活动总结
2014/04/26 职场文书
奥巴马当选演讲稿
2014/09/10 职场文书
教师自我剖析材料(四风问题)
2014/09/30 职场文书
社区文明倡议书
2015/04/28 职场文书
2015年教师学期工作总结
2015/04/30 职场文书
工作经历证明范本
2015/06/15 职场文书
学生会招新宣传语
2015/07/13 职场文书
证婚人致辞精选
2015/07/28 职场文书