我正在尝试使用scrapy登录网站,然后在网站内进行浏览,最后从网站下载数据。目前,我停留在导航部分的中间。这是我自己解决问题所考虑的事情。
但是,我似乎一点都没有联系。
下面是我当前使用的代码。我设法登录(当我调用“ open_in_browser”函数时,我看到已登录)。我还设法“单击”网站“ parse2”部分中的第一个按钮(如果在解析2之后调用“ open_in_browser”,我会看到网站顶部的导航栏更深了一层。 / p>
现在的主要问题在于“ parse3”部分,因为我无法更深入地导航(或者也许可以,但是“ open_in_browser”不再打开webiste,仅当我将其放在parse或parse 2之后)。我的理解是,我一个接一个地放置了多个“解析功能”来浏览网站。 Datacamp说我总是需要从“开始请求功能”开始,这是我尝试过的,但是在youtube视频等中。我看到了证据,大多数直接从解析功能开始。使用网站上的“检查”进行解析3,我看到这次href是一个相对链接,我使用了不同的方法(请参阅源5)来导航到它,因为我认为这可能是错误的来源。
import scrapy
from scrapy.http import FormRequest
from scrapy.utils.response import open_in_browser
from scrapy.crawler import CrawlerProcess
class LoginNeedScraper(scrapy.Spider):
name = "login"
start_urls = ["<some website>"]
def parse(self, response):
loginTicket = response.xpath('/html/body/section/div/div/div/div[2]/form/div[3]/input[1]/@value').extract_first()
execution = response.xpath('/html/body/section/div/div/div/div[2]/form/div[3]/input[2]/@value').extract_first()
return FormRequest.from_response(response, formdata={
'loginTicket': loginTicket,
'execution': execution,
'username': '<someusername>',
'password': '<somepassword>'},
callback=self.parse2)
def parse2(self, response):
next_page_url = response.xpath('/html/body/nav/div[2]/ul/li/a/@href').extract_first()
yield scrapy.Request(url=next_page_url, callback=self.parse3)
def parse3(self, response):
next_page_url_2 = response.xpath('/html//div[@class = "headerPanel"]/div[3]/a/@href').extract_first()
absolute_url = response.urljoin(next_page_url_2)
yield scrapy.Request(url=absolute_url, callback=self.start_scraping)
def start_scraping(self, response):
open_in_browser(response)
process = CrawlerProcess()
process.crawl(LoginNeedScraper)
process.start()
答案 0 :(得分:0)
您需要定义rules才能完全抓取网站。假设您要抓取网站标题中的所有链接,然后打开该链接以查看该链接所指向的主页。为了做到这一点,首先确定您需要抓取哪些内容并将这些链接标记为css或xpath选择器,并将其置于规则中。每个规则的默认回调都为buttons: [
{
extend: 'excelHtml5',
text: '<i class="fa fa-file-excel-o"></i> ' + 'haiexcel',
title: pageTitle,
exportOptions: {
orthogonal: 'export',
columns: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
},
className: 'btn bg-color-yellow margin-right-5',
customize: function (xlsx) {
var sheet = xlsx.xl.worksheets['sheet.xml'];
$('row:first c', sheet).attr('s', '45');
}
}
]
,或者您也可以将其分配给其他方法。我附上了一个创建规则的虚拟示例,您可以将其映射到您的案例中
parse