【问题标题】:Scrolling down in Selenium with Scrapy not working在 Scrapy 不工作的情况下在 Selenium 中向下滚动
【发布时间】:2016-08-21 09:26:19
【问题描述】:

我刚开始使用 scrapy 和 Selenium,在抓取无限滚动的网页时遇到了一些问题:

http://observador.pt/opiniao/autor/ahcristo

所以,我想提取每个条目(政治文本)的链接。单独使用scrapy是不可能的,因为需要向下滚动才能显示所有条目。我正在使用 selenium 来模拟 chrome 浏览器和向下滚动。我的问题是滚动不起作用。我根据thisthis 等其他类似示例编写代码。代码在每次滚动后计算入口链接的总数,如果它工作正常,它应该在每一步后增加。它给了我恒定数量的 24 个链接。

 ## -*- coding: utf-8 -*-

import scrapy
from selenium import webdriver
import time

from observador.items import ObservadorItem

class OpinionSpider(scrapy.Spider):
    name = "opinionspider"
    start_urls = ["http://observador.pt/opiniao/"]

    def __init__(self):
        self.driver = webdriver.Chrome()

    def parse(self, response):
        # Colunistas
        for url in response.xpath('//*[@id="main"]/div/div[1]/ul/li[1]/div/ul/li[*]/a/@href').extract():
            # test for a single author
            if url == 'http://observador.pt/opiniao/autor/ahcristo':            
                yield scrapy.Request(url,callback=self.parse_author_main_page)
            else:
                continue

    def parse_author_main_page(self,response):
        self.driver.get(response.url)

        count = 0
        for url in response.xpath('//*[@id="main"]/div/div[3]/div[1]/article[*]/h1/a/@href').extract():
            count += 1
        print "Number of links: ",count

        for i in range(1,100):
            self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(4)

            count = 0
            for url in response.xpath('//*[@id="main"]/div/div[3]/div[1]/article[*]/h1/a/@href').extract():
                count += 1
        print "Number of links: ",count

        self.driver.close()

【问题讨论】:

    标签: python selenium web-scraping scrapy infinite-scroll


    【解决方案1】:

    你用 Selenium 解决这个问题的方法可能有点矫枉过正。

    如果您查看要删除的网页是如何工作的,它只是通过执行 AJAX 请求来加载文章(它在 /wp-admin/admin-ajax.php 页面上发布)。

    只需尝试复制加载文章的 javascript 代码在您的蜘蛛中的工作方式。我会更快更轻松。

    这是一个有效的 cURL 查询,用于检索一些文章

     curl 'http://observador.pt/wp-admin/admin-ajax.php'
          -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8'
          --data 'action=obs_get_latest_articles&offset=2&section=author&scroll_type=usual&data_id=74&data_type=1&exclude=&nonce=5145441fea'
    

    【讨论】:

    • 好的,谢谢您的回答。你是怎么知道的?我承认我不太明白你的回答,我给你展示了一个作者“observador.pt/opiniao/autor/ahcristo”的例子。我需要对所有不同的作者应用相同的报废。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多