【问题标题】:Scrapy arguments in URL from table从表中抓取 URL 中的参数
【发布时间】:2017-02-27 13:46:50
【问题描述】:

大家好!

我目前正在使用 Python 2.7 开发 Scrapy Webcrawler,虽然我知道 C 和 Web 语言,但我对 Python 和 Scrapy 库有点迷茫。

我想做的是抓取返回 JSON 数据的单个 URL,并根据预定义的参数表更改 URL 中的参数。

网址如下所示:

http://www.helloworld.com/data?From=xxx&To=yyy&number=42

在这里,我想从存储在不同文件中的一组数据中替换所有xxx,yyy,42,并使用每个参数循环爬虫。

我知道我能做到:

    def __init__(self, fromdat='xxx', todat='yyy'):
    self.start_urls = ["http://helloworld.com/data?From=%s&To=%s/" % (fromdat, todat)]

然后在命令行中使用-a命令指定参数,但这会涉及到人为干预,我不希望这样。

我也试过了:

class QuotesSpider(scrapy.Spider):
name = "histo"
tab1=[1000,10]

def start_requests(self, tab1):
    for i in tab1:
        urls = 'http://www.helloworld.com/data?number=%d'% i
        yield scrapy.Request(url=url, callback=self.parse)


    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'histo-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

但这似乎也没有办法......

我有点迷茫,所以欢迎任何帮助! :)

非常感谢,祝您有美好的一天!

【问题讨论】:

    标签: python python-2.7 scrapy web-crawler


    【解决方案1】:

    start_requests() 不接受任何附加参数,请执行以下操作:

    class QuotesSpider(scrapy.Spider):
        name = "histo"
        tab1 = [1000,10]
    
        def start_requests(self):
            for i in self.tab1:
                urls = 'http://www.helloworld.com/data?number=%d' % i
                yield scrapy.Request(url=url, callback=self.parse)
    
        def parse(self, response):
            page = response.url.split("/")[-2]
            filename = 'histo-%s.html' % page
            with open(filename, 'wb') as f:
                f.write(response.body)
            self.log('Saved file %s' % filename)
    

    注意parse() 是如何缩进的。

    【讨论】:

    • 非常感谢,它确实有效!是的,对不起,我在 Python 中的缩进有点麻烦,我真的不习惯,但在纠正它之后它工作正常。但是,在恢复由爬虫收集的数据方面我仍然有一个小问题:从您的代码中,我只是在“yield”中修改了从 (url=url) 到 (url=urls) 的请求,以使我的数据成为报废。但是,抓取的数据首先写入一个文件,然后用第二个参数的 URL 中包含的数据覆盖。我的愿望是将所有数据合并到一个文件中。非常感谢
    • @M.C.好吧,我想你的意思是使用a 模式而不是wb。让我知道这就是你的意思。谢谢。
    • 感谢您的宝贵时间,实际上,在 open(filename, 'wb') 中使用 'a' 模式而不是 'wb' 不会改变任何东西(我在 Windows 上,但要运行的项目Raspberry Pi 上的蜘蛛)。我的代码应该在单独的 html 文件中编写每个提取,但是数据在同一个文件中被覆盖,我不明白为什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2023-03-19
    • 2019-03-27
    相关资源
    最近更新 更多