在登录期间使用Scrapy处理Cookie

时间:2014-06-30 11:05:18

标签: python cookies selenium scrapy amazon

我试图从亚马逊机械土耳其抓取一些数据,我只能在不登录的情况下查看结果的前几页。事实证明,亚马逊需要使用cookie来记录会话,所以最简单的方法是只需提交一份表格请求,因为很多例子都不会起作用。

我试图传递一些饼干,虽然我认为scrapy会自动处理,但它不起作用。如果我在提交表单后执行open_in_browser,我会得到亚马逊页面,说我应该启用cookie才能登录。

然后我来到另一个帖子,他用硒来获取饼干。我也尝试过,同样的事情发生了。

这就是我现在所拥有的。我已将COOKIES_ENABLED = True添加到settings.py

通过将COOKIES_DEBUG添加到设置中,我认为通过简单地使用InitSpider查看日志来接收和设置cookie,而不使用selenium。但它不会起作用。

from scrapy.spider import Spider
from scrapy.selector import Selector
from scrapy.http import Request, FormRequest
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.utils.response import open_in_browser
from mturk.items import MturkItem
from selenium import webdriver

class MturkSpider(Spider):
    name = "AMT"
    allowed_domains = ["mturk.com","amazon.com"]
    start_url='https://www.mturk.com/mturk/viewhits?searchWords=&selectedSearchType=hitgroups&sortType=Title%3A1&pageNumber=1&searchSpec=HITGroupSearch%23T%231%2310%23-1%23T%23%21%23%21Title%211%21%23%21'
    login_page = "https://www.mturk.com/mturk/beginsignin"
    formdata ={'create':'0','email': 'xxx@example.com', 'password': '1234'}


    def get_cookies(self):
        driver = webdriver.Firefox()
        driver.implicitly_wait(30)
        base_url = "https://www.mturk.com/mturk/beginsignin"
        driver.get(base_url)
        driver.find_element_by_name("email").clear()
        driver.find_element_by_name("email").send_keys("xxx@example.com")
        driver.find_element_by_name("password").clear()
        driver.find_element_by_name("password").send_keys("1234")
        driver.find_element_by_id("signInSubmit-input").click()
        cookies = driver.get_cookies()
        driver.close()
        return cookies

    def start_requests(self):
        self.my_cookies =  self.get_cookies()
        yield Request(self.login_page, 
            cookies = self.get_cookies(),
            callback = self.login,
        )

    def login(self, response):
        yield FormRequest.from_response(response, 
            formdata = self.formdata,
            # cookies=self.my_cookies,
            callback = self.after_login,
        )

    def after_login(self,response):
        open_in_browser(response) # where it says I need to enable cookies
        yield Request(self.start_url, 
            # cookies=self.my_cookies,
            callback = self.parse_page,
        )

    def parse_page(self, response):
        # do the parsing, where I can successfully crawl the first few pages

我对python和这个社会都很陌生。我不得不说我的知识在这方面非常有限,我只能向别人学习。工作。有人建议让它发挥作用吗?

我找到了关于亚马逊登录的urllib2 / mechanize的解决方案,但没有使用Request的解决方案。我觉得这个案子在这里类似吗?

更新: 我自己解决了这个问题。 似乎根本不需要使用硒。问题在于我必须在提交请求期间指定正确的标头。 我手动设置从浏览器中抓取的所有标题,并且它有效。

1 个答案:

答案 0 :(得分:0)

我遇到了完全相同的问题,但我发现其中一个标头值是用户代理,而不是手动设置请求标头。在我的项目设置文件中设置此值可以解决这个问题,现在我不必对标头值进行硬编码:

USER_AGENT =' Mozilla / 5.0(Windows NT 6.1; rv:32.0)Gecko / 20100101 Firefox / 32.0'

或您正在使用的浏览器的任何值。

现在,Cookie正常运行 - 自动。

相关问题