使用Scrapy在Selenium中向下滚动无法正常工作

时间:2016-04-27 07:59:16

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

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

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

所以,我想提取每个条目的链接(政治文本)。单独使用scrapy是不可能的,因为需要向下滚动才能显示所有条目。我使用selenium来模拟chrome浏览器和滚动dow。我的问题是滚动不起作用。我根据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()

1 个答案:

答案 0 :(得分:0)

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

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

只需尝试复制加载文章的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'