3

我对scrapy spider有一个疑问。假设我有这段代码

 name = 'myspider'
    allowed_domains = ['domain.com']
    start_urls = ['http://www.domain.com/foo/']

    rules = (
        Rule(SgmlLinkExtractor(allow=r'-\w+.html$'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        hxs = HtmlXPathSelector(response)

我想知道蜘蛛会先去起始网址解析页面,然后使用规则提取链接

或蜘蛛不解析第一页,而是从规则开始

我已经看到,如果我的规则不匹配,那么我不会得到任何结果,但至少它不应该解析起始页

4

1 回答 1

2

我正在编写一个由 Michael Herman 编写的示例教程, https://github.com/mjhea0/Scrapy-Samples,它从 BaseSpider 示例开始,然后发展到 CrawlSpider 示例。第一个例子没什么大不了的,但第二个例子没有刮第一页——只有第二页——我不知道我做错了什么。然而,当我从 github 运行代码时,我意识到他的代码并没有抓取第一页!我想这与 CrawlSpider vs BaseSpider 的意图有关,在做了一些研究之后,我想出了这个:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from craigslist.items import CraigslistItem
from scrapy.http     import Request

class MySpider(CrawlSpider):
name = "CraigslistSpider"
allowed_domains = ["craigslist.org"]
start_urls = ["http://annapolis.craigslist.org/sof/"]

rules = (
    Rule (SgmlLinkExtractor(allow=("index\d00\.html", ),
    restrict_xpaths=('//p[@id="nextpage"]',)),
    callback="parse_items", follow= True),
)

#
# Need to scrape first page...so we hack-it by creating request and
# sending the request to the parse_items callback
#
def parse_start_url(self, response):
    print ('**********************')
    request = Request("http://annapolis.craigslist.org/sof/", callback=self.parse_items)
    return request

def parse_items(self, response):
    hxs = HtmlXPathSelector(response)
    titles = hxs.select("//p")
    items = []
    for titles in titles:
        item = CraigslistItem()
        item ["title"] = titles.select("a/text()").extract()
        item ["link"] = titles.select("a/@href").extract()
        items.append(item)
    return items        

在我的例子中,我使用的是 CrawlSpider,它要求我实现 'parse_start_url' 以使用在 start_urls 中找到的相同 url 创建一个请求对象,即第一页。之后,从第一页开始抓取。顺便说一句,我已经 3 天大了scrapy 和 python!

于 2012-12-14T00:25:01.210 回答