在命令窗口执行下面命令快速生成满足特定模板的爬虫
scrapy genspider -t crawl ershou che168.com
-
-t crawl
:指定了要使用的模板类型为 "crawl"。Scrapy默认提供了几种常见的模板类型,如 "basic","crawl" 和 "csvfeed" 等,其中 "crawl" 是一种适用于需跟踪链接的网页爬虫的模板。 -
ershou
:这是你为爬虫选择的名字。在这个例子中,生成的爬虫名字会是 "ershou"。 -
che168.com
:这是你为爬虫设定的网站域名。在你生成的爬虫代码中,这个域名会被自动用作限定爬虫活动的范围。
执行这条命令后,将在你当前的目录下生成一个名为 ershou.py
的Python文件,其中包含了基于 "crawl" 模板的预设爬虫代码。
执行之后生成的代码为:
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class ErshouSpider(CrawlSpider):
name = "ershou"
allowed_domains = ["che168.com"]
start_urls = ["https://www.che168.com/shangqiu/list/#pvareaid=100945"]
rules = (Rule(LinkExtractor(allow=r"Items/"), callback="parse_item", follow=True),)
def parse_item(self, response):
item = {}
#item["domain_id"] = response.xpath('//input[@id="sid"]/@value').get()
#item["name"] = response.xpath('//div[@id="name"]').get()
#item["description"] = response.xpath('//div[@id="description"]').get()
return item
这里的代码继承为CrawlSpider而不是scrapy.Spider
-
接下来是定义规则(
rules
)。这里定义的规则是一个Rule
对象,这个对象有两个参数:LinkExtractor
和回调函数callback
。LinkExtractor
负责提取满足特定条件(即在特定XPath路径下的链接)的URL,然后callback
函数会对这些链接发起请求,并对返回的响应进行处理。follow=True
表示对这些提取出来的链接继续执行rules
。
rules = (
Rule(LinkExtractor(restrict_xpaths='//div[@class="tp-cards-tofu fn-clear"]/ul/li/a'), callback="parse_item", follow=False),
Rule(LinkExtractor(restrict_xpaths='//div[@class="page fn-clear"]/a/'), follow=True)
)
-
第一条规则是:提取匹配XPath表达式'//div[@class="tp-cards-tofu fn-clear"]/ul/li/a'的所有链接,并以
parse_item
为回调函数进行处理。这个规则不会去跟踪这个链接的下级链接,因为follow=False
。 -
第二条规则是:提取匹配XPath表达式'//div[@class="page fn-clear"]/a/'的所有链接,然后自动跟踪这些链接并进行爬取。Scrapy在爬取过程中会自动进行深度优先搜索,即会优先爬取最深层次的链接。这个规则不执行任何回调函数处理提取的数据,因为没有指定
callback
参数。