私は Michael Herman によるサンプル チュートリアル ( https://github.com/mjhea0/Scrapy-Samples ) をコーディングしていました。これは、BaseSpider の例から始まり、CrawlSpider の例に進みました。最初の例は大したことではありませんが、2 番目の例は最初のページをスクレイピングするのではなく、2 ページ目だけをスクレイピングしていました。しかし、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 日経ちました!