总的来说,我是网络抓取的初学者。我的目标是废弃该网站“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()
}
如果你使用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
参数,它使我能够看到浏览器打开并检查和填充框(主要用于测试)。取消处于无头模式的参数(默认情况下)。