尝试使用Scrapy发出POST请求

问题描述 投票:0回答:1

总的来说,我是网络抓取的初学者。我的目标是废弃该网站“https://buscatextual.cnpq.br/buscatextual/busca.do”,问题是,这是一个科学网站,所以我需要选中“Assunto(Título ou palavra)框chave da produção)”,并在页面的主要输入中写入单词“grafos”。我该如何使用 Scrapy 来做到这一点?我一直在尝试使用以下代码来做到这一点,但我遇到了几个错误,并且从未处理过一般情况下的 POST。

import scrapy

class LattesSpider(scrapy.Spider):
    name = 'lattesspider'
    login_url = 'https://buscatextual.cnpq.br/buscatextual/busca.do'
    start_urls = [login_url]

    
    def parse(self, response):
        data = {'filtros.buscaAssunto': True,
                'textoBusca': 'grafos'}
        yield scrapy.FormRequest(url=self.login_url, formdata=data, callback=self.parse_profiles)
    
    def parse_profiles(self, response):
        yield {'url': response.url,
               'nome': response.xpath("//a/text()").get()
               }
python web-scraping post scrapy
1个回答
0
投票

如果你使用Scrapy有点困难和不熟悉,并且很难在页面上找到某些东西,我建议使用

playwright
Playwright
Scrapy
都是非常新的库,
playwright
稍微新一些。我建议使用
playwright
的原因是因为使用 CSS 选择器或 xpath 可以非常轻松地定位按钮、复选框和填充文本框。

这是我整理的一些示例代码,应该可以工作:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    page.goto('https://buscatextual.cnpq.br/buscatextual/busca.do')
    page.locator('input#buscaAssunto').check()
    page.locator('input#textoBusca').fill('grafos')
    page.wait_for_timeout(5000)
    browser.close()

这里我使用了CSS,但你也可以使用xpath,

playwright
两者都接受。请注意,我在这里启动了 chromium,但是对于每个不同的浏览器,您都需要不同的行。

铬:

browser = p.chromium.launch()
Chrome:
browser = p.chromium.launch(channel="chrome") Msedge: 
浏览器 = p.chromium.launch(channel="msedge") 火狐浏览器:
browser = p.firefox.launch() Webkit: 
浏览器= p.webkit.launch()

只需用您当前的浏览器替换该行即可。

请注意,我还包含了

headless=False
参数,它使我能够看到浏览器打开并检查和填充框(主要用于测试)。取消处于无头模式的参数(默认情况下)。

© www.soinside.com 2019 - 2024. All rights reserved.