Python-Scrapy-浏览网站

Python-Scrapy-浏览网站,python,web-scraping,scrapy,navigation,Python,Web Scraping,Scrapy,Navigation,我试图使用Scrapy登录到一个网站,然后在该网站中导航,最终从中下载数据。目前我被困在导航部分的中间。以下是我自己研究的解决问题的方法 关于刮痧的数据营课程 然而,我似乎没有把这些点联系起来 下面是我目前使用的代码。我设法登录(当我调用“在浏览器中打开”功能时,我看到我已登录)。我还设法“点击”网站上“parse2”部分的第一个按钮(如果我在parse2之后调用“open_in_browser”,我会看到网站顶部的导航栏更深了一层 现在的主要问题是“parse3”部分,因为我无法再深入

我试图使用Scrapy登录到一个网站,然后在该网站中导航,最终从中下载数据。目前我被困在导航部分的中间。以下是我自己研究的解决问题的方法

  • 关于刮痧的数据营课程
  • 然而,我似乎没有把这些点联系起来

    下面是我目前使用的代码。我设法登录(当我调用“在浏览器中打开”功能时,我看到我已登录)。我还设法“点击”网站上“parse2”部分的第一个按钮(如果我在parse2之后调用“open_in_browser”,我会看到网站顶部的导航栏更深了一层

    现在的主要问题是“parse3”部分,因为我无法再深入浏览另一个层次(或者我可以,但“open_in_browser”不会再打开网站-只有在我将其放在parse或parse2之后)。我的理解是,我将多个“parse functions”放在一个又一个的位置,以浏览网站

    Datacamp说我总是需要从一个“启动请求函数”开始,这是我尝试过的,但在YouTube视频中,等等。我看到证据表明,大多数直接从解析函数开始。在parse 3网站上使用“inspect”时,我发现这一次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()
    
    import scrapy
    从scrapy.http导入FormRequest
    从scrapy.utils.response导入在浏览器中打开
    从scrapy.crawler导入crawler进程
    类登录刮片机(刮片机):
    name=“登录”
    起始URL=[“”]
    def解析(自我,响应):
    loginTicket=response.xpath('/html/body/section/div/div/div/div[2]/form/div[3]/input[1]/@value')。首先提取()
    execution=response.xpath('/html/body/section/div/div/div[2]/form/div[3]/input[2]/@value')。首先提取
    返回FormRequest.from_response(response,formdata={
    “loginTicket”:loginTicket,
    “执行”:执行,
    “用户名”:“,
    “密码”:“”},
    callback=self.parse2)
    def parse2(自我,响应):
    下一页url=response.xpath('/html/body/nav/div[2]/ul/li/a/@href')。先提取
    生成scrapy.Request(url=next\u page\u url,callback=self.parse3)
    def parse3(自我,响应):
    下一页\u url\u 2=response.xpath('/html//div[@class=“headerPanel”]/div[3]/a/@href')。首先提取()
    绝对url=response.urljoin(下一页url)
    生成scrapy.Request(url=absolute\u url,callback=self.start\u scraping)
    def启动_刮洗(自身,响应):
    在浏览器中打开(响应)
    进程=爬网进程()
    进程爬网(登录刮板)
    process.start()
    
    您需要定义才能完整地抓取网站。假设您希望抓取网站标题中的所有链接,然后打开该链接以查看该链接所指的主页

    为了实现这一点,首先确定需要为这些链接刮取和标记CSS或XPath选择器的内容,并将它们放入规则中。每个规则都有一个默认回调,用于
    parse
    ,或者您也可以将其分配给其他方法。我附带了一个创建规则的虚拟示例,您可以将其相应地映射到您的案例:

    rules = (
        Rule(LinkExtractor(restrict_css=[crawl_css_selectors])),
        Rule(LinkExtractor(restrict_css=[product_css_selectors]), callback='parse_item')
    )
    

    您检查过日志了吗?您可以使用
    self.logger.debug()
    在那里记录消息,您可以记录
    absolute\u url
    的内容,查看它是否包含预期的url。