【问题标题】:Scrapy crawler not returning expected htmlScrapy爬虫未返回预期的html
【发布时间】:2016-02-27 07:03:06
【问题描述】:

我正在尝试使用 scrapy 进行一些提取,但它没有返回预期的 html,我不知道是什么问题,是否可能是网站的安全性或其他问题,因为其他页面正在返回正确的结果。

我正在尝试在此链接http://www.reclameaqui.com.br/busca/?q=estorno&empresa=Netshoes&pagina=2 提取帖子列表,这是关于客户对服务和产品的不满意,但是上面代码返回的 html 不包含帖子列表,只是一个简单的html 几乎是空的。

有人知道会发生什么吗?导致无法正确提取的问题?

代码很简单,和scrapy教程一样:

我已经尝试了一些爬虫桌面或在线工具,结果是一样的。

import scrapy

class DmozSpider(scrapy.Spider):
    name = "dmoz"
    allowed_domains = ["reclameaqui.com.br"]
    start_urls = [
       "http://www.reclameaqui.com.br/busca/q=estorno&empresa=Netshoes&pagina=2"
    ]

    def parse(self, response):
        filename = response.url.split("/")[-2] + '.html'
        with open(filename, 'wb') as f:
            f.write(response.body)

【问题讨论】:

    标签: python html web-scraping web-crawler scrapy


    【解决方案1】:

    首先,您的start_urls 中有一个错误。替换:

    start_urls = [
        "http://www.reclameaqui.com.br/busca/q=estorno&empresa=Netshoes&pagina=2"
    ]
    

    与:

    start_urls = [
       "http://www.reclameaqui.com.br/busca/?q=estorno&empresa=Netshoes&pagina=2"
    ]
    

    此外,如果您检查响应的来源,您会发现需要克服的更多挑战:

    • 有一个 form 需要提交才能继续
    • 使用 JavaScript 计算表单输入值
    • HTML 本身已损坏 - form 立即关闭,然后输入:

      <body>
      <form method="POST" action="%2fbusca%2f%3fq%3destorno%26empresa%3dNetshoes%26pagina%3d2"/>
      <input type="hidden" name="TS01867d0b_id" value="3"/><input type="hidden" name="TS01867d0b_cr" value=""/>
      <input type="hidden" name="TS01867d0b_76" value="0"/><input type="hidden" name="TS01867d0b_86" value="0"/>
      <input type="hidden" name="TS01867d0b_md" value="1"/><input type="hidden" name="TS01867d0b_rf" value="0"/>
      <input type="hidden" name="TS01867d0b_ct" value="0"/><input type="hidden" name="TS01867d0b_pd" value="0"/>
      </form>
      </body>
      

    使用FormRequest.from_response() 可以轻松解决第一个问题。第二个是一个更严重的问题,您可能只使用真正的浏览器(查找selenium) - 我尝试使用ScrapyJS,但无法解决它。第三个问题,如果不切换到使用真正的浏览器,可能会通过允许BeautifulSoup 来解决,它是lenient html5lib parser 来修复 HTML。

    这是 Python/Scrapy 中的上述想法(不起作用 - 出现 Connection to the other side was lost in a non-clean fashion 错误 - 我怀疑并非所有输入值/POST 参数都已计算):

    from bs4 import BeautifulSoup
    import scrapy
    
    
    class DmozSpider(scrapy.Spider):
        name = "dmoz"
        start_urls = [
           "http://www.reclameaqui.com.br/busca/?q=estorno&empresa=Netshoes&pagina=2"
        ]
    
        def start_requests(self):
            for url in self.start_urls:
                yield scrapy.Request(url, self.parse_page, meta={
                    'splash': {
                        'endpoint': 'render.html',
                        'args': {'wait': 0.8}
                    }
                })
    
        def parse_page(self, response):
            soup = BeautifulSoup(response.body, "html5lib")
            response = response.replace(body=soup.prettify())
    
            return scrapy.FormRequest.from_response(response,
                                                    callback=self.parse_form_request,
                                                    url="http://www.reclameaqui.com.br/busca/?q=estorno&empresa=Netshoes&pagina=2",
                                                    headers={
                                                        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"
                                                    })
    
        def parse_form_request(self, response):
            print(response.body)
    

    有关seleniumScrapyJS 设置的更多信息,请参阅:

    另外,请确保遵守Terms of Use 页面上描述的规则。

    【讨论】:

    • 谢谢,这对我的工作开始有很大帮助,我会努力让它发挥作用
    猜你喜欢
    • 2023-04-04
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2021-04-01
    相关资源
    最近更新 更多