文章目录
- 说明:
- 我的配置:
- 目标网站:
- 今天爬虫(手动提取url,发送get请求)
- 1、创建项目+初始化爬虫文件:
- 2、在setting中配置
- 3、修改items.py:
- 4、修改爬虫程序:spiders/scrapyd.py
- ①、scrapy.Request()
- ②、直接上我的代码:
- 5、管道处理(一般都在这里进行数据清洗和数据储存操作):pipelines.py
- 1、测试spider是什么:
- 2、保存到MongoDB数据库:
- 6、我刚学scrapy对itmes模块的一个疑问:
- 1、我改为item={}
- 2、我改为:item = ScrapydCnItem()
- 3、对比,得出我认为的结论:
今天主要学习一下翻页的功能,手动翻页的效果,前面的基础操作这里不不再依次讲解截图说明了,如果不太懂,可以参考我的上一篇scrapy博客:
http://lab.scrapyd.cn/ 因为这个网站是get,响应的页面就能找到下一页的url,我记得之前测试翻页是用的腾讯招聘网站,但是现在腾讯招聘的页面改成异步获取的json数据了,如果真的爬取,我觉得直接使用requests模块比较方便,如果用scrapy,可以直接把开始的start_urls列表换成一个异步url列表集,我感觉使用scrapy那样爬取多此一举了。
比如这样,url列表集:
不过这样的我不写,这样的和我的第一个博客没有什么区别,只不过初始化的url列表数量多了而已。
生成文件:
这里我们只要三维数据,需要三个字段即可。
①、scrapy.Request()
这个只是和之前比这多了一个翻页功能,这个scrapy.Request()
里面有俩个必须要传递的参数,一个是url,一个是返回的函数,这里的parse是本身的方法中,继续处理数据直至页面结束,可以自己写多个方法,根据项目和网站需要定义方法,和需要的返回方法中。
其中还有几个常用的参数:
scrapy.Request()中几个常用参数解释:
②、直接上我的代码:
1、测试spider是什么:
下面是我测试的方法,之前使用过name属性进行过对不同的数据进行清洗和储存。你也可以自己研究测试。
2、保存到MongoDB数据库:
代码:
打印出的页面显示:
数据MongoDB存入成功:
不知道刚学scrapy时有没有和我一样,有这样一个疑问,爬虫程序中,我不继承items中的ScrapydCnItem类,直接用一个字典代替,其实,我的理解,如果不涉及过的爬虫数据类型保存,是一样的,但是如果涉及过多的类型数据保存,会影响数据的混乱保存。比如进入管道中的,一个程序中,我就有好几种数据分别保存到不同的数据库,这时,继承items中的dict数据进入管道pipelines.py就可以用
isinstance(item,ScrapydCnItem)
返回的是True和False,进行保存自己需要的数据类型,到对应的需求数据库中。
scrapy.Item进入源文件是继承一个dict类:
scrapy.Field() 进入源文件也是继承一个dict
爬虫文件中,我测试发现定义一个字典返回的管道数据中储存,结果和定义的items的类ScrapydCnItem最后进入管道的结果是一样的,但是类型不一样,最后我找到一个可以理解这定义这个items中ScrapydCnItem类dict的原因:
1、我改为item={}
爬虫spider/scrapyd.py中,改为item = {}:
pipelines.py中打印到处item类型,和print(“isinstance”,isinstance(item,ScrapydCnItem))
其中这个ScrapydCnItem类,是items.py中的目标数据字段的类。
from scrapyd_cn.items import ScrapydCnItem
上面的打印结果:
2、我改为:item = ScrapydCnItem()
爬虫spider/scrapyd.py中
pipelines.py中,用来打印出我的疑问
打印出管道中的结果:
3、对比,得出我认为的结论:
通过上面俩个打印出的结论,我也就自己给出了我的疑问答案,那就是,items的文件,在爬虫程序中继承过来的字段类型,看着是字典,但是可以根据这个进行不同的数据类型(根据继续的items中的类来体现),根据isinstance(item,ScrapydCnItem),ScrapydCnItem要改为你实际需求的数据类名,进行不同数据类型分开保存。
这也就是我自己对这个items中的定义目标数据字段的理解。