# _*_ coding: utf-8 _*_
import os
import sqlite3
import requests
from win32.win32crypt import CryptUnprotectData
def getcookiefromchrome(host='.douban.com'):
'''最好还是从浏览器自动获取当前登录帐号的cookies,
然后再抓取内容,这里是演示从Google Chrome中获取cookies的例子。
host 登录服务器的主域名,注意要在前面加个点号。
'''
cookiepath=os.environ['LOCALAPPDATA']+r"\Google\Chrome\User Data\Default\Cookies"
sql="select host_key,name,encrypted_value from cookies where host_key='%s'" % host
with sqlite3.connect(cookiepath) as conn:
cu=conn.cursor()
cookies={name:CryptUnprotectData(encrypted_value)[1].decode() for host_key,name,encrypted_value in cu.execute(sql).fetchall()}
print(cookies)
return cookies
url='http://www.douban.com'
httphead={'User-Agent':('Mozilla/5.0 (Windows NT 6.2 WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'),}
r=requests.get(url,headers=httphead,cookies=getcookiefromchrome('.douban.com'),allow_redirects=1)
print(r.text)
需要安装的第三方模块:requests,pywin32
那么你在用爬虫爬取的时候获得的页面究竟是哪个呢?肯定是第二个,不可能说你不用登录就可以访问到一个用户自己的主页信息,那么是什么让同一个URL在爬虫访问时出现不同内容的情况呢?
在第一篇中我们提到了一个概念,cookie,因为HTTP是无状态的,所以对方服务器并不知道这次请求到底来自于谁,就好像突然你收到了一封信,上面让你给他寄一些东西,但是信上却没有他的联系方式。
在HTTP中也是如此,我们普通的请求都类似于匿名信,而cookie的出现,就是让这封信上盖上了你自己的名字。
在请求时附带上你的cookie,服务器放就会知道这次请求来自于谁,然后你点击个人信息页,服务器就知道是要返回这个cookie对应的用户的信息页了。
在谷歌浏览器中,你可以在控制台Application里面找到当前网站的所有cookie键值对。一般来说用于确认你个人信息的只有一个键值对,但是你也可以把所有的都用上,并不能保证对方服务器是不是对某些键值对也进行检查了。
很多网站在你没有登录的情况下并不会给过多的数据让你看,所以你的爬虫需要进行一次模拟登录。
模拟登录需要从一个网站的登录界面开始,因为我们要在这里用爬虫发送post请求附带账号密码来登录对方网站。
1.读取本地用户文件,或者账号名和密码2.使用md5对用户密码进行加密
3.获取session的临时随机串及sessionid
4.对随机串及用户密码进行二次md5加密生成新的请求秘钥串
5.传递用户名、新的秘钥串及sessionid模拟用户登录