2

我有一个请求在常规浏览器上正常工作,但在 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:ERROR:PlatformKeyboardEvent.cpp(117)] 未实现静态 PlatformEvent::Modifiers blink::PlatformKeyboardEvent::getCurrentModifierState()

以防万一,我必须添加DOWNLOAD_HANDLERS: {'s3': None} 我的设置以消除错误消息。

我在 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
4

2 回答 2

2

这是一个 Javascript 问题。

未加载的页面部分由 AJAX 请求动态调用。

由于 Scrapy 默认情况下不呈现任何 Javascript,包括 AJAX 请求,因此页面中块的内容保持为空。

这在 Scrapy 中使用 Splash 绝对可以处理。

这是正确加载页面的工作蜘蛛的代码。

# -*- 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 实例,并将以下设置添加到 Spiderssettings.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,
}
于 2016-07-10T18:08:17.910 回答
0

如果您从该页面 ( view-source:http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-fontainebleau/mercredi-15-juin-2016.html) 查看实际的 HTML 源代码,您将看不到您在 GitHub 问题中圈出的数据。

如果您检查浏览器的网络选项卡,在加载http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-fontainebleau/mercredi-15-juin-2016.html时,您会注意到对 http 的 XHR 请求: //www.licitor.com/annonce/06/20/24/vente-aux-encheres/un-appartement/avon/seine-et-marne/062024.html

如果你用 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
于 2016-07-10T18:14:22.850 回答