特定のリンク構造を持つサイト (例: web.com) からコンテンツを抽出するために再帰スパイダーを実行しようとしています。例えば:
http://web.com/location/profile/12345678?qid=1403226397.5971&source=location&rank=21
http://web.com/location/profile/98765432?qid=1403366850.3991&source=場所&ランク=1
ご覧のとおり、URL の数値部分のみが変更されているため、この URL 構造に続くすべてのリンクをクロールして、itemX、itemY、itemZ を抽出する必要があります。
リンク構造を次のように正規表現に変換しました: '\d+?qid=\d+.\d+&source=location&rank=\d+'. Python-Scrapy コードは次のとおりですが、スパイダーを実行した後、スパイダーによって何も抽出されません。
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from web.items import webItem
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.http import Request
from scrapy import log
import re
import urllib
class web_RecursiveSpider(CrawlSpider):
name = "web_RecursiveSpider"
allowed_domains = ["web.com"]
start_urls = ["http://web.com/location/profile",]
rules = (Rule (SgmlLinkExtractor(allow=('\d+?qid=\d+.\d+&source=location&rank=\d+', ),)
, callback="parse_item", follow= True),
)
def parse_item(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.select('//*')
items = []
for site in sites:
item = webItem()
item["itemX"] = site.select("//span[@itemprop='X']/text()").extract()
item["itemY"] = site.select("//span[@itemprop='Y']/text()").extract()
item["itemZ"] = site.select("//span[@itemprop='Z']/text()").extract()
items.append(item)
return items