第一次学习爬虫,自己真是醉醉哒,因为实验室项目需要,所以迅速学习了一下,这次做的是一个带cookie的模拟登录,其中遇到了许许多多的问题,最难的就是要访问的页面加入了csrf跨站请求伪造验证(因为我是渣渣,,所以感到很难做)和如何带cookie来模拟登录,最后在好友某殷的帮助下,顺利解决了问题。先贴代码
# -*- coding: utf-8 -*- import urllib2 import urllib import cookielib import re from bs4 import BeautifulSoup import requests
user_agent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36" headers=dict({ "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Encoding":"gzip, deflate", "Accept-Language":"zh-CN,zh;q=0.8", "Connection":"keep-alive", "User-Agent":user_agent})
login_url = "http://www.****.cn/users/sign" session=requests.session()
#利用session来获取并存储请求的页面的cookie,否则先获取token,cookie会过期 html =session.get(login_url,headers=headers).text #利用带有Session的页面通过BeautifulSoup抓取token验证码 htmlDoc=BeautifulSoup(html,'html.parser') token=htmlDoc.find_all('meta')[-1]['content'] #构造请求数据 postdata = urllib.urlencode({"utf8":"✓", "authenticity_token":token, "user[username]":"***", "user[password]":"*******", "user[remember_me]":"0", "commit":"登录"}) #打印请求返回HTTP状态码 print (session.post(url=login_url,params=postdata,headers=headers)) #抓取登录后的页面 res=session.get("http://www.****.cn/msia/all?page=5").text print res是的,就这么短,我却研究了两天(哭 ,难点主要在于如何抠出csrf,经过学习请教某殷,使用了非常强大的BeautifulSoup工具(还不怎么会玩),然后最头疼的问题是,
一切都布置好后,一直出现HTTP 422状态错误,一开始以为是抓取后编码不对,于是各种尝试修改字符编码,结果都没卵用,后来各种查阅,发现了是之前写的请求方法错了,
我一开始就先这么写:
''' 过期的抓取方法 def gethtml(url): page = urllib.urlopen(url) html = page.read() return html def get_token(): url = "http://www.****.cn/users/sign_in" content = gethtml(url) soup = BeautifulSoup(content, "html.parser") input_tag=soup.input.next_sibling return input_tag['value'] '''token=get_token()
session=requests.session()
session.post(url=login_url,params=postdata,headers=headers) #直接请求 问题所在点res=session.get("http://www.****.cn/msia/all?page=5").text print res于是就出现了的post以后,抓取的仍是登录界面,究其原因就是先进行了token进行了抓取,然后才post请求调用session,这样就造成了之前的token过期,
所以需要先用session请求,保存请求的页面,再用BeautifulSoup抓取,再用同一个session post即可登录成功,原来爬虫也这么有趣,最后再一次感谢某殷,继续加油!