gpt4 book ai didi

python - Scrapy 爬虫没有返回预期的 html

转载 作者:太空宇宙 更新时间:2023-11-04 16:13:06 25 4
gpt4 key购买 nike

我正在尝试使用 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)

最佳答案

首先,您的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"
]

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

  • 需要提交表单才能继续
  • 表单输入值是使用 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 页面上描述的规则。

关于python - Scrapy 爬虫没有返回预期的 html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33900427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com