scrapy不会检测到html元素,但它在源页

时间:2016-07-10 10:39:18

标签: javascript python http-headers scrapy scrapy-shell

我有一个请求在常规浏览器上正常工作但在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)

总而言之,这就是我所做的:

  • 我将标题更改为与我的Mozilla浏览器(可以正常工作)相同
  • 我安装了Splash并试图用它来处理javascript

2 个答案:

答案 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