Python-Scrapy-浏览网站

时间:2019-12-29 13:42:53

标签: python web-scraping scrapy navigation

我正在尝试使用scrapy登录网站,然后在网站内进行浏览,最后从网站下载数据。目前,我停留在导航部分的中间。这是我自己解决问题所考虑的事情。

  1. 有关Scrapy的Datacamp课程
  2. https://www.youtube.com/watch?v=G9Nni6G-iOc
  3. http://scrapingauthority.com/2016/11/22/scrapy-login/
  4. https://www.tutorialspoint.com/scrapy/scrapy_following_links.htm
  5. Relative url to absolute url 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() 

1 个答案:

答案 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