我正在尝试使用Scrapy登录网站,然后在网站内导航,最终从中下载数据。目前我被困在导航部分的中间。以下是我自己解决问题所研究的事情。
- 关于刮擦的数据营课程
- 跟随与Scrapy的分页链接
- http://scrapingauthority.com/2016/11/22/scrapy-login/
- 刮擦 - 以下链接
- 相对网址到绝对网址 刮擦
但是,我似乎没有将这些点联系起来。
下面是我目前使用的代码。我设法登录(当我调用"open_in_browser"功能时,我看到我已登录(。我还设法在"parse2"部分中"单击"网站上的第一个按钮(如果我在解析 2 之后调用"open_in_browser",我看到网站顶部的导航栏更深了一层。
现在主要问题在"parse3"部分,因为我无法更深入地导航另一个级别(或者也许我可以,但"open_in_browser"不再打开网站 - 只有当我把它放在解析或解析 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()
您需要定义规则才能完全抓取网站。假设您要抓取网站标题中的所有链接,然后打开该链接以查看该链接所指向的主页。
为了实现这一点,首先确定你需要为这些链接抓取和标记CSS或XPath选择器的内容,并将它们放在一个规则中。每个规则都有一个默认的回调parse
或者您也可以将其分配给其他方法。我附上了一个创建规则的虚拟示例,您可以根据自己的情况将其映射:
rules = (
Rule(LinkExtractor(restrict_css=[crawl_css_selectors])),
Rule(LinkExtractor(restrict_css=[product_css_selectors]), callback='parse_item')
)