Version: 3.5
IDE: Pycharm
浏览器:Chrome
方法一:使用已知的cookie访问
服务器用cookie来区分不同的客户端,我们可以利用已知的cookie伪装成客户端来跟服务器进行对话。
以登录豆瓣为例,我们首先利用已有的账号登录,F12打开开发者工具--network,找到cookie并保存
之后我们便可以写代码了
# -*- coding: utf-8 -*-
import sys
import io
from urllib import request
#保存的cookie
cookies_str = r'bid=3waAC55M6es;_pk_ref.100001.8cb4=%5B%22%22%2C%22%22%2C1525523743%2C%22https%3A%2F%2Fwww.sogou.com%2Flink%3Furl%3DDSOYnZeCC_oPL4RhSawS8wPxkpP3ahf1Hoi5o78Y5aI.%22%5D;_pk_ses.100001.8cb4=*;__utma=30149280.1440123195.1525523744.1525523744.1525523744.1;__utmc=30149280;__utmz=30149280.1525523744.1.1.utmcsr=sogou.com|utmccn(referral)|utmcmd=referral|utmcct=/link;ap=1;ps=y;__yadk_uid=KkrhMC9Mwu99TnK2mThHMKtPuQrnqdTd;push_noty_num=0;push_doumail_num=0;__utmt=1;__utmv=30149280.14946; ll="118183"; _pk_id.100001.8cb4=9d48f465c1bee094.1525523743.1.1525525073.1525523743.; __utmb=30149280.4.10.1525523744'
#需要登录才能访问的网站
url = 'https://www.douban.com'
#设置请求头
req = request.Request(url)
req.add_header('cookie',cookies_str)
#选择一个User-Agent
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36')
resp = request.urlopen(req)
print(resp.read().decode('utf-8'))
2.模拟登录后再携带得到的cookie访问
在代码中直接提交用户名和密码来登录访问。
同样在浏览器的Network中
代码如下
# -*- coding: UTF-8 -*-
import sys
import io
import urllib.request
import http.cookiejar
#登录时需要POST的数据
data = {'source':'index_nav',
'form_email':'******',
'form_password':'******'}
post_data = urllib.parse.urlencode(data).encode('utf-8')
#设置请求头
headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}
#登录时表单提交到的地址(用开发者工具可以看到)
login_url = ' https://www.douban.com/accounts/login'
#构造登录请求
req = urllib.request.Request(login_url, headers = headers, data = post_data)
#构造cookie
cookie = http.cookiejar.CookieJar()
#由cookie构造opener
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie))
#发送登录请求,此后这个opener就携带了cookie,以证明自己登录过
resp = opener.open(req)
#登录后才能访问的网页
url = 'https://www.douban.com'
#构造访问请求
req = urllib.request.Request(url, headers = headers)
resp = opener.open(req)
print(resp.read().decode('utf-8'))
如果直接使用requests库会更简单一些
# -*- coding: UTF-8 -*-
import requests
import sys
import io
#登录时需要POST的数据
data = {'source':'index_nav',
'form_email':'******',
'form_password':'******'}
#设置请求头
headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}
#登录时表单提交到的地址(用开发者工具可以看到)
login_url = 'https://www.douban.com/accounts/login'
#构造Session
session = requests.Session()
#在session中发送登录请求,此后这个session里就存储了cookie
#可以用print(session.cookies.get_dict())查看
resp = session.post(login_url, data)
#登录后才能访问的网页
url = 'https://www.douban.com'
#发送访问请求
resp = session.get(url)
print(resp.content.decode('utf-8'))