我有一个请求在常规浏览器上正常工作但在scrapy shell中没有。一旦我使用“scrapy shell”或“scrapy crawl”,整个HTML块就会消失。我没有被禁止。
在这里,下面是github(带图片)上的问题,之前我使用像mozilla这样的常规浏览器重定向到以下链接(法国网站物业拍卖):
https://github.com/scrapy/scrapy/issues/2109
为了做空,我试图抓拍卖网站。使用常规浏览器,所有数据都会正常显示。但是当我使用scrapy shell检查时,response.body
中缺少整个HTML块scrapy shell http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-fontainebleau/mercredi-15-juin-2016.html
即使我通过输入以下内容来更改我的用户代理:
scrapy shell -s USER_AGENT='Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1' 'http...the rest of url'
我尝试更改用户代理,因为我被告知这是一个潜在的标题问题或javascript问题。
在我的终端上加上此消息错误说:
[1:1:0710/114628:错误:PlatformKeyboardEvent.cpp(117)]未实现在静态PlatformEvent :: Modifiers中达到blink :: PlatformKeyboardEvent :: getCurrentModifierState()
以防万一,我必须在我的设置中添加DOWNLOAD_HANDLERS: {'s3': None}
才能删除ERROR消息。
我在ubuntu 14上运行,并且我用scrapy 1.03安装了anaconda。
我在哪里想到这一点请人们?
编辑: 要检查标头解决方案,我将mozilla浏览器中的相同标头复制粘贴到我的scrapy shell中。这是我的代码:
from scrapy import Request
req = Request('MY_URL',
headers={
'Accept': 'text/html, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4',
'User-Agent':"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36",
})
fetch(req)
HTML数据仍然缺失。
javascript可以阻止scrapy工作吗?
编辑:
我还使用docker先决条件安装了scrapy-splash。
然后,我尝试使用启动服务器处理此问题。
仍然存在同样的问题!这是我的代码:
$ scrapy shell
from scrapy import Request
from scrapy_splash import SplashRequest
url='http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-paris/jeudi-7-juillet-2016.html'
req = SplashRequest(url, args={'wait': 0.5},
headers={
'Accept': 'text/html, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4',
'User-Agent':"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36",
})
fetch(req)
view(response)
总而言之,这就是我所做的:
答案 0 :(得分:1)
这是一个Javascript问题。
无法加载的页面部分由AJAX请求动态调用。
由于Scrapy默认情况下不会渲染任何Javascript,包括AJAX请求,因此页面中块的内容保持为空。
这绝对可以使用Splash在Scrapy中处理。
这是正确加载页面的工作蜘蛛的代码。
# -*- coding: utf-8 -*-
import scrapy
from scrapy.shell import inspect_response
from scrapy.shell import open_in_browser
from scrapy_splash import SplashRequest
class LicitorSpider(scrapy.Spider):
name = "licitor"
allowed_domains = ["licitor.com"]
start_urls = (
'http://www.licitor.com/',
)
def parse(self, response):
url = 'http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-fontainebleau/mercredi-15-juin-2016.html'
yield SplashRequest(url=url, callback=self.parse_item, args={'wait': 0.5})
def parse_item(self, response):
open_in_browser(response)
assert ("www.dbcj-avocats.com" in response.body), "XHR request not loaded"
inspect_response(response, self)
确保在运行Spider之前运行Splash Docker实例,并将以下设置添加到Spiders settings.py
文件中。
SPLASH_URL = 'http://localhost:8050'
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
答案 1 :(得分:0)
如果您从该页面查看实际的HTML源代码(view-source:http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-fontainebleau/mercredi-15-juin-2016.html
),您将无法看到您在GitHub问题中圈出的数据。
如果您检查浏览器的网络标签,则在加载http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-fontainebleau/mercredi-15-juin-2016.html时,您会注意到http://www.licitor.com/annonce/06/20/24/vente-aux-encheres/un-appartement/avon/seine-et-marne/062024.html的XHR请求
如果您使用scrapy获取此页面,您将获得所需的数据。
广告的链接位于<ul>
<div class="Container">
<ul class="AdResults">
<li>
<a class="Ad Archives First" href="/annonce/06/20/24/vente-aux-encheres/un-appartement/avon/seine-et-marne/062024.html"
title="Un appartement, Avon, Seine-et-Marne, adjudication : 101 000 €">
...
请参阅此scrapy shell会话:
$ scrapy shell http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-fontainebleau/mercredi-15-juin-2016.html
2016-07-10 20:08:35 [scrapy] INFO: Scrapy 1.0.6 started (bot: scrapybot)
(...)
2016-07-10 20:08:36 [scrapy] DEBUG: Crawled (200) <GET http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-fontainebleau/mercredi-15-juin-2016.html> (referer: None)
(...)
In [1]: for link in response.css('ul.AdResults > li > a'):
print(link.xpath('@title').extract_first(), response.urljoin(link.xpath('@href').extract_first()))
...:
(u'Un appartement, Avon, Seine-et-Marne, adjudication : 101 000 \u20ac', u'http://www.licitor.com/annonce/06/20/24/vente-aux-encheres/un-appartement/avon/seine-et-marne/062024.html')
(u"Une maison d'habitation, Montereau-Fault-Yonne (Seine-et-Marne), Seine-et-Marne, adjudication : 95 500 \u20ac", u'http://www.licitor.com/annonce/06/22/90/vente-aux-encheres/une-maison-d-habitation/montereau-fault-yonne-seine-et-marne/seine-et-marne/062290.html')
(u"Une maison d'habitation, Chevry-en-Sereine (Seine-et-Marne), Seine-et-Marne, adjudication : 48 000 \u20ac", u'http://www.licitor.com/annonce/06/22/91/vente-aux-encheres/une-maison-d-habitation/chevry-en-sereine-seine-et-marne/seine-et-marne/062291.html')
获取页面并收集<div class="AdContent" id="ad-062024">
中的内容会显示浏览器显示的数据:
In [2]: fetch('http://www.licitor.com/annonce/06/20/24/vente-aux-encheres/un-appartement/avon/seine-et-marne/062024.html')
2016-07-10 20:11:25 [scrapy] DEBUG: Crawled (200) <GET http://www.licitor.com/annonce/06/20/24/vente-aux-encheres/un-appartement/avon/seine-et-marne/062024.html> (referer: None)
(...)
In [3]: print(response.css('div.AdContent').xpath('normalize-space()').extract_first())
Annonce publiée le 27 avril 2016 62024 Tribunal de Grande Instance de Fontainebleau (Seine et Marne) Vente aux enchères publiques sur licitation en un lot mercredi 15 juin 2016 à 14h Un appartement Une cave Deux boxes en sous-solCadastré section A n°142, 150, 1.016, 1.017 et 1.075, lots n°132, 214, 240 et 242Le bien est occupé Adjudication : 101 000 € (Mise à prix : 100 000 €) Avon Résidence Les Jardins de Changis29 - 35, rue des Yèbles (exactitude non garantie) SCP Dumont, Bortolotti, Combes, Junguenet, Avocats 149, rue Grande - 77300 FontainebleauTél.: 01 60 71 57 11 www.dbcj-avocats.com Ferrari & Cie - Réf. A16/0239