Python 基于Scrapy的爬虫无法登录网站
我使用两种方法登录网站。基于Scrapy的方法失败,而使用urlib2的方法成功。我只是对第一种方法失败的原因感到困惑,正如我在教程中所做的那样 基于刮片的方法。返回页面只是登录页面。我在setting.py中设置了cooike enablePython 基于Scrapy的爬虫无法登录网站,python,scrapy,Python,Scrapy,我使用两种方法登录网站。基于Scrapy的方法失败,而使用urlib2的方法成功。我只是对第一种方法失败的原因感到困惑,正如我在教程中所做的那样 基于刮片的方法。返回页面只是登录页面。我在setting.py中设置了cooike enable class AccountSpider(InitSpider): name = "counting" allowed_domains = ["domain.com"] login_page = 'https://www.domain
class AccountSpider(InitSpider):
name = "counting"
allowed_domains = ["domain.com"]
login_page = 'https://www.domain.com/login.aspx?code=1'
start_urls = ["https://www.domain.com/Search/Search.aspx"]
rules = ()
def start_requests(self):
return self.init_request()
def init_request(self):
print 'login init'
return [Request(url=self.login_page, callback=self.login)]
def login(self, response):
print 'login ing'
return FormRequest.from_response(response,
formdata={'__VIEWSTATE':'/+a_fix_string',
'__EVENTVALIDATION':'/+a_fix_string',
'username':'username',
'password':'password',
'EnableAutoLogin':'on',
'LoginButton.x':'24',
'LoginButton.y':'9'},
callback=self.check_login_response)
def check_login_response(self,response):
# check if login successfully
if 'Welcome' in response.body:
print 'login in successfully'
else:
print 'login in failed'
def parse_item(self, response):
pass
方法基于urllib2。成功登录
def login():
cookie_support= urllib2.HTTPCookieProcessor(cookielib.CookieJar())
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
postdata=urllib.urlencode({
'__VIEWSTATE':'/+a_fix_string',
'__EVENTVALIDATION':'/+a_fix_string',
'username':'username',
'password':'password',
'EnableAutoLogin':'on',
'LoginButton.x':'24',
'LoginButton.y':'9'
})
agent = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31'
}
req = urllib2.Request(
url='https://www.domian.com/login.aspx?code=1',
data = postdata,
headers = agent
)
result = urllib2.urlopen(req)
return result
if __name__ == '__main__':
login()
根据,FormRequest对象应该放在列表理解中。文档中的示例:
return [FormRequest(url="http://www.example.com/post/action",
formdata={'name': 'John Doe', 'age': '27'},
callback=self.after_post)]
您是否已检查了FormRequest.from_response(…).url?页面中有不同的表单吗?您是否也尝试过通过
headers={“User Agent”:..}
设置用户代理?我在settings.py中设置了“User\u Agent”。返回FormRequest.from_response(…).url与登录页面url不同。您应该选中formname
以选择正确的表单,和/或使用.replace(url=self.login_页面)
强制发送所需的url。还要检查FormRequest.from_response(response,…)的response.url是否正确。return FormRequest.from_response(response,…)的url不同。我添加了“Don_click=True”,但它不起作用。我不明白“formname”参数的含义。