[英]Selenium, Scrapy Iteration (click next) only extract href of items from first page
我尝试提取每个项目的 href(每页六个)。 要转到下一页,我使用 next_click()。 Selenium webdriver 打开并点击所有页面(到目前为止还好)。 但只从第一页提取项目。 那五次(与存在的页面一样多)。 看起来,它识别了正确的项目数,但只重新提取了第一页的项目。 注意:如果您单击下一页,网址将保持不变。 非常感谢你的帮助!
import scrapy
from pprint import pprint
import time
from scrapy.linkextractors import LinkExtractor
from selenium import webdriver
class contentSpider(scrapy.Spider):
name = "university"
start_urls = [
'http://unisg.prospective.ch/index.cfm'
]
def __init__(self):
self.driver = webdriver.Firefox()
def parse(self, response):
self.driver.get(response.url)
while True:
next = self.driver.find_element_by_xpath('//a[@id="btn-forward"]')
try:
next.click()
time.sleep(3)
items = response.xpath('//div[@class="section group jobContent countJobRecords"]')
for i in items:
list_div = s.xpath('.//div')
link = list_div.xpath('.//a/@href').extract_first()
yield joblink_item(link=link)
except:
break
response
是由 scrapy 创建的,而self.driver
是一个 selenium 对象。
两者互不了解,更新一个不会自动更新另一个。
因此,您只需一遍又一遍地从相同的响应中提取相同的数据。
有几种方法可以解决您的问题:
由于有问题的网站似乎根本不需要硒(单击下一个按钮只是发送一个发布请求),我会推荐第一个选项。
Scrapy-only方法的解释:
如果您在单击下一页按钮时查看浏览器开发人员工具的网络选项卡,您将看到一个包含以下详细信息的请求:
要得到你想要的数据,你只需要修改并执行这个请求。
测试表明,甚至可以使用单个请求获取所有数据:
>>> request = scrapy.FormRequest(
... url="http://unisg.prospective.ch/index.cfm",
... formdata={"offset": "0", "limit": "30", "lang": "de", "query": ""},
... )
>>> fetch(request)
2020-11-05 11:36:17 [scrapy.core.engine] DEBUG: Crawled (200) <POST http://unisg.prospective.ch/index.cfm> (referer: Non
e)
>>> len(response.css('.jobContent'))
30
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.