3

スクレイピースパイダーにはひとつ疑問があります。このコードを持っているとします

 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)

スパイダーが最初に開始 URL に移動し、ページを解析してから、ルールを使用してリンクを抽出するかどうかを知りたい

またはスパイダーは最初のページを解析しませんが、ルールで開始します

ルールが一致しない場合、結果が得られないことがわかりましたが、少なくとも開始ページを解析する必要はありませんでした

4

1 に答える 1

2

私は 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 日経ちました!

于 2012-12-14T00:25:01.210 に答える