0
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector

class DmozSpider(BaseSpider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//ul/li')
        for site in sites:
            title = site.select('a/text()').extract()
            link = site.select('a/@href').extract()
            desc = site.select('text()').extract()
            print title, link, desc

これは私のコードです。ループを使用してスクレイピングする URL がたくさん必要です。では、どうすればこれらに当てはまりますか?そこに複数の URL を入れましたが、それらすべてから出力が得られませんでした。一部の URL が応答を停止します。では、このコードを使用して確実にデータを取得するにはどうすればよいでしょうか?

4

2 に答える 2

1

start_urlsあなたのコードは問題ないように見えますが、http://

start_urls = [
    "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
    "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]

UPD

start_urlsスクレイピーが開始する URL のリストです。通常、1 つまたは 2 つのリンクがあります。めったにない。Scrapy スパイダーはそれらを同じ方法で処理するため、これらのページは同一の HTML 構造を持っている必要があります。

start_urls に 4 ~ 5 個の URL を入れると、最初の 2 ~ 3 個の URL で正常に出力されます。

start_urlsスクレイピーはリストにあるリンクの数を気にしないので、私はこれを信じていません。

しかし、それは応答を停止し、これに GUI を実装する方法も教えてくれます。

Scrapy には、コードをテストするためのデバッグ シェルがあります。

于 2012-04-15T13:21:58.980 に答える
0

チュートリアルからコードを投稿しました。あなたがすべきことは、ドキュメント全体、特に基本概念の部分を実際に読むことです。基本的に必要なのは、クロール スパイダーであり、スパイダーが従い、特定のコードで処理するルールを定義できます。

例でドキュメントを引用するには:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item

class MySpider(CrawlSpider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com']

    rules = (
        # Extract links matching 'category.php' (but not matching 'subsection.php')
        # and follow links from them (since no callback means follow=True by default).
        Rule(SgmlLinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),

        # Extract links matching 'item.php' and parse them with the spider's method parse_item
        Rule(SgmlLinkExtractor(allow=('item\.php', )), callback='parse_item'),
    )

    def parse_item(self, response):
        self.log('Hi, this is an item page! %s' % response.url)

        hxs = HtmlXPathSelector(response)
        item = Item()
        item['id'] = hxs.select('//td[@id="item_id"]/text()').re(r'ID: (\d+)')
        item['name'] = hxs.select('//td[@id="item_name"]/text()').extract()
        item['description'] = hxs.select('//td[@id="item_description"]/text()').extract()
        return item
于 2012-04-15T13:19:48.523 に答える