我是Scrapy的新手,随后是Python,因此一直非常依赖于搜索其他人的问题来实现这一目标,但是我无法找到任何可以帮助我解决这个问题。
我首先要处理的脚本必须登录一个大量使用JS的asp页面。我花了一段时间来包裹我,但我终于通过使用硒来通过它。当我运行脚本时,它会启动浏览器,登录并成功显示我想要的页面。但是,当我尝试抓取数据时,它会返回原始登录页面的结果。我也在Scrapy shell中运行它以达到同样的效果,我不确定这个问题的根源是什么。所以为了保持简单,我一直在选择标题,当它应该返回我想要的页面的标题而不是返回“登录”。
其他一些可能相关的信息:我尝试了几个不同的页面来登录。目前我正在传递我想要的页面,然后将scrapy发送到登录页面,如下所示:(转到 - > www.site.com,网站将scrapy发送到https://www.site.com/login.aspx?pg=1&view=all&next=http%3a%2f%2fwww.site.com,转到 - > www.site .com,正确的页面出现在浏览器中。使用hsx获取标题.title =“登录”。另外我不确定一个蜘蛛是否比另一个更合适。我从基础开始,目前正在爬行,没有注意任何差异。
感谢您的帮助!
from scrapy.spider import BaseSpider
from scrapy.http import Response,FormRequest,Request
from scrapy.selector import HtmlXPathSelector
from selenium import webdriver
from ex.items import exItem
from scrapy import log
from scrapy.contrib.spiders import CrawlSpider, Rule
class ex(CrawlSpider):
name = 'ex'
start_urls = ['http://www.site.com']
def get_cookies(self):
driver = webdriver.Firefox()
driver.implicitly_wait(12)
base_url = "http://www.site.com"
driver.get(base_url)
driver.find_element_by_name("email").clear()
driver.find_element_by_name("email").send_keys("123")
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys("123")
driver.find_element_by_name("signin").click()
cookies = driver.get_cookies()
return cookies
def parse(self, response,my_cookies=get_cookies):
return Request(url="http://www.site.com",
cookies=self.get_cookies(),
callback=self.login)
def login(self,response):
return [FormRequest.from_response(response, formdata={'email': '123', 'password': '123'},
dont_filter=True, callback=self.after_login)]
def after_login(self, response):
return Request(url="http://www.site.com", dont_filter=True, callback=self.parse_page)
def parse_page(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.select("//title")
items = []
for site in sites:
item = exItem()
item['title'] = site.select('//title/text()').extract()
items.append(item)
return items
driver.close()