我正在尝试从具有大量 AJAX 调用和 javascript 执行的页面中抓取数据来呈现网页。所以我尝试使用 scrapy 和 selenium 来执行此操作。作案手法如下:
将登录页面URL添加到scrapy start_urls列表中
使用响应方法中的 formrequest 发布用户名和密码以进行身份验证。
- 登录后,请求抓取所需页面
- 将此响应传递给 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步
任何帮助将不胜感激
我不相信你可以像这样在 scrapy Requests 和 selenium 之间切换。您需要使用selenium而不是yield Request()登录站点。您使用 scrapy 创建的登录会话不会转移到 selenium 会话。这是一个示例(元素 ids/xpath 对您来说会有所不同):
scrape_url = "http://www.example.com/authen_handler.aspx"
driver.get(scrape_url)
time.sleep(2)
username = self.driver.find_element_by_id("User")
password = self.driver.find_element_by_name("Pass")
username.send_keys("your_username")
password.send_keys("your_password")
self.driver.find_element_by_xpath("//input[@name='commit']").click()
那么你可以这样做:
time.sleep(2)
next = self.driver.find_element_by_class_name('dxWeb_pNext').click()
time.sleep(2)
etc.
编辑:如果您需要渲染 javascript 并担心速度/非阻塞,您可以使用http://splash.readthedocs.org/en/latest/index.html这应该可以解决问题。
http://splash.readthedocs.org/en/latest/scripting-ref.html#splash-add-cookie有关于传递cookie的详细信息,你应该能够从scrapy传递它,但我以前没有这样做过。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)