我试图从亚马逊机械土耳其抓取一些数据,我只能在不登录的情况下查看结果的前几页。事实证明,亚马逊需要使用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的解决方案。我觉得这个案子在这里类似吗?
更新: 我自己解决了这个问题。 似乎根本不需要使用硒。问题在于我必须在提交请求期间指定正确的标头。 我手动设置从浏览器中抓取的所有标题,并且它有效。
答案 0 :(得分:0)
我遇到了完全相同的问题,但我发现其中一个标头值是用户代理,而不是手动设置请求标头。在我的项目设置文件中设置此值可以解决这个问题,现在我不必对标头值进行硬编码:
USER_AGENT =' Mozilla / 5.0(Windows NT 6.1; rv:32.0)Gecko / 20100101 Firefox / 32.0'
或您正在使用的浏览器的任何值。
现在,Cookie正常运行 - 自动。