我刚开始使用scrapy和Selenium,我在删除无限滚动的网页时遇到了一些问题:
http://observador.pt/opiniao/autor/ahcristo
所以,我想提取每个条目的链接(政治文本)。单独使用scrapy是不可能的,因为需要向下滚动才能显示所有条目。我使用selenium来模拟chrome浏览器和滚动dow。我的问题是滚动不起作用。我根据this或this等其他类似示例制作了代码。代码计算每次滚动后的条目链接总数,如果工作正常,则应在每个步骤后增加。它给了我一定数量的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()
答案 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§ion=author&scroll_type=usual&data_id=74&data_type=1&exclude=&nonce=5145441fea'