【问题标题】:Adding Headers to Scrapy Spider向 Scrapy Spider 添加标题
【发布时间】:2019-02-14 21:30:49
【问题描述】:

对于一个项目,我正在运行大量针对某些搜索词的 Scrapy 请求。这些请求使用相同的搜索词但不同的时间范围,如下面 URL 中的日期所示。

尽管 URL 引用的日期和页面不同,但我收到的值与所有请求的输出相同。看起来脚本正在获取获得的第一个值,并将相同的输出分配给所有后续请求。

import scrapy

 class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    allowed_domains = ['google.com']
    start_urls = ['https://www.google.com/search?q=Activision&biw=1280&bih=607&source=lnt&tbs=cdr%3A1%2Ccd_min%3A01%2F01%2F2004%2Ccd_max%3A12%2F31%2F2004&tbm=nws',
                  'https://www.google.com/search?q=Activision&biw=1280&bih=607&source=lnt&tbs=cdr%3A1%2Ccd_min%3A01%2F01%2F2005%2Ccd_max%3A12%2F31%2F2005&tbm=nws',
                  'https://www.google.com/search?q=Activision&biw=1280&bih=607&source=lnt&tbs=cdr%3A1%2Ccd_min%3A01%2F01%2F2006%2Ccd_max%3A12%2F31%2F2006&tbm=nws',
    ]

    def parse(self, response):
        item = {
            'search_title': response.css('input#sbhost::attr(value)').get(),
            'results': response.css('#resultStats::text').get(),
            'url': response.url,
        }
        yield item

我找到了一个线程discussing a similar problem with BeautifulSoup。解决方案是在脚本中添加标头,从而使其使用浏览器作为用户代理:

headers = {
    "User-Agent":
        "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"
}
payload = {'as_epq': 'James Clark', 'tbs':'cdr:1,cd_min:01/01/2015,cd_max:01/01/2015', 'tbm':'nws'}
r = requests.get("https://www.google.com/search", params=payload, headers=headers)

在 Scrapy seems to be different though 中应用标头的方法。有谁知道如何最好地将它包含在 Scrapy 中,尤其是参考 start_urls,它同时包含多个 URL?

【问题讨论】:

  • 谢谢,我实际上在问题的最后一个链接中提到了该线程。我已应用建议,但无法在修改设置后集成response.request.headers.get('Referrer', None) 以使整个脚本正常运行。
  • 你是什么意思:“......但是不能,在修改设置之后......”?
  • 您需要帮助修改设置?
  • 首先完成了设置修改。更多的是关于如何将这一行正确地集成到脚本代码中。

标签: python scrapy


【解决方案1】:

您无需在此处修改标题。您需要设置 Scrapy 允许您直接执行的 用户代理

import scrapy

class QuotesSpider(scrapy.Spider):
    # ...
    user_agent = 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'
    # ...

现在你会得到如下输出:

'results': 'About 357 results', ...
'results': 'About 215 results', ...
'results': 'About 870 results', ...

【讨论】:

  • malberts 你是明星!这正是我一直在寻找的解决方案,并且似乎是最终获得工作 Python 脚本的突破口! :)
【解决方案2】:

根据Scrapy 1.7.3 document。您的标题不会像其他标题一样通用。它应该与您正在抓取的站点相同。您将从控制台网络选项卡中了解标头。

像下面这样添加它们并打印响应。

# -*- coding: utf-8 -*-
import scrapy
#import logging

class AaidSpider(scrapy.Spider):
    name = 'aaid'

    def parse(self, response):
        url = "https://www.eventscribe.com/2019/AAOMS-CSIOMS/ajaxcalls/PresenterInfo.asp?efp=SVNVS1VRTEo4MDMx&PresenterID=597498&rnd=0.8680339"

        # Set the headers here. 
        headers =  {
            'Accept': '*/*',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8',
            'Connection': 'keep-alive',
            'Host': 'www.eventscribe.com',
            'Referer': 'https://www.eventscribe.com/2018/ADEA/speakers.asp?h=Browse%20By%20Speaker',
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
            'X-Requested-With': 'XMLHttpRequest'
        }
# Send the request
        scrapy.http.Request(url, method='GET' , headers = headers,  dont_filter=False)

        print(response.body) #If the response is HTML
        #If the response is json ; import json
        #jsonresponse = json.loads(response.body_as_unicode())
        #print jsonresponse

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2015-09-13
    • 2015-02-14
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多