2

我是 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 获取标题。标题 =“登录”。我也是不确定一只蜘蛛是否比另一只蜘蛛更合适。我从基地开始,目前正在爬行,没有发现任何差异。

感谢您的任何帮助!

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()
4

0 回答 0