python - 向 Scrapy Spider 添加标题
问题描述
对于一个项目,我正在运行大量针对某些搜索词的 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
我找到了一个讨论 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 中应用标头的方法似乎有所不同。有谁知道如何最好地将它包含在 Scrapy 中,特别是参考start_urls
,它一次包含多个 URL?
解决方案
您无需在此处修改标题。您需要设置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', ...
推荐阅读
- javascript - 在 Javascript 中将图像 url 转换为 blob
- php - Laravel 多条件数据库更新
- windows - 仅在 Windows 的 cpu 版本中安装 Tensorflow
- javascript - 试图在 Tampermonkey 中创建一个警报按钮
- spring - 不要让特定类型的 RuntimeException 的事务回滚
- linux - 接受 2 个参数的 Shell 脚本
- python-3.x - python中大型数据集的字符串匹配
- java - 如何验证普通方法,就好像它是 CDI InjectionPoint?
- rust - 当我使用 rustc 编译时,为什么会出现在 Cargo.toml 中列为依赖项的“找不到 crate”?
- typeorm - Typeorm 多对一/一对多导致意外结果