本篇是基础爬虫专栏的最后一篇文章,有关进阶爬虫技术的内容现已开始更新,但不会每一篇都会在此处发布,有需要的可直接加群了解,废话不多说,直接进入今天的文章内容。
增量式爬虫
基本定义:增量式爬虫就是一个能够在网站原有数据的基础上采集最新公开的一些数据,即实时采集网站中最新数据的爬虫程序则称之为增量式爬虫。
应用场景:增量式爬虫的应用场景大多是在于采集评论、实时天气、实时票房等。
那么在实现增量式爬虫的时候有哪些工作是需要我们做的呢?
1.请求前关于URL的判断,判断当前请求的url是否被请求过
2.解析后的判断,解析内容后判断该内容是否被采集过
3.在保存时判断,判断当前提取的数据是否在存储媒介中存在。
那么从上述三个点来看,对于增量式爬虫的核心任务就有了一定的猜想,其核心任务就是——去重
去重的方式我们可以通过redis中的集合来实现,这样在任何时间请求的时候就能从redis中去进行判断,如果存储与python本身的数据类型的话如果程序因为意外中断,那么就会导致数据紊乱的情况。实现大致思路如下:
将爬取过程中产生的URL进行存储,存入到redis中的set中,当下次再爬取的时候,对在存储的URL中的set
中进行判断,如果URL存在则不发起请求,否则就发起请求
对爬取到的网站内容进行唯一的标识,然后将该唯一标识存储到redis的set中,当下次再爬取数据的时候,
在进行持久化存储之前,要判断该数据的唯一标识在不在redis中的set中,如果在,则不在进行存储,否则
就存储该内容
import scrapy
from redis import Redis
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from hashlib import md5
class Myspider01Spider(CrawlSpider):
name = 'myspider01'
# allowed_domains = ['xxx.com']
start_urls = ['https://sc.chinaz.com/tupian/meinvxiezhen.html']
rules = (
Rule(LinkExtractor(allow=r'meinvxiezhen.html'), callback='parse_item',
follow=True),
)
conn = Redis(host='127.0.0.1', port=6379) # 实例化redis的连接对象,即连接到redis
def parse_item(self, response):
img_urls = response.xpath('//*
[@id="container"]/div/div[1]/a/img/@src2').extract()
for img_url in img_urls:
hash_data = md5(('https:'+img_url).encode()).hexdigest()
ex = self.conn.sadd('img_urls', hash_data) # 在redis中添加集合类型的数
据,键为img_urls
if ex:
print('该条数据未被爬取,现已保存!!')
yield scrapy.Request('https:'+img_url, callback=self.parse_img)
else:
print('该条数据已经被爬取过,请勿重新获取!')
def parse_img(self, response):
img = response.body # 在scrapy中使用body属性来获取字节类型的数据等同于
requests中的content
# 但是要注意,scrapy中response没有content属性,要获取字节,只能通过body
with open('1.jpg', 'wb')as f:
f.write(img)
Scrapy中post请求的发送
在scrapy中发送post请求有两种方式,如下
重写start_requests方法
scrapy中默认情况下都是发送get请求,如果需要发起post请求的话需要重写start_requests()方法,如 下:
import scrapy
class FySpider(scrapy.Spider):
name = 'fy'
# allowed_domains = ['www.baidu.com']
start_urls = ['https://fanyi.baidu.com/sug']
def start_requests(self):
data={
'kw':"beautiful"
}
for url in self.start_urls:
yield scrapy.FormRequest(url=url,formdata=data,callback=self.parse)
def parse(self, response):
print(response.text)
手动请求
scrapy.FormRequest(url=url,formdata=data,callback=self.parse)
或
scrapy.Request(url, body=json.dumps(payload), method='POST', headers={'Content-Type': 'application/json'},)
小结
关于基础爬虫专栏目前更新至此就暂时告一段落,中间由于个人私事停更了不短时间,不过好在最近加更,几乎都是维持在一天一更也算是更新完成,其中有文章获得了优质推荐也有文章写得不是很理想,但是在这里我想说的是目前个人的所有文章都是免费的,不会花费各位一分钱就可以随便阅读,但是由于前两天共享的一段代码导致本人遭到某些无良机构的言语暴力相向,只因本人的内容碰到了他们的蛋糕,如果说大家有了解过的人都知道,无良机构的爬虫课程内容不过也就如此了,有些东西讲的甚至不如文章中所写,而且我的文章是本平台、ZH、VX公众号同步更新,所以能找到我文章的渠道也是很多,至于那些无良机构的暴力言语,本人会依法进行追究,大家也能够看到的是文章所有的内容皆是原创,每一篇文章都是亲自一字一字敲写,所以并不涉及侵犯了哪家无良机构的版权,如果硬要说本人侵犯了你们的版权的话,那么请你们先拿到你们课程中讲解的案例的网站的版权再来声讨本人文章中侵犯了你们无良机构版权的问题。最后说一下,现星球专栏已开启,新开专栏目前为12日24时前限时免费加入,并且新开期间有邀请活动,最高可白嫖本人4年星球,有兴趣的朋友可以加群关注一下。后续会继续开设基础语法专栏,同样是系统化文章,内容一样干货慢慢。
关于基础爬虫专栏目前的内容其实是有遗漏的,专栏中只是针对于0基础入门爬虫的朋友进行介绍,所以今后对于专栏中部分内容的补充同样也会慢慢发表更新!!!最后,欢迎大家加入群聊共同探讨爬虫技术!