python爬虫模拟登录初体验

第一次学习爬虫,自己真是醉醉哒,因为实验室项目需要,所以迅速学习了一下,这次做的是一个带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即可登录成功,原来爬虫也这么有趣,最后再一次感谢某殷,
继续加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值