Cookie模拟登陆
1、什么是cookie、session
HTTP是一种无连接协议,客户端和服务器交互仅仅限于 请求/响应 过程,结束后断开,下一次请求时,服务器会认为是一个新的客户端,为了维护他们之间的连接,必须在一个地方保存客户端信息
cookie :通过在客户端记录的信息确定用户身份
session:通过在服务端记录的信息确定用户身份
2、案例 :利用Cookie模拟登陆人人网
1、一定要先登录成功1次,获取到cookie
requests模块
1、get(url,params=params,headers=headers)
params: 查询参数,字典,不用编码,也不用拼接URL
2、响应对象res的属性
1、encoding : 响应字符编码,res.encoding="utf-8"
2、text : 字符串
3、content : 字节流
4、status_code : 响应码
5、url : 返回实际数据的URL
3、非结构化数据存储
html = res.content
with open("XXX","wb") as f:
f.write(html)
4、post(url,data=data,headers=headers)
1、data :Form表单数据,字典,不用编码,不用转码
2、有道翻译
# 此处data为form表单数据
res = requests.post(url,data=data,headers=headers)
res.encoding = "utf-8"
html = res.text
get()方法中不同参数
1、代理IP(参数名: proxies)
1、获取代理IP的网站
西刺代理IP
快代理
全网代理
2、普通代理
1、格式 :proxies={"协议":"协议://IP地址:端口号"}
http://httpbin.org/get : 能够显示客户端的headers和IP
proxies = {"HTTP":"http://61.152.248.147:80"}
3、私密代理
1、格式
proxies = {"http":"http://用户名:密码@IP地址:端口号"}
4、链家二手房案例(MySQL数据库)
import requests
import re
import pymysql
class LianjiaSpider:
def __init__(self):
self.baseurl = "https://bj.lianjia.com/ershoufang/pg"
self.headers = {"User-Agent":"Mozilla/5.0"}
self.proxies = {"http":"http://309435365:szayclhp@116.255.162.107:16816"}
self.page = 1
self.db = pymysql.connect("localhost",
"root","123456","lianjia",
charset="utf8")
self.cursor = self.db.cursor()
def getPage(self,url):
res = requests.get(url,proxies=self.proxies,headers=self.headers)
res.encoding = "utf-8"
html = res.text
print("页面获取成功,正在解析...")
self.parsePage(html)
def parsePage(self,html):
p = re.compile('<div class="houseInfo">.*?data-el="region">(.*?)</a>.*?<div class="totalPrice">.*?<span>(.*?)</span>',re.S)
r_list = p.findall(html)
# r_list : [("富力城","500"),(),()]
print("解析成功,正在存入数据库...")
self.writeTomysql(r_list)
def writeTomysql(self,r_list):
ins = 'insert into house(name,price) \
values(%s,%s)'
for r in r_list:
L = [r[0].strip(),
float(r[1].strip())*10000]
self.cursor.execute(ins,L)
self.db.commit()
print("存入数据库成功")
def workOn(self):
while True:
c = input("爬按y,退出q:")
if c == "y":
url = self.baseurl + \
str(self.page) + "/"
self.getPage(url)
self.page += 1
else:
self.cursor.close()
self.db.close()
break
if __name__ == "__main__":
spider = LianjiaSpider()
spider.workOn()
1、找URL
第1页:https://bj.lianjia.com/ershoufang/pg1/
第2页:https://bj.lianjia.com/ershoufang/pg2/
2、正则
<div class="houseInfo">.*?data-el="region">(.*?)</a>.*?<div class="totalPrice">.*?<span>(.*?)</span>
3、写代码
5、链家二手房案例(MongoDB数据库)
import requests
import re
import pymongo
class LianjiaSpider:
def __init__(self):
self.baseurl = "https://bj.lianjia.com/ershoufang/pg"
self.headers = {"User-Agent":"Mozilla/5.0"}
self.proxies = {"http":"http://309435365:szayclhp@116.255.162.107:16816"}
self.page = 1
# 连接对象
self.conn = pymongo.MongoClient("localhost",27017)
# 库对象
self.db = self.conn["lianjia"]
# 集合对象
self.myset = self.db["house"]
def getPage(self,url):
res = requests.get(url,proxies=self.proxies,headers=self.headers)
res.encoding = "utf-8"
html = res.text
print("页面获取成功,正在解析...")
self.parsePage(html)
def parsePage(self,html):
p = re.compile('<div class="houseInfo">.*?data-el="region">(.*?)</a>.*?<div class="totalPrice">.*?<span>(.*?)</span>',re.S)
r_list = p.findall(html)
# r_list : [("富力城","500"),(),()]
print("解析成功,正在存入数据库...")
self.writeTomongo(r_list)
def writeTomongo(self,r_list):
for r in r_list:
D = {
"name":r[0].strip(),
"price":float(r[1].strip())*10000
}
self.myset.insert(D)
print("存入数据库成功")
def workOn(self):
while True:
c = input("爬按y,退出q:")
if c == "y":
url = self.baseurl + \
str(self.page) + "/"
self.getPage(url)
self.page += 1
else:
break
if __name__ == "__main__":
spider = LianjiaSpider()
spider.workOn()
>>>show dbs
>>>use 库名
>>>show collections
>>>db.集合名.find().pretty()
>>>db.集合名.count()
2、Web客户端验证(参数名:auth=(元组))
3、SSL证书认证(参数名:verify=True | False)
1、verify = True :默认,进行SSL证书认证
2、verify = False:不做认证
urllib.request中Handler处理器
1、定义
自定义的urlopen()方法,因为模块自带的urlopen不支持代理等功能,通过Handler处理器自定义urlopen方法
2、常用方法
1、opener = build_opener(某种功能Handler处理器对象)
2、opener.open(url)
3、使用流程
1、创建相关的Handler处理器对象
2、创建自定义opener对象
3、利用opener对象的open方法发请求获响应
4、Handler处理器分类
1、HTTPHandler() :没有特殊功能
2、ProxyHandler({普通代理})
代理格式 :{"":""}
3、ProxyBasicAuthHandler(密码管理器对象)
4、HTTPBasicAuthHandler(密码管理器对象)
5、密码管理器用途
1、私密代理
2、Web客户端认证
3、程序实现流程
1、创建密码管理对象
pwdmg = urllib.request.HTTPPasswordMgrWithDefaultRealm()
2、把认证信息添加到对象里面去
pwdmg.add_password(None,Webserver,user,password)
3、创建Handler处理器对象
proxy_handler = urllib.request.ProxyBasicAuthHandler(pwdmg)
4、创建自定义opener对象
opener = urllib.request.build_opener(proxy_handler)
5、利用opener对象的open方法发请求获响应
req = urllib.request.Request(url,headers=headers)
res = opener.open(req)
想要看更多的课程请微信关注SkrEric的编程课堂