python - Webscraping,在scrapy试图到达某个URL
问题描述
好吧,我正在尝试抓取一个网站,但我无法访问我想要的 URL(操作),我已经尝试使用 Scrapy 和 Selenium 抓取 URL,但都失败了。如果有人可以给小费,或者有任何线索我可以到达这个 URL,我会很高兴。
Bellow 是我用来尝试使用 Scrapy 抓取 URL(操作)的代码:
import scrapy
from scrapy.crawler import CrawlerProcess
class TestBMF(scrapy.Spider):
name = 'test'
base_url = 'https://www.rad.cvm.gov.br/ENETCONSULTA/frmGerenciaPaginaFRE.aspx?NumeroSequencialDocumento=98307&CodigoTipoInstituicao=2'
headers = {
"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3",
"Upgrade-Insecure-Requests": "1"
}
def start_requests(self):
yield scrapy.Request(
url=self.base_url,
headers=self.headers,
callback=self.parse_detail
)
def parse_detail(self, response):
http_code = response.xpath('//iframe[contains(@id, "iFrameFormulariosFilho")]').getall()
print(http_code)
process = CrawlerProcess()
process.crawl(TestBMF)
process.start()
跟随回报:
2021-02-04 13:45:58 [scrapy.core.engine] INFO: Spider opened
2021-02-04 13:45:58 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2021-02-04 13:45:58 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2021-02-04 13:46:00 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.rad.cvm.gov.br/ENETCONSULTA/frmGerenciaPaginaFRE.aspx?NumeroSequencialDocumento=98307&CodigoTipoInstituicao=2> (referer: None)
['<iframe id="iFrameFormulariosFilho" style="height: 95%; width: 100%; overflow: scroll;" frameborder="0" title="Empresas - Formulário de Referência" height="80%"></iframe>']
2021-02-04 13:46:00 [scrapy.core.engine] INFO: Closing spider (finished)
2021-02-04 13:46:00 [scrapy.statscollectors] INFO: Dumping Scrapy stats
已经可以看到 Scrapy 返回 iframe,但返回空标签。
但是,如果我在 Google Chrome 或 FireFox 上检查 URL,我会发现:
我正在尝试访问 //iframe//form/@action 中的那个 URL ACTION
我意识到并已经尝试了一些事情:
- 如果要求从浏览器显示 url 代码,则 URL 代码将显示为空 iframe 具有 Scrapy 和 Selenium 返回。
- 如果我从 Google Chrome 或 Firefox 检查页面,将显示完整的 html 代码。
- 已经尝试使用 selenium 获取相同的 xpath 并仍然返回空 iframe
- 如果我使用简单的请求,问题将是相同的。
- 如果我要求 Scrapy 从 URL 显示完整的正文,会得到空的 iframe
好吧,我认为是,对任何英语错误感到抱歉,这不是我的母语。
并感谢大家的帮助;)
解决方案
你需要使用这样的东西:https ://pypi.org/project/scrapy-headless-selenium/
如果网站以任何重要的方式使用 Javascript,您将无法看到内容,除非该网站运行,否则您使用实际浏览器是正确的。
该库为您的用例提供了一个工具:
def parse_result(self, response):
response = response.click('#id') # equivalent to
response.click('//[@id="id"]')
print(response.selector.xpath('//title/@text')) # searches the reloaded response body
您可以使用它来单击该按钮以执行您需要执行的相关 POST。
推荐阅读
- python - 蟒蛇 | 网美子 | 自动 ping
- javascript - React Native Gifted Chat 文本状态不起作用
- monitoring - Prometheus alertmanager 向多个 slack 通道发送通知
- c# - 从 concurrentbag 中删除一个元素
- javascript - 返回原始数组的新排名数组
- python - 如何在使用值列表从 Mysql 过滤中应用条件
- java - 休眠搜索 Orm 问题
- android - Unity Android 的 StreamingAssets 文件夹位置
- spring-boot - Spring Boot 中的多态示例。接口的bean如何访问实现类的方法?
- salesforce - 具有相关选项列表的列表视图批量更新操作