碎片爬虫程序未返回预期的htm

2024-05-08 20:58:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用scrapy做一些提取,但是它没有返回预期的html,我不知道问题出在哪里,如果可能是站点的安全性或其他原因,因为其他页面返回的结果是正确的。在

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

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

代码很简单,与“垃圾”教程中的代码相同:

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

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)

Tags: 代码brcomhttpresponsehtmlwww帖子
1条回答
网友
1楼 · 发布于 2024-05-08 20:58:23

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

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

有:

^{pr2}$

此外,如果您要检查响应的来源,您将看到需要克服的更多挑战:

  • 需要提交一个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()可以很容易地解决第一个问题。第二个是一个更严重的问题,你可能只使用一个真正的浏览器(查找^{})-我曾试图使用^{},但未能解决它。第三个问题,如果不使用真正的浏览器,可以通过允许^{}和{a4}来修复HTML来解决。在

下面是Python/scray中提到的上述思想(不工作-获取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页面上描述的规则。在

相关问题 更多 >