第一个Scrapy爬虫(二)

新建工程

scrapy startproject tutorial

如果没有报错,则创建成功

在Mac下如果报这个错误:

1
2
3
4
5
6
7
8
9
10
11
12
  Traceback (most recent call last):
File "/usr/local/bin/scrapy", line 7, in <module>
from scrapy.cmdline import execute
File "/Library/Python/2.7/site-packages/scrapy/__init__.py", line 34, in <module>
from scrapy.spiders import Spider
File "/Library/Python/2.7/site-packages/scrapy/spiders/__init__.py", line 10, in <module>
from scrapy.http import Request
File "/Library/Python/2.7/site-packages/scrapy/http/__init__.py", line 12, in <module>
from scrapy.http.request.rpc import XmlRpcRequest
File "/Library/Python/2.7/site-packages/scrapy/http/request/rpc.py", line 7, in <module>
from six.moves import xmlrpc_client as xmlrpclib
ImportError: cannot import name xmlrpc_client

尝试

export PYTHONPATH=/Library/Python/2.7/site-packages:$PYTHONPATH

echo "export PYTHONPATH=/Library/Python/2.7/site-packages:$PYTHONPATH" >> ~/.bashrc

然后重新创建工程

该命令将会创建包含下列内容的 tutorial 目录:

1
2
3
4
5
6
7
8
9
10
tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...

这些文件分别是:

  • scrapy.cfg: 项目的配置文件
  • tutorial/: 该项目的python模块。之后您将在此加入代码。
  • tutorial/items.py: 项目中的item文件.
  • tutorial/pipelines.py: 项目中的pipelines文件.
  • tutorial/settings.py: 项目的设置文件.
  • tutorial/spiders/: 放置spider代码的目录.

创建爬虫

在tutorial/spiders下创建dmoz_spider.py,代码:

1
2
3
4
5
6
7
8
9
10
11
from scrapy.spider import Spider
class DmozSpider(Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response):
filename = response.url.split("/")[-2]
open(filename, 'wb').write(response.body)

上面的class中,参数说明如下:

  • name是Scrapy 识别的爬虫名字,一定要唯一。
  • allowed_domains 是域名白名单
  • start_urls 即种子url (如果没有定义其他Rule的话,也就是只抓取这几页)
  • parse()是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。

爬取数据

切换到tutorial目录,执行:

scrapy crawl dmoz

然后,发现目录下多了 Books 和 Resources 2个文件。

在执行上面的shell命令时,scrapy会创建一个scrapy.http.Request对象,将start_urls传递给它,抓取完毕后,回调parse函数。

刚才发生了什么?

Scrapy为Spider的 start_urls 属性中的每个URL创建了 scrapy.Request 对象,并将 parse 方法作为回调函数(callback)赋值给了Request。

Request对象经过调度,执行生成 scrapy.http.Response 对象并送回给spider parse() 方法。


参考Scrapy入门教程