【问题标题】:Scrapy: Crawling 200 different URLs from 200 different Domains with one SpiderScrapy:用一只蜘蛛从 200 个不同的域中抓取 200 个不同的 URL
【发布时间】:2015-08-04 18:20:16
【问题描述】:

我需要为一个项目爬取 200 个不同的网站,我想先启动一次爬虫,然后它会在接下来的几个小时内自行运行。 URL 将位于 txt 或 csv 文件中。 到目前为止,我有两种略有不同的方法。 第一次尝试:

class MySpider(CrawlSpider):

name = 'spiderName'

read_urls = open('../../urls.txt', 'r')
for url in read_urls.readlines():
    url = url.strip() 
    allowed_domains = [url[4:]]
    start_urls = ['http://' + url]

read_urls.close()

rules = (Rule(LinkExtractor(allow = ('', )), callback = 'parse_stuff', follow = True),)

def parse_stuff(self, response):
    hxs = Selector(response)
    sites = hxs.xpath('//html')
    items_main = []

    for site in sites:
        loader = ItemLoader(item = Items_Main(), response = response)
        loader.add_xpath('a_title', '//head/title/text()')
        ...
        items_main.append(loader.load_item())
        return items_main

这里它只获取 txt 文件中的最后一个 URL,但它可以正常工作,我可以限制 allowed_domains

在 Stackoverflow 上找到的第二次尝试基本相同,除了 start_urls = [url.strip() for url in read_urls.readlines()] 给我以下错误 raise ValueError('Missing scheme in request url: %s' % self._url)

【问题讨论】:

    标签: python web-crawler scrapy


    【解决方案1】:

    您覆盖了 for 循环中的列表。

    在循环之前初始化列表并在循环内追加。

    allowed_domains = []
    start_urls = []
    for url in read_urls.readlines():
        url = url.strip() 
        allowed_domains = allowed_domains + [url[4:]]
        start_urls = start_urls + ['http://' + url]
    

    【讨论】:

    • 谢谢我现在得到所有的网址。但它只为所有 URL 打开管道一次,所以我只得到一个 XML 文件作为输出,而不是每个 URL 一个文件。
    • 在这种情况下,改变你的管道(或者如果你使用一些默认值,则编写一个自定义的管道),它为每个项目打开一个新的 XML 文件并将内容写入该文件。或者,您可以使用脚本中的每个起始 URL 调用您的蜘蛛——因此您将读取的文件从蜘蛛转移到调用者。
    • 如果您的问题得到解答,请考虑接受此答案并为您的后续问题编写一个新问题。也许你应该看看这个SO-Question
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多