【发布时间】:2025-11-23 03:55:01
【问题描述】:
我正在尝试从具有大量 AJAX 调用和 javascript 执行的页面中抓取数据以呈现网页。所以我正在尝试使用带有 selenium 的 scrapy 来执行此操作。作案手法如下:
将登录页面URL添加到scrapy start_urls列表中
使用 formrequest from response 方法发布用户名和密码以进行身份验证。
- 登录后,请求抓取所需页面
- 将此响应传递给 Selenium Webdriver 以单击页面上的按钮。
- 单击按钮并呈现新网页后,捕获结果。
我目前的代码如下:
from scrapy.spider import BaseSpider
from scrapy.http import FormRequest, Request
from selenium import webdriver
import time
class LoginSpider(BaseSpider):
name = "sel_spid"
start_urls = ["http://www.example.com/login.aspx"]
def __init__(self):
self.driver = webdriver.Firefox()
def parse(self, response):
return FormRequest.from_response(response,
formdata={'User': 'username', 'Pass': 'password'},
callback=self.check_login_response)
def check_login_response(self, response):
if "Log Out" in response.body:
self.log("Successfully logged in")
scrape_url = "http://www.example.com/authen_handler.aspx?SearchString=DWT+%3E%3d+500"
yield Request(url=scrape_url, callback=self.parse_page)
else:
self.log("Bad credentials")
def parse_page(self, response):
self.driver.get(response.url)
next = self.driver.find_element_by_class_name('dxWeb_pNext')
next.click()
time.sleep(2)
# capture the html and store in a file
到目前为止,我遇到的两个障碍是:
第4步不起作用。每当selenium打开firefox窗口时,它总是在登录屏幕上,不知道如何过去。
不知道怎么实现第5步
任何帮助将不胜感激
【问题讨论】:
-
理论上,您可以使用
add_cookie方法将scrapy响应cookie传递给驱动程序,请参见:*.com/questions/16563073/…和*.com/questions/19082248/…。不过,为什么不按照 Eric 的建议使用selenium登录呢?谢谢。 -
我可以这样做,但我不想失去在scrapy引擎盖下运行的令人敬畏的扭曲代码。我计划在通过身份验证后抓取大量 URL,并希望这样做它以非阻塞方式..我的想法错了吗??