2020/04/12 03-代理豆瓣图书爬虫

在这里插入图片描述
用另外的模板试试,大部分查的数据都是越多越好,不仅仅是拿到标题,比如电影,查找7分以上的电影有哪些。可以把详情页的url拿到,构造成request放到scheduler,要对电影的详情页做分析,比如对热点新闻做分析。
比如书的好评很多,但是不知道好在哪里,就可以分析评论里出现的重点词汇,才知道好在哪里

在这里插入图片描述
如何scrapay提供的另外模板,提取这里的链接,刚才是手动的建立链接,来构造request开始爬取的
在这里插入图片描述
再创建一个项目
在这里插入图片描述
这里就多了一个项目,blog12是项目根目录。mspider就是项目包目录

在这里插入图片描述
先修改settings,不遵从协议,否在会下载这个网站的robots协议,下载之后如果你发起的链接,如果是符合你协议里禁止的,就不去爬取 了
在这里插入图片描述
修改user-agent
在这里插入图片描述
网站如果发现你短时间内同一个ip频繁去链接,而且是一下子发送这么多并发链接,就要考虑是否把你禁止掉了,所以这里暂时不加
在这里插入图片描述
不用cookie

在这里插入图片描述
这两项其实可以测试的时候先配置,比如限制浏览器一共发送给5个,模拟浏览器3,4个都没什么问题,当你下载网页的时候碰到css,script,图片。其实就是发送新的请求
在这里插入图片描述
首先把item两个写一下,这样item写好了
在这里插入图片描述
下面写spider,指定crawl模板,book爬虫名字,再douban。com域里
在这里插入图片描述
这次跟上次不一样了,以前基于scrapy。spider,现在是crawlspider
在这里插入图片描述
crawlspider是基于spider的
在这里插入图片描述
spider是scrapy下的spider
在这里插入图片描述

crawlspider就是spider的子类,spider的名称,域,start_url是少不了的
在这里插入图片描述
看一下parse_item

在这里插入图片描述
父类里有个parse,没看到parse_item
在这里插入图片描述
之前的book,这个paese是父类spider里有的,有的就是在做overwrite

在这里插入图片描述
crawlspider里重写了parse方法
在这里插入图片描述
这个类机车给自spider,没有parse_item,但是有parse,父类没实现,子类来实现
在这里插入图片描述
bookspider相当于孙子类,可以不写parse,因为crawlspider已经继承了,有了parse

这个是callback回调,这是一个规则
在这里插入图片描述
这是一个规则,叫链接提取器,它只关心a标签,a标签叫链接,他去访问a标签,然后把a标签抽取出来,会把链接中的href属性抽取出来,抽取处理会将这个东西扔给scheduler,但是之前要封装成request,然后request被调度到downloader,由downloader下载后由response,response谁来解析,就是callback。这个callback的意思是,你抽取出来的链接,下载完之后,内容谁来解析的回调,其实是下载后的内容解析回调函数
在这里插入图片描述
就是前面这个链接一旦去下载后生成的response,这个response交给callback来管理
在这里插入图片描述
follow指的是,这个链接下载完之后,链接对应的页面被下载了,这里面的链接要不要再次提取,follow,如果是false就是当前页面再也不提取了
在这里插入图片描述

这是来定义这个规则的,你要抽取谁,抽取之后下载的内容要回调,你面的链接继续跟踪
在这里插入图片描述
这个方法是上一部分内容下载后的内容的回调,这个模板跟之前的模板的工作方式完全不同
在这里插入图片描述
**这个response还是scrapy.http.response只不过为了方便加了html。其实就是htmlresponse
**
在这里插入图片描述
这个东西不是parse,parse是父类的方法
在这里插入图片描述
这边可以随便写,但是左边不可以 随便写
在这里插入图片描述
在这里插入图片描述
这样就是在页面里不抽取链接了,以后就没什么可以链接了,就不会调用回调函数,现在相当于没有抽取任何链接,既然没有链接,就不存在链接被下载封装回调的事情
在这里插入图片描述
在这里插入图片描述
现在的配置文件时mspider的,不会到firstpro里去在这里插入图片描述
来试试,list由谁的名字就可以去爬谁
在这里插入图片描述
这个链接就是start_url

在这里插入图片描述
200代表response来了,但是紧接着close掉了,因为现在是无事可做,准备抽取链接,但是你的规则是空的,没写就是没事干,不会抽取url,也就不会调用回调函数
在这里插入图片描述
在这里插入图片描述
爬虫跑起来,start没什么说的,爬取下来没有做事情,不parse,现在是把整个处理方式改变了,但是这一页拿来了,分析链接,结果一个链接没有
在这里插入图片描述
从response中的a标签提取href,如果href符合正则表达式,就会提取出合格的url,并且将这个url再次封装成request对象,放在scheduler中,然后由scheduler放到downloader,然后由downloader拿到response回来,再调用parse_item
在这里插入图片描述
改成false,避免封
在这里插入图片描述
开4个,做一下延迟

在这里插入图片描述
在这里插入图片描述
重新运行一下
在这里插入图片描述
依然什么都没做
在这里插入图片描述

是因为这个正则表达式,里面没有链接
在这里插入图片描述
现在这么写
在这里插入图片描述
现在就有效果了

在这里插入图片描述
它就会分析所有带这个东西的
在这里插入图片描述2太慢了,改成1
在这里插入图片描述
运行一下
在这里插入图片描述
看现在的链接是否你想要的
在这里插入图片描述
说明当前的response访问的是

在这里插入图片描述
response.url是这一页
在这里插入图片描述
对起始页提取到的所有的符合外面条件的链接都过了一把,都分别做了请求,,拿到了他们的内容,才能把url打出来
在这里插入图片描述
**首页只对链接做了提取,并且将符合的链接扔到了scheduler,由scheduler跑到下载器downloader,由下载器分别下载,一旦response则调用parse_item回调函数。
**在这里插入图片描述
response里面现在会帮你自动 抽取链接,现在可以给需要一个parse函数,新的链接靠这个来解决即可
在这里插入图片描述
只要match返回true就封装到scheduler
在这里插入图片描述
首页既分析了内容,又抽取了链接,然后抽取链接到第二页,又把首页的链接取回来了,但是现在,第一页就不分析内容,第一页就是抽取起始链接,抽取链接就是分别下载,然后调用回调,如果要跟踪继续跟踪,不跟踪就拉倒
在这里插入图片描述
尤其是多页处理可能更愿意用模版
在这里插入图片描述
bookitem没有需要重写

在这里插入图片描述
重写下bookitem

在这里插入图片描述
导入bookitem

在这里插入图片描述
该怎么分析还是怎么分析,主要是链接不用管了

在这里插入图片描述
现在要存储下来,用custom_settings看看有没有,点击crawlspider查看源码
在这里插入图片描述
在这里插入图片描述
如果没有就给一个空字典

在这里插入图片描述
这样就写成字典,临时的配置可以在这里写
在这里插入图片描述
把pipeline的东西复制一下

在这里插入图片描述
照抄一下
在这里插入图片描述
这些spider都将item打个引擎,引擎一看是item就转发给了item pipeline,这里的itempipeline实际上是不知道是哪个spider的,spider有抓取的不同域名
在这里插入图片描述
如果有多个spider是要区分一下,不同的spider要做区分
在这里插入图片描述
根据当前spider的名称来判断是否能使用这边的代码,在这里必须有文件名
在这里插入图片描述
把这里替换掉就可以做处理了

在这里插入图片描述
可以打印看一下它是谁

在这里插入图片描述、是打开spider的函数,跟pipeline初始化无关,所有spider的数据都会经过它,就可以通过spider的一些名称和特殊的值,然后自己来决定如何处理
在这里插入图片描述

打开mspider的settings把pipeline打开
在这里插入图片描述
最后通过settings把filename也可以拿到

在这里插入图片描述
爬完没什么可爬的就停止了

在这里插入图片描述
在这里插入图片描述
爬了8页,就是160个

在这里插入图片描述
这里依然yield,回调函数其实是会被包裹住的,最后还是走parse,直接yield向后扔,扔给engine,engine一看是item就甩到item pipeline里了
在这里插入图片描述
最终得到这个文件

在这里插入图片描述
这里的字符是unicode字符,不是utf-8的,这些数据加载进来直接变中文了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一开始测试要把并发和链接时长控制下,要看item就可以用表达式就可以看到里面内容了,数据真正用的时候要用dict包一下
在这里插入图片描述
可以看一下crawl模版
在这里插入图片描述
是对链接的抽取做了规则,怎么去处理就需要靠回调,里面数据是否要再跟踪
在这里插入图片描述
这个parse是父类里还有,不要轻易使用这个名字,你使用了就改变了数据的流向方式,链接不需要你处理,在rules里写即可

在这里插入图片描述
这里 的rate可能没得分,最后是有点问题
在这里插入图片描述
可以改成这样,这样吧数据抽取出来,返回的是列表()前面会的是selectorlist),if rate就是判断里面有没有元素,如果没有评分,这里就是空列表了
在这里插入图片描述
没数据就给个0,这个列表所有数据都是文本的,字符串,有数据就取一个元素相当于extract_first
在这里插入图片描述
爬取流程,会先发起链接start_urls,只会把response里的内容,按照规则抽取里面的链接,对这些链接封装之后放到scheduler,最后放在下载器里下载,下载之后得到的请求,第一批链接但凡有一个连接response回来,下面就要执行回调
在这里插入图片描述
在回调中,response对象就可以进行处理了,分析出我们要的数据,最后yield出去

在这里插入图片描述
一旦改成true,就需要反爬了
在这里插入图片描述
这里其实就是告诉你不允许爬了,当你爬取太多,再次登录的时候,你的账号可能就被封了,我们可以用换ip代理
在这里插入图片描述
最好由中间件交给代理发起请求,封的也是代理ip不是你自己的ip,就是去往downloader的路上给request请求进行处理

在这里插入图片描述
看下中间件,downloader中间件有这么多,
在这里插入图片描述
不但能处理请求还能处理downloader响应
在这里插入图片描述
现在修改request
在这里插入图片描述
复制一下

在这里插入图片描述
复制到下面改一下名字

在这里插入图片描述
在这里插入图片描述
在设置里照着写
在这里插入图片描述
downloader发起请求经过proxy,由proxy去访问即可

在这里插入图片描述
修改所有请求全部走代理
在这里插入图片描述
可以return好结果值,rerurn none相当于继续处理这个请求,相当于现有流程不变化,穿透当前的中间件继续向后走,如果之后的中间件都可以穿透,就可以走downloader了
request的意思 是(返回request相当于半路改变了request,把这个request重新走一遍

在这里插入图片描述

现在写了return request对象,直接从中间件回头再来一遍,如果都允许,再downloader,如果再这里return一个request对象,则重新开始,对这个request对象,重新爬取。
你自己封装的request是什么,再走一遍中间件,再来访问downloader,可能里面的url变了,以前访问a,现在可能访问b

在这里插入图片描述
看一下官方文档
在这里插入图片描述
如果是一个response,将不再调用其他的request,或者是异常处理的方法,直接交给downloader函数
在这里插入图片描述
它这里直接不处理,交给downloader,downloader看到response都有了,就直接交给parse方法,就把这个response直接解析了
在这里插入图片描述
重新写个spider测试
在这里插入图片描述
访问get就做这一件事情

在这里插入图片描述
再在中间件里写一个
在这里插入图片描述
加到配置文件里,在上面的后面
在这里插入图片描述
导入一个response
在这里插入图片描述
response有了,是所有中间件的process_request就不管了
在这里插入图片描述

相当于在中间件的时候就构造出一个response
在这里插入图片描述
在请求阶段就告诉response,然后看after如何处理
在这里插入图片描述
运行一下

在这里插入图片描述
把pipeline关掉

在这里插入图片描述
再次运行

在这里插入图片描述
现在就看不到after
在这里插入图片描述
会把after和处理异常的方法绕过

在这里插入图片描述
测试返回response怎么走就在前面加before中间件,就知道怎么走的
在这里插入图片描述

中间件就这么写,把after删除
在这里插入图片描述
spider中间件也是这么测试

在这里插入图片描述
这里有个免费代理,每天20个
用户名密码

在这里插入图片描述

在这里插入图片描述
生成链接后

在这里插入图片描述
点击打开链接
在这里插入图片描述
能用的就这么多
在这里插入图片描述
复制一个试试
在这里插入图片描述
写好代理
在这里插入图片描述
每发起一个请求就从ip里随便拿一个
在这里插入图片描述
这里是从scheduler拿到就是request请求,所以就是scrapy.http.request的Request类,下面所谓的错误会调用异常处理,很少用
在这里插入图片描述
这是相当于把请求头改了
在这里插入图片描述
如果代理成功访问这个网站的时候,ip就是代理的

在这里插入图片描述
在这里插入图片描述
修改下之前的text直接用

在这里插入图片描述
只保留这个中间件

在这里插入图片描述
这里是选一个代理,然后在meta里加入头,把i请求给代理,由代理请求目标地址
在这里插入图片描述
如果家里被封 了,就重启一下路由器在这里插入图片描述

在这里插入图片描述
好像不能用

在这里插入图片描述
在这里插入图片描述
重新打开一次就换掉了
在这里插入图片描述
修改地址

在这里插入图片描述
中间件return none,IP如果5分钟过期,你就再取刷新一次

在这里插入图片描述在这里插入图片描述
打印一下日志,是因为没有认证,proxy是谁不认识,所以我们需要把自己的ip放到白名单里去

在这里插入图片描述
把自己的ip放到白名单

在这里插入图片描述
在这里插入图片描述
再次生成一个链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行一下

在这里插入图片描述
这个代理可能有点问题,换一下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样就ok了
在这里插入图片描述
我们到时候就自己做一个ip列表,下一次随便挑一个
在这里插入图片描述
用了代理。这里就可以大胆改成true
在这里插入图片描述
数据写出去把book名字修改一下
在这里插入图片描述
settings里把并发和延迟时间注释掉,但是合适一点
在这里插入图片描述
启用pipeline存一下

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
50页
在这里插入图片描述
可以在item-pipeline可以写第一层做一些过滤,第二层mysql,第三层打入redis
在这里插入图片描述
第一个反爬策略就是伪造自己的useragent
第二个尽量模拟人为操作
第三个使用代理,ip池

在这里插入图片描述
你一个操作一群proxy,都可以链接那个网站,网站是很难处理的

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

用户名密码

在这里插入图片描述
**这个spider,起始ip只提取url,新的url放到爬取队列里,爬取队列可以去重,可以导出url去downloader,去下载,经过中间件可以改代理,这样发起请求response之后才可以调用回调,就会把第一次爬过来的数据,挨个做解析,如果写了follow=tRUE,就会将你返回的新页面再去抽取url,再去放到待爬取队列里,也会去重,当待爬取队列没有可爬的就可以停止了
**

在这里插入图片描述

发布了243 篇原创文章 · 获赞 6 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_42227818/article/details/105475385