文章目录
requests
作用:发送网络请求,返回相应数据
- requests的底层实现就是urllib
- requests在Python2和Python3通用,方法完全一样
- requests简单易用
- requests能够自动帮助我们解压(gzip压缩的)网页内容
response.text和response.content的区别
response.text
- 类型:str
- 修改编码方式:response.encoding = 'utf-8'
response.content
- 类型:bytes
- 修改编码方式:response.content.decode('utf8')
url='http://www.baidu.com'
response = requests.get(url)
response的常用方法:
response.text # 返回文本str
response.content # 返回文本bytes
response.status_code # 返回状态码
response.request.headers # 返回请求头
response.headers # 返回响应头
贴吧练习-GET
import requests
class TiebaSpider(object):
def __init__(self, tieba_name):
self.tieba_name = tieba_name
self.url_temp = "http://tieba.baidu.com/f?kw=" + tieba_name + "&ie=utf-8&pn={}"
self.headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}
def get_url_list(self):
'''构造url列表'''
# url_list = []
# for i in range(10):
# url_list.append(self.url_temp.format(i * 50))
# return url_list
return [self.url_temp.format(i*50) for i in range(10)]
def parse_url(self, url):
print(url)
'''发送请求,获取相应'''
response = requests.get(url, headers=self.headers)
# return response.content.decode()
return response.text
def save_html(self, html_str, page_num):
'''保存页面'''
file_path = "{}-第{}页.html".format(self.tieba_name,page_num)
with open(file_path, 'w') as f:
f.write(html_str)
def run(self):
'''实现主要逻辑'''
# 1 构造url列表
url_list = self.get_url_list()
# 2 遍历 发送请求获取相应
for url in url_list:
html_str = self.parse_url(url)
# 3 保存
page_num = url_list.index(url) + 1
self.save_html(html_str, page_num)
if __name__ == '__main__':
tieba_spider = TiebaSpider('lol')
tieba_spider.run()
百度翻译案例-POST
# 由于百度翻译做了js加密,返回状态会不正确
import requests
headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}
data = {
'from': 'en',
'to': 'zh',
'query': 'hello',
'transtype': ' realtime',
'simple_means_flag': ' 3',
'sign': '54706.276099',
'token': 'ae11be6979809815cc7e99bc1b05cb77',
}
post_url = 'https://fanyi.baidu.com/v2transapi'
# POST请求传参
r = requests.post(post_url,data=post_data,headers=headers)
print(r.text)
使用代理
为什么爬虫需要使用代理?
- 让服务器以为不是同一个客户端在请求
- 防止我们的真实地址被泄露,防止被追究
用法:requests.get('http://www.baidu.com',proxies = proxies)
proxies的形式:字典
proxies = {
'http':'http://12.34.56.79:9527',
'https':'http://12.34.56.79:9527',
}
实例:
import requests
proxies = {'http':'http://117.191.11.112'}
headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}
r = requests.get('http://www.baidu.com',proxies = proxies,headers = headers)
print(r.status_code)
代理IP获取地址:https://www.xicidaili.com/
可以通过爬虫去获取相关的ip及类型
cookie和session区别
cookie:
- cookie数据存放在客户端的浏览器上,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
session:
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie
爬虫处理cookie和session:
- 带上cookie、session的好处:能够请求到登录之后的页面
- 带上cookie、session的弊端:一套cookie和session往往和一个用户对应请求太多,请求次数太多,容易被服务器识别为爬虫
- 不需要cookie的时候尽量不去使用cookie
- 但是为了获取登录之后的页面,我们必须发送带有cookies的请求
请求需要登录之后才能访问的页面
思路:
- 实例化session
- 先使用session发送请求,登录对应网站,把cookie保持在session中
- 在使用session请求登录之后才能访问的网站,session能够自动携带登录成功时保存在其中的cookie,进行请求
登录人人网实例:
import requests
session = requests.session()
post_url = "http://www.renren.com/PLogin.do"
post_data = {'email':'844297347@qq.com','password':''}
headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}
session.post(post_url,data=post_data,headers=headers)
r = session.get('http://www.renren.com/474133869/profile',headers = headers)
with open('renren.html','w') as f:
f.write(r.text)
不发送post请求,使用cookie获取登录后的页面
使用get方式请求:
- cookie过期时间很长的网站
- 在cookie过期之前能够拿到所有的数据,
- 配合其他程序一起使用,其他程序专门获取cookie,当前程序专门请求页面
import requests
headers = {
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
'cookie':'anonymid=joodgrmgdmis8y; depovince=GW; _r01_=1; JSESSIONID=abcLJGDv4LcbTg2TlqSCw; ick_login=eb10469b-1692-4fe6-9472-792fe7304317; first_login_flag=1; ln_uact=844297347@qq.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn221/20130723/1740/h_main_w77W_bf650000112f113e.jpg; loginfrom=syshome; ch_id=10016; jebe_key=1667c029-195e-4268-96a8-02ae9402f0f3%7C190f352586cb7e166243b51272b9d865%7C1542635744424%7C1%7C1542635744441; XNESSESSIONID=547fce9d2a89; wp_fold=0; _de=1FAF01AFA458C343C5BC13FF67F7809D696BF75400CE19CC; jebecookies=2b294466-09ce-4882-8280-a0245b1a9413|||||; p=72aba1cf6554a060c68509e8a870d3079; t=5ecd03d69418392a7c63c6818e00e2e09; societyguester=5ecd03d69418392a7c63c6818e00e2e09; id=474133869; xnsid=d3b36cc7'
}
# 这里的cookie是在网页上登录成功之后,复制过来的,可以直接使用,但是会有时间有效期
# 使用session进程请求登录之后才能访问的地址
r = requests.get('http://www.renren.com/474133869/profile',headers = headers,cookies=cookie)
with open('renren2.html','w') as f:
f.write(r.text)
response.text
- 类型:str
- 修改编码方式:response.encoding = 'utf-8'
response.content
- 类型:bytes
- 修改编码方式:response.content.decode('utf8')
url='http://www.baidu.com'
response = requests.get(url)
response的常用方法:
response.text # 返回文本str
response.content # 返回文本bytes
response.status_code # 返回状态码
response.request.headers # 返回请求头
response.headers # 返回响应头
import requests
class TiebaSpider(object):
def __init__(self, tieba_name):
self.tieba_name = tieba_name
self.url_temp = "http://tieba.baidu.com/f?kw=" + tieba_name + "&ie=utf-8&pn={}"
self.headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}
def get_url_list(self):
'''构造url列表'''
# url_list = []
# for i in range(10):
# url_list.append(self.url_temp.format(i * 50))
# return url_list
return [self.url_temp.format(i*50) for i in range(10)]
def parse_url(self, url):
print(url)
'''发送请求,获取相应'''
response = requests.get(url, headers=self.headers)
# return response.content.decode()
return response.text
def save_html(self, html_str, page_num):
'''保存页面'''
file_path = "{}-第{}页.html".format(self.tieba_name,page_num)
with open(file_path, 'w') as f:
f.write(html_str)
def run(self):
'''实现主要逻辑'''
# 1 构造url列表
url_list = self.get_url_list()
# 2 遍历 发送请求获取相应
for url in url_list:
html_str = self.parse_url(url)
# 3 保存
page_num = url_list.index(url) + 1
self.save_html(html_str, page_num)
if __name__ == '__main__':
tieba_spider = TiebaSpider('lol')
tieba_spider.run()
# 由于百度翻译做了js加密,返回状态会不正确
import requests
headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}
data = {
'from': 'en',
'to': 'zh',
'query': 'hello',
'transtype': ' realtime',
'simple_means_flag': ' 3',
'sign': '54706.276099',
'token': 'ae11be6979809815cc7e99bc1b05cb77',
}
post_url = 'https://fanyi.baidu.com/v2transapi'
# POST请求传参
r = requests.post(post_url,data=post_data,headers=headers)
print(r.text)
使用代理
为什么爬虫需要使用代理?
- 让服务器以为不是同一个客户端在请求
- 防止我们的真实地址被泄露,防止被追究
用法:requests.get('http://www.baidu.com',proxies = proxies)
proxies的形式:字典
proxies = {
'http':'http://12.34.56.79:9527',
'https':'http://12.34.56.79:9527',
}
实例:
import requests
proxies = {'http':'http://117.191.11.112'}
headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}
r = requests.get('http://www.baidu.com',proxies = proxies,headers = headers)
print(r.status_code)
代理IP获取地址:https://www.xicidaili.com/
可以通过爬虫去获取相关的ip及类型
cookie和session区别
cookie:
- cookie数据存放在客户端的浏览器上,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
session:
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie
爬虫处理cookie和session:
- 带上cookie、session的好处:能够请求到登录之后的页面
- 带上cookie、session的弊端:一套cookie和session往往和一个用户对应请求太多,请求次数太多,容易被服务器识别为爬虫
- 不需要cookie的时候尽量不去使用cookie
- 但是为了获取登录之后的页面,我们必须发送带有cookies的请求
请求需要登录之后才能访问的页面
思路:
- 实例化session
- 先使用session发送请求,登录对应网站,把cookie保持在session中
- 在使用session请求登录之后才能访问的网站,session能够自动携带登录成功时保存在其中的cookie,进行请求
登录人人网实例:
import requests
session = requests.session()
post_url = "http://www.renren.com/PLogin.do"
post_data = {'email':'844297347@qq.com','password':''}
headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}
session.post(post_url,data=post_data,headers=headers)
r = session.get('http://www.renren.com/474133869/profile',headers = headers)
with open('renren.html','w') as f:
f.write(r.text)
不发送post请求,使用cookie获取登录后的页面
使用get方式请求:
- cookie过期时间很长的网站
- 在cookie过期之前能够拿到所有的数据,
- 配合其他程序一起使用,其他程序专门获取cookie,当前程序专门请求页面
import requests
headers = {
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
'cookie':'anonymid=joodgrmgdmis8y; depovince=GW; _r01_=1; JSESSIONID=abcLJGDv4LcbTg2TlqSCw; ick_login=eb10469b-1692-4fe6-9472-792fe7304317; first_login_flag=1; ln_uact=844297347@qq.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn221/20130723/1740/h_main_w77W_bf650000112f113e.jpg; loginfrom=syshome; ch_id=10016; jebe_key=1667c029-195e-4268-96a8-02ae9402f0f3%7C190f352586cb7e166243b51272b9d865%7C1542635744424%7C1%7C1542635744441; XNESSESSIONID=547fce9d2a89; wp_fold=0; _de=1FAF01AFA458C343C5BC13FF67F7809D696BF75400CE19CC; jebecookies=2b294466-09ce-4882-8280-a0245b1a9413|||||; p=72aba1cf6554a060c68509e8a870d3079; t=5ecd03d69418392a7c63c6818e00e2e09; societyguester=5ecd03d69418392a7c63c6818e00e2e09; id=474133869; xnsid=d3b36cc7'
}
# 这里的cookie是在网页上登录成功之后,复制过来的,可以直接使用,但是会有时间有效期
# 使用session进程请求登录之后才能访问的地址
r = requests.get('http://www.renren.com/474133869/profile',headers = headers,cookies=cookie)
with open('renren2.html','w') as f:
f.write(r.text)
思路:
- 实例化session
- 先使用session发送请求,登录对应网站,把cookie保持在session中
- 在使用session请求登录之后才能访问的网站,session能够自动携带登录成功时保存在其中的cookie,进行请求
登录人人网实例:
import requests
session = requests.session()
post_url = "http://www.renren.com/PLogin.do"
post_data = {'email':'844297347@qq.com','password':''}
headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}
session.post(post_url,data=post_data,headers=headers)
r = session.get('http://www.renren.com/474133869/profile',headers = headers)
with open('renren.html','w') as f:
f.write(r.text)
使用get方式请求:
- cookie过期时间很长的网站
- 在cookie过期之前能够拿到所有的数据,
- 配合其他程序一起使用,其他程序专门获取cookie,当前程序专门请求页面
import requests
headers = {
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
'cookie':'anonymid=joodgrmgdmis8y; depovince=GW; _r01_=1; JSESSIONID=abcLJGDv4LcbTg2TlqSCw; ick_login=eb10469b-1692-4fe6-9472-792fe7304317; first_login_flag=1; ln_uact=844297347@qq.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn221/20130723/1740/h_main_w77W_bf650000112f113e.jpg; loginfrom=syshome; ch_id=10016; jebe_key=1667c029-195e-4268-96a8-02ae9402f0f3%7C190f352586cb7e166243b51272b9d865%7C1542635744424%7C1%7C1542635744441; XNESSESSIONID=547fce9d2a89; wp_fold=0; _de=1FAF01AFA458C343C5BC13FF67F7809D696BF75400CE19CC; jebecookies=2b294466-09ce-4882-8280-a0245b1a9413|||||; p=72aba1cf6554a060c68509e8a870d3079; t=5ecd03d69418392a7c63c6818e00e2e09; societyguester=5ecd03d69418392a7c63c6818e00e2e09; id=474133869; xnsid=d3b36cc7'
}
# 这里的cookie是在网页上登录成功之后,复制过来的,可以直接使用,但是会有时间有效期
# 使用session进程请求登录之后才能访问的地址
r = requests.get('http://www.renren.com/474133869/profile',headers = headers,cookies=cookie)
with open('renren2.html','w') as f:
f.write(r.text)