零Python基础scrapy爬虫踩坑记
因为想要获取一些关于古诗词的数据,但并没有找到满意的数据库文件,所以就想通过爬虫来获取,十分苦闷的是,对于Python爬虫,之前从来没有接触过,还好在git上找到了代码:GushiwenSpider ,感激之情无以言表,然而尴尬的是,源码就在手上,愣是运行的一塌糊涂。
为了做现在的项目,所以电脑里有Python2.7,就没有安装最新版,先是安装了pip,修改了环境变量,项目以scrapy开源框架,所以需要安装scrapy。
但实际情况是,并不能自动下载所需要的whl文件,所以在下载某个包出错的时候,可以用一个非常有用的网址:Unofficial Windows Binaries for Python Extension Packages
把需要的whl文件手动下载安装。
部署好后做一下测验:scrapy shell .......
scrapy测试项目里面还用到了scrapy_redis,scrapy-redis的原理是巧妙的利用redis队列,实现 request queue和 items queue,利用redis的 set实现request的去重,将scrapy从单台机器扩展多台机器,实现较大规模的爬虫集群。
安装Redis,然后切换目录到C:\redis运行
redis-server.exe redis.windows.conf
运行redis这时候另启一个cmd窗口,原来的不要关闭,不然就无法访问服务端了。
切换到redis目录下运行redis-cli.exe -h 127.0.0.1 -p 6379。
测试:
设置键值对set myKey abc
取出键值对get myKey
测试redis用scrapy crawl ...... 启动项目
用scrapy check检测爬虫是否正常
运行然而也不知道是因为爬虫项目运行的不正确还是redis不正确,其他几个爬虫文件并不能爬到数据,于是进度开始停滞不前。
在网上找了关于爬虫的视频教程,准备学习一下原理:
手头并没有其他的爬虫项目,于是就拿这个古诗词的爬虫项目解析了,望编写这个项目的大佬见谅,再次表达感激之情。
items.py是项目的目标文件
Item是保存爬取到的数据的容器;其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。
item.pypipelines.py是项目的管道文件
管道文件:
当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。
每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。以下是item pipeline的一些典型应用:
1.验证爬取的数据(检查item包含某些字段),如果有做相应处理
2.查重(并丢弃),在init方法里创建一个集合,每个数据存到集合里面,如果集合里有这个数据就可以不往里面写了,管道就是一个个接收item的,所以可以做去重处理,url请求去重是在调度器实现,数据去重在管道实现。
3.将爬取结果保存到数据库中
pipelines.pysettings.py是项目的设置文件.
settings.py(1) settings.py(2) 官网教程管道实例Rules的一些说明:
rules: 是Rule对象的集合,用于匹配目标网站并排除干扰
parse_start_url: 用于爬取起始响应,必须要返回Item,Request中的一个。
因为rules是Rule对象的集合,所以这里也要介绍一下Rule。它有几个参数:link_extractor、callback=None、cb_kwargs=None、follow=None、process_links=None、process_request=None
其中的link_extractor既可以自己定义,也可以使用已有LinkExtractor类,主要参数为:
allow:满足括号中“正则表达式”的值会被提取,如果为空,则全部匹配。
deny:与这个正则表达式(或正则表达式列表)不匹配的URL一定不提取。
allow_domains:会被提取的链接的domains。
deny_domains:一定不会被提取链接的domains。
restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接。还有一个类似的restrict_css
Item Loader一些补充:
Item Loaders提供了一种便捷的方式填充抓取到的 Items 。从另一方面来说, Items 提供保存抓取数据的容器, 而 Item Loaders提供的是填充容器的机制。
要使用Item Loader, 你必须先将它实例化. 可以使用类似字典的对象来进行实例化, 或者不使用对象也可以, 当不用对象进行实例化的时候,Item会自动使用 ItemLoader.default_item_class 属性中指定的Item 类在Item Loader constructor中实例化.
add_xpath
name 字段被从页面中两个不同的XPath位置提取:
1.//div[@class="product_name"]
2.//div[@class="product_title"]
换言之,数据通过用add_xpath()的方法,把从两个不同的XPath位置提取的数据收集起来. 这是将在以后分配给name字段中的数据。
最终, 当所有数据被收集起来之后, 调用ItemLoader.load_item()方法, 实际上填充并且返回了之前通过调用add_xpath(),add_css(),and add_value()所提取和收集到的数据的Item.
直到刚才,我终于找出了我运行不出结果的原因,这半个月以来,我一直以为,项目里给的数据库表结构长成如下的样子:
这使我百思不得其解,然而我只是觉得其中的玄妙并不是我等凡人所能领会的,照做就可以了,一直觉得是运行不出是代码的某部分可能与Windows或Python2.7不兼容之类的导致,直到刚才某一刹那,我把excel的下拉框向上移了一下......原来与这个代码不兼容的,是我的智商。
参考: