零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.py

pipelines.py是项目的管道文件

管道文件:

当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。

每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。以下是item pipeline的一些典型应用:

1.验证爬取的数据(检查item包含某些字段),如果有做相应处理

2.查重(并丢弃),在init方法里创建一个集合,每个数据存到集合里面,如果集合里有这个数据就可以不往里面写了,管道就是一个个接收item的,所以可以做去重处理,url请求去重是在调度器实现,数据去重在管道实现。

3.将爬取结果保存到数据库中

pipelines.py

settings.py是项目的设置文件.

settings.py(1)


settings.py(2)


官网教程管道实例


Rules的一些说明:

rules: 是Rule对象的集合,用于匹配目标网站并排除干扰

parse_start_url: 用于爬取起始响应,必须要返回ItemRequest中的一个。

因为rulesRule对象的集合,所以这里也要介绍一下Rule。它有几个参数:link_extractorcallback=Nonecb_kwargs=Nonefollow=Noneprocess_links=Noneprocess_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的下拉框向上移了一下......原来与这个代码不兼容的,是我的智商。

参考:

[Python]MySQLdb for Python使用指南/Python的数据库操作

推荐阅读更多精彩内容