【问题标题】:Python Scrapy issue with URL generationURL生成的Python Scrapy问题
【发布时间】:2017-08-09 14:06:23
【问题描述】:

我对 Scrapy 有疑问。 我想废弃一个 N url 列表(在同一个网站上),但我不知道哪个 URL 可以工作。实际上我想在网站上“搜索”一些东西,一条路-村庄-县。 如果我告诉网站搜索道路+村庄+县,他可能找不到任何东西。如果他没有找到我想要的,我会做一个更“全球”的搜索,只搜索村+县,最后只搜索县。 示例:我有位置:

“D 32, Serrières-de-Briord, Belley, Ain, Auvergne-Rhône-Alpes”。这里 我们有 [Road = D 32], [Serrières-de-Briord : (精确和小) commune] , [Belley: (最近和大的) commune], [Ain: Department], [奥弗涅-罗讷-阿尔卑斯大区]。

我想做的是: 搜索

D 32+Serrières-de-Briord+Belley+Ain+奥弗涅-罗讷-阿尔卑斯

如果没有结果,搜索:

Serrières-de-Briord+Belley+Ain+Auvergne-Rhône-Alpes。

如果没有结果,搜索

贝利+艾因+奥弗涅-罗讷-阿尔卑斯

(通常,此时没问题)。

问题是我想为 25 000 个地点执行此操作。所以我不能给 scrapy 25000*3 = 75 000 URL 报废。问题还在于避免 Scrapy 多次抓取相同的信息。 因此,我想做的是: start_url = [最精确级别的所有 URL - 25] 对于 start_url 中的 url: 如果没有我想要的:去废弃“url1”(它是从 url 构建的,但更精确)。 如果 url1 没有我想要的:去废弃“url2”(从 url1 构建,此时应该没问题)。 如果我有一个好的“url”,请转到 parse() (并获取我需要的信息)。

这是我的代码:

    import scrapy

    from scrapy.http import Request 
class QuotesSpider(scrapy.Spider):
        name = "street"

        start_urls = [
            'http://prix-immobilier.lemonde.fr/prix-immobilier/recherche?q=rue+des+colonnes+du+trone+Paris+Ile-de-France+75012',
            'http://prix-immobilier.lemonde.fr/prix-immobilier/recherche?q=Route+Badevel+à+Saint-Dizier%2C+Badevel%2C+Montbéliard',
        ]

        def start_requests(self):
            for urly in self.start_urls:
                yield Request(url=urly,callback=self.enjoy)

        def enjoy(self,response):
            if response.css("#price_container h1::text").extract_first()[:4]=="Prix":
                yield Request(url=urly,callback=self.parse)
            else:
                pass


        def parse(self,response):
            I parse the info...

这里的“享受”部分是只选择有趣的 url 并“传递”其他的。但是,这个脚本不起作用。我收到此错误:

line 27, in enjoy
    yield Request(url=urly,callback=self.parse)
NameError: name 'urly' is not defined

而且我不知道如果我没有找到任何东西(而不是仅“通过”...),我该怎么说搜索我从前一个创建的另一个 URL。

我希望我的问题足够清楚。 谢谢你的帮助 !

【问题讨论】:

  • 75.000 个请求对我来说听起来不错,你为什么不这样做?
  • 如果我创建了 url-url1-url2,如果 Scrapy 成功抓取了 url 的信息,他也会抓取 url1 和 url2,所以我会有 3 个信息,这很不方便。我首先搜索最精确的东西。但是如果我不能拥有它,我说“好吧,让我们有一个更通用的,我会说这个值将是“精确”位置的值”。例如:如果我没有“Serrières-de-Briord”但我有“Belley”,我将捕捉“Belley”的值并将其作为“Serrières-de-Briord”的值。但是,如果是“Serrières-de-Briord”作品,我不需要额外的价值。

标签: python python-3.x web-scraping scrapy


【解决方案1】:

您可以通过meta 传递您的搜索参数。

例如,在start_requests 中,您可以使用搜索参数列表列表,而不是从 URL 列表 (self.start_urls) 产生。 下面是一个玩具蜘蛛使用 httpbin.org 发出请求,每个 3 参数,然后是最后 2,然后是最后一个:

from w3lib.url import add_or_replace_parameter
import scrapy


class QuotesSpider(scrapy.Spider):
    name = "street"

    base_search_url = 'http://httpbin.org/get'
    search_params = [
        ['C', 'B', 'A'],
        ['F', 'E', 'D'],
    ]

    def _build_search_request(self, params):
        url = add_or_replace_parameter(
            self.base_search_url,
            'q',
            ' '.join(params)
        )
        return scrapy.Request(url, meta={'params': params},
            callback=self.parse)

    def start_requests(self):
        for params in self.search_params:
            yield self._build_search_request(params)

    def parse(self, response):
        if 'ok' in response.text:
            # parse_info
            # ...
            pass
        else:
            params = response.meta['params']
            params.pop(0)
            if params:
                yield self._build_search_request(params)

注意 meta 字典中的每个请求如何传递搜索参数。

【讨论】:

    猜你喜欢
    • 2017-01-05
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多