我正在编写一个由 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!