笔者最近在学习爬虫框架Scrapy,发现Scrapy的Pipeline自带一个图片下载器,便想能否自己实战爬取虎扑爆照区的照片

首先是页面分析
今天我们爬取的网页是https://bbs.hupu.com/selfie
我们使用谷歌开发者工具选中一个链接,分析一下当前页面的html代码

从中我们要提取这个带有数字的html,并将他与我们的网址合并,就是每个帖子的html

所以我们可以写如下的css提取代码

css("div.titlelink>a::attr(href)")

再点击进入每个帖子
我们选中帖子里带有照片的部分

点击里面对应的链接就是图片的地址
所以我们根据这个写一个css提取代码

css('div.quote-content p img::attr(src)')

最后我们的思路大概是这样子的,先爬取首页每个帖子的html页面,再进入每个帖子页面提取图片地址并进行下载

至此我们分析结束,开始常规的创建scrapy项目

scrapy startproject hupu_image bbs.hupu.com
scrapy genspider hupu

先定义我们的Item类
找到items.py

import scrapy
class HupuImageItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()image_urls = scrapy.Field()image_path = scrapy.Field()

编写爬虫的主体部分

import scrapy
from ..items import HupuImageItemclass HupuSpider(scrapy.Spider):name = 'hupu'allowed_domains = ['bbs.hupu.com']start_urls = ['https://bbs.hupu.com/selfie/']def parse(self, response):# 因为虎扑的标题里面的a节点可能还有别的链接,所以我们只选中titlelink的直接a节点href = response.css("div.titlelink>a::attr(href)").extract()for link in href:url = response.urljoin(link)yield scrapy.Request(url, callback=self.parse_hupu)def parse_hupu(self, response):img_srcs = response.css('div.quote-content p img::attr(src)').extract()# imagePipeline要以列表形式传入urlfor img_src in img_srcs:HupuPic = HupuImageItem()HupuPic['image_urls'] = img_srcyield HupuPic

我这里是直接使用extract()方法提取出链接列表,所以我后面使用for循环加入到Request请求队列

然后编写Pipeline
我们这里为了更好的交互,我查阅了一些资料和书籍,重写了ImagesPipeline类

import scrapy
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline
class HupuImagePipeline(object):def process_item(self, item, spider):return itemclass PicsDownloadPipeline(ImagesPipeline):def get_media_requests(self, item, info):yield scrapy.Request(item['image_urls'])def item_completed(self, results, item, info):# 将下载的图片路径(传入到results中)存储到 image_paths 项目组中,如果其中没有图片,我们将丢弃项目:image_path = [x['path'] for ok, x in results if ok]if not image_path:raise DropItem("Item contains no images")item['image_path'] = image_pathreturn item

主要我们是重写这get_media_requests和item_completed方法

第一个方法就很简单,我们刚刚抓取到的图片url都存入到item里的image_urls字段,这一段话就是加入到scrapy的Request请求队列

第二个方法就是对下载图片的一些判定,判断我们是否下载到了图片

最后我们修改一下settings.py里的设置

from scrapy.pipelines.images import ImagesPipeline
BOT_NAME = 'hupu_image'SPIDER_MODULES = ['hupu_image.spiders']
NEWSPIDER_MODULE = 'hupu_image.spiders'# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'hupu_image (+http://www.yourdomain.com)'# Obey robots.txt rules
ROBOTSTXT_OBEY = FalseUSER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' \'Chrome/75.0.3770.100 Safari/537.36'ITEM_PIPELINES = {'hupu_image.pipelines.PicsDownloadPipeline':300,
}
# 这里是我们图片存储的目录
IMAGES_STORE = "hupu_imagesss"

这里没什么特别的,就是启用了下载图片这个Pipeline和重新定义了下USER_AGENT。如果你想要更好点的反爬效果,可以使用多个USER_AGENT,每次请求网页的时候从中随机选取一个

使用fake外部包来实现自动切换UserAgent

自定义UserAgent有一个缺点,就是浏览器的版本很多、平台也很多,有些会淘汰、新的一直在升级。所以用这个的话还得自己长期维护版本号。所以可以用网上的fake-useragent包,它有github网友维护,我拿来安装后根据代码提示,集成到scrapy即可。
首先 安装fake-useragent包,然后到middleware.py中新增代码:

from fake_useragent import UserAgentclass RandomUserAgentMiddleware(object):"""自定义下载中间件 以达到每次请求都会随机切换user-agent的目的通过安装fake-useragent包,来获取浏览器版本号为了增强可选择性,比如选择随机ie或者随机firefox浏览器的版本号,所以增加了ua_type和get_ua的一些代码"""def __init__(self, crawler):super(RandomUserAgentMiddleware, self).__init__()self.ua = UserAgent()# 从settings.py中读取RANDOM_UA_TYPE配置 如果没有则默认值为random  达到可配置的目的# 默认是random随机选择,但是可以在配置指定ie或者firefox、chrome等浏览器的不同版本self.ua_type = crawler.settings.get("RANDOM_UA_TYPE", "random")@classmethoddef from_crawler(cls, crawler):return cls(crawler)def process_request(self, request, spider):def get_ua():"""函数中的函数 闭包读取上面的ua_type设置 让process_request直接调用本get_ua"""return getattr(self.ua, self.ua_type)request.headers.setdefault('User-Agent', get_ua())

在settings里添加

RANDOM_UA_TYPE = "random"
DOWNLOADER_MIDDLEWARES = {'jobbolecvs.middlewares.RandomUserAgentMiddleware': 543,'scrapy.downloadermiddleware.useragent.UserAgentMiddleware':None,
}

由于Scrapy是并行化爬取,所以爬取速度很快,但是爬取速度过快可能导致被封,这里我们可以添加一些自动限速的功能

在settings.py添加AutoThrottle字段

# 启用AutoThrottle扩展
AUTOTHROTTLE_ENABLED = True
# 初始下载延迟(单位:秒)
AUTOTHROTTLE_START_DELAY = 5
# 在高延迟情况下最大的下载延迟(单位秒)
AUTOTHROTTLE_MAX_DELAY = 60
# 设置 Scrapy应该与远程网站并行发送的平均请求数, 目前是以1个并发请求数
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# 启用AutoThrottle调试模式
#AUTOTHROTTLE_DEBUG = False

至此我们整个爬虫已经完成啦,赶快scrapy crawl一下爬取小姐姐图片吧

使用Scrapy爬取虎扑爆照区的照片相关推荐

  1. scrapy框架爬取虎扑论坛球队新闻

    目录 Scrapy 框架 制作 Scrapy 爬虫 一共需要4步: Scrapy的安装介绍 Windows 安装方式 一. 新建项目(scrapy startproject) 二.明确目标(mySpi ...

  2. 爬取虎扑网站上NBA球员数据信息

    爬虫案例的一般步骤 1.确定url地址(网页分析)爬虫程序就完成了一半 2.发送网络请求 requests(js\html\css) 3.数据解析(筛选数据) 4.保存数据(本地文件\数据库) 本次爬 ...

  3. 爬取虎扑社区-晒晒照片

    爬取虎扑社区-晒晒照片 网上看到这个消息,顺便想试试手就做了这个 环境是MacOS + Anaconda (python 3.7) 就是练练手,网不好的时候会有bug 提示:类型错误Attribute ...

  4. 【Python爬虫】MongoDB爬虫实践:爬取虎扑论坛

    MongoDB爬虫实践:爬取虎扑论坛 网站地址为:https://bbs.hupu.com/bxj 1.网站分析 首先,定位网页上帖子名称.帖子链接.作者.作者链接.创建时间.回复数目.浏览数目.最后 ...

  5. python2爬取虎扑NBA的新闻标题和内容发送到QQ邮箱

    继之前分享了如何爬取虎扑新闻标题和内容,现在实现一下如何发送到QQ邮箱. 其实很简单啦,去自己的QQ邮箱账号设置里面开通一下SMTP.POP3啥的,然后生成一串只能你自己知道的授权码,使用这个授权码和 ...

  6. python爬取虎扑论坛帖子数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  7. python爬取论坛图片_[python爬虫] Selenium定向爬取虎扑篮球海量精美图片

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  8. python爬取虎扑评论_python爬虫系列Selenium定向爬取虎扑篮球图片详解

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  9. python爬虫爬取虎扑湖人论坛专区帖子数据,并存入MongoDB数据库中

    今天就带大家从头到尾一步一步带着大家爬取虎扑论坛帖子的数据,里面涉及到的一些知识,我会给出学习的连接,大家可以自行去学习查看. 前期准备 首先我们打开虎扑NBA论坛,我选择的是湖人专区(小湖迷一个). ...

最新文章

  1. XCode 学习技巧之 User Scripts
  2. php 检测网络,PHP+Ajax 检测网络是否正常实例详解
  3. 华为2018届校招技术岗笔试题及个人解答
  4. mysql-5.7.17-winx64的安装配置
  5. 《漫画算法》源码整理-5 排序算法
  6. oracle backup arch,一个数据库备份的例子
  7. 2016/8/18 Linux常用命令 :目录、文件处理命令
  8. 类UNIX操作系统家族发展时间线图谱(1969-2020)
  9. 即时通讯领域必将最终由XMPP协议一统天下
  10. stm32关于can线的双机通信实验
  11. 研报精选 | 2022中国消费零售行业趋势报告解读
  12. mac可装云服务器_Mac 下阿里云服务器的配置方法
  13. Pyhton opencv 图片裁剪
  14. C++课程总结——数论
  15. 成都超级计算机中心玻璃,成都超算中心首次亮相
  16. M102: MongoDB for DBAs chapter 1 introduction学习记录
  17. 如何用php创建一个文件怎么打开,PHP 文件(File)
  18. acwing每日一题(8.12 ~ 8.14)
  19. Onvif PTZ简介
  20. Cocos2D-Android- 基础

热门文章

  1. The new driver class is `com.mysql.cj.jdbc.Driver‘. The driver is automatically错误解决
  2. 昨天才提醒,今天就有网友点击QQ信息中的网址,中Worm Viking pk/Worm Win32 Viking jg了
  3. 太原理工大学软件学院信息安全课程设计DAY2
  4. Vue核心技术-5,列表渲染指令 v-for
  5. 堆(手写堆包含STL)
  6. 微分方程4_傅里叶级数
  7. android 双卡手机发短信/判断手机是否为双卡
  8. 手机万能充电器电路原理与维修
  9. 占满DIV剩余高度的三种方法
  10. DNS域名详细解析过程