Scrapy 爬虫未返回预期 html
Scrapy crawler not returning expected html
我正在尝试使用 scrapy 进行一些提取,但它没有 return 预期 html,我不知道是什么问题,如果它可能是网站或其他网站,因为其他页面 return 正在获得正确的结果。
我正在尝试提取此 link http://www.reclameaqui.com.br/busca/?q=estorno&empresa=Netshoes&pagina=2 上关于客户对服务和产品不满意的帖子列表,但是 html return使用上面的代码编辑不包含帖子列表,只是一个简单的 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"
]
此外,如果您要检查响应的来源,您会看到需要克服的更多挑战:
- 有一个
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
) - I've tried to use ScrapyJS
, but was not able to solve it. The third problem, if not switching to using a real browser, might be solved by allowing BeautifulSoup
and it's lenient html5lib
parser 来修复 HTML.
这是上面提到的 Python/Scrapy 中的想法(不工作 - 得到 Connection to the other side was lost in a non-clean fashion
错误 - 我怀疑不是所有的输入 values/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)
有关 selenium
和 ScrapyJS
设置的更多信息,请参阅:
此外,请务必遵守 Terms of Use 页面上描述的规则。
我正在尝试使用 scrapy 进行一些提取,但它没有 return 预期 html,我不知道是什么问题,如果它可能是网站或其他网站,因为其他页面 return 正在获得正确的结果。
我正在尝试提取此 link http://www.reclameaqui.com.br/busca/?q=estorno&empresa=Netshoes&pagina=2 上关于客户对服务和产品不满意的帖子列表,但是 html return使用上面的代码编辑不包含帖子列表,只是一个简单的 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"
]
此外,如果您要检查响应的来源,您会看到需要克服的更多挑战:
- 有一个
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
) - I've tried to use ScrapyJS
, but was not able to solve it. The third problem, if not switching to using a real browser, might be solved by allowing BeautifulSoup
and it's lenient html5lib
parser 来修复 HTML.
这是上面提到的 Python/Scrapy 中的想法(不工作 - 得到 Connection to the other side was lost in a non-clean fashion
错误 - 我怀疑不是所有的输入 values/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)
有关 selenium
和 ScrapyJS
设置的更多信息,请参阅:
此外,请务必遵守 Terms of Use 页面上描述的规则。