路飞学城Python-Day142

第2节:UA身份伪装
反爬机制
User-Agent:请求载体的身份标识
通过不同的手段的当前的请求载体是不一样的,请求信息也是不一样的,常见的请求信息都是以键和值的形式存在
浏览器的开发者工具
NetWork-抓包工具
ResponseHeaders-响应头信息
RequestHeaders-请求头信息
User-Agent(UA):请求载体标识
网站会检查请求的UA,如果发现请求的UA是爬虫程序,则拒绝提供网站数据
反反爬机制:伪装爬虫程序的请求的UA
import urllib.request
url = 'http://www.baidu.com/'
# UA伪装
# 1.自制定一个请求对象
headers = {
#     存储任意的请求头信息
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
}
# 该请求对象进行了成功的伪装
req = urllib.request.Request(url=url, headers=headers)
# 2.针对自制定的请求对象发起请求
res = urllib.request.urlopen(req)
print(res.read())
 
第2节:post请求
爬取百度翻译的结果
network里的xhr就是全部是基于ajax的请求
import urllib.request
import urllib.parse
# 1.制定url
url = 'https://fanyi.baidu.com/sug'
# post请求所携带的参数处理流程
# 1.将请求参数封装到字典中
data = {
    'kw': '西瓜',
}
# 2.使用parse中的url encode进行编码处理
data = urllib.parse.urlencode(data)
 
# 3.将步骤2的编码结果转换为byte类型
data = data.encode()
 
# 2.发起post请求
# urlopen中的data表示的就是经过处理之后的post的请求参数
req = urllib.request.urlopen(url=url, data=data)
# print(req.read())
with open('./百度翻译.txt', 'wb') as fp:
    fp.write(req.read())

urllib的高级操作简介
三.urllib模块的高级操作
    1.代理
      - 什么是代理:代理就是第三方代替本体处理相关事务。例如:生活中的代理:代购,中介,微商......
  - 爬虫中为什么需要使用代理?
     一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会会禁止这个IP的访问。所以我们需要设置一些代理IP,每隔一段时间换一个代理IP,就算IP被禁止,依然可以换个IP继续爬取。
   - 代理的分类:
    正向代理:代理客户端获取数据。正向代理是为了保护客户端防止被追究责任。
    反向代理:代理服务器提供数据。反向代理是为了保护服务器或负责负载均衡。
import urllib.request
import urllib.parse
 
#1.创建处理器对象,在其内部封装代理ip和端口
handler=urllib.request.ProxyHandler(proxies={'http':'95.172.58.224:52608'})
#2.创建opener对象,然后使用该对象发起一个请求
opener=urllib.request.build_opener(handler)
 
 
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
 
request = urllib.request.Request(url, headers=headers)
 
#使用opener对象发起请求,该请求对应的ip即为我们设置的代理ip
response = opener.open(request)
 
with open('./daili.html','wb') as fp:
fp.write(response.read())
    2.cookie
         引言:有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们想要的目的,例如:
import urllib.request
import urllib.parse
#指定url
#自定义请求头信息
headers={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}
#自定义请求对象
request = urllib.request.Request(url=url,headers=headers)
#发起请求
response = urllib.request.urlopen(request)
 
with open('./renren.html','w') as fp:
fp.write(response.read().decode())
【注意】上述代码中,我们爬取到的是登录首页面,而不是张三的个人主页也面。why?首先我们来回顾下cookie的相关概念及作用
        - cookie概念:当用户通过浏览器首次访问一个域名时,访问的web服务器会给客户端发送数据,以保持web服务器与客户端之间的状态保持,这些数据就是cookie。
        - cookie作用:我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置30天内记住我,或者自动登录选项。那么它们是怎么记录信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服务器设置的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。就像我们去超市买东西,没有积分卡的情况下,我们买完东西之后,超市没有我们的任何消费信息,但我们办了积分卡之后,超市就有了我们的消费信息。cookie就像是积分卡,可以保存积分,商品就是我们的信息,超市的系统就像服务器后台,http协议就是交易的过程。 
        - 经过cookie的相关介绍,其实你已经知道了为什么上述案例中爬取到的不是张三个人信息页,而是登录页面。那应该如何抓取到张三的个人信息页呢?
  思路:
    1.我们需要使用爬虫程序对人人网的登录时的请求进行一次抓取,获取请求中的cookie数据
    2.在使用个人信息页的url进行请求时,该请求需要携带 1 中的cookie,只有携带了cookie后,服务器才可识别这次请求的用户信息,方可响应回指定的用户信息页数据
cookiejar对象:
- 作用:自动保存请求中的cookie数据信息
- 注意:必须和handler和opener一起使用
cookiejar使用流程:
- 创建一个cookiejar对象
import http.cookiejar
cj = http.cookiejar.CookieJar()
- 通过cookiejar创建一个handler
handler = urllib.request.HTTPCookieProcessor(cj)
- 根据handler创建一个opener
opener = urllib.request.build_opener(handler)
- 使用opener.open方法去发送请求,且将响应中的cookie存储到openner对象中,后续的请求如果使用openner发起,则请求中就会携带了cookie
使用cookiejar实现爬取人人网个人主页页面数据:
#使用cookiejar实现人人网的登陆
import urllib.request
import urllib.parse
import http.cookiejar
cj = http.cookiejar.CookieJar() #请求中的cookie会自动存储到cj对象中
#创建处理器对象(携带cookiejar对象的)
handler=urllib.request.HTTPCookieProcessor(cj)
#创建opener对象 (携带cookiejar对象)
opener=urllib.request.build_opener(handler)
 
#要让cookiejar获取请求中的cookie数据值
#自定义一个请求对象,让该对象作为opener的open函数中的参数
data={
"icode":"",
"domain":"renren.com",
"key_id":"1",
"captcha_type":"web_login",
"password":"40dc65b82edd06d064b54a0fc6d202d8a58c4cb3d2942062f0f7dd128511fb9b",
"rkey":"41b44b0d062d3ca23119bc8b58983104",
}
data=urllib.parse.urlencode(data).encode()
request=urllib.request.Request(url,data=data)
opener.open(request)
 
#获取当前用户的二级子页面
#该次请求中就携带了cookie
resonse=opener.open(s_url)
 
with open('./renren.html','wb') as fp:
fp.write(resonse.read())
 

request简介
1.什么是request模块
request是python原生的一个基于网络请求的模块,模拟浏览器发起请求
request模块功能更强大,开发效率高,掌握了request模块就是掌握了网络爬虫的半壁江山!
2.为什么要用request模块
urllib中有一些不便于操作的地方,使用urllib必须手动处理url的编码方式,比如quate()手动编码,有的url有很多组参数的,每一组都需要进行编码会很不方便
urllib还需要手动处理post请求的参数,url.encode()对字典进行处理,之后还要进行doceode操作
urllib处理cookie和代理的时候比较繁琐
    -创建一个cookie对象,
    -创建一个handler对象
    -创建一个opener对象,通过opener发起请求,这时才会携带cookie
处理代理操作的流程
    -创建一个handler对象,见代理ip和端口封装到该对象中
    -基于handler对象再去创建opener对象,
request模块会自动处理编码问题,简化了更多的cookie和代理的操作
3.request如何被使用
-安装request模块
-1.指定url
-2.使用request模块发起请求
-3.获取响应数据
-4.进行持久化存储
4.通过5个基于request模块的爬虫项目对该模块进行系统学习和巩固
-1.request发起get请求
-2.request发起post请求
-3.request发起ajax请求
-4.request发起ajax的post请求
-5.综合项目,所有基础知识点练习

requsts-get请求1
 
 
# 爬取搜狗首页的数据
import requests
# 1.指定url
url = 'https://www.sogou.com/'
# 2.发起get请求
res = requests.get(url=url)
# 3.获取响应中的数据值
# text获取相应页面中的字符串形式
page_data = res.text
# print(page_data)
# 4.持久化操作
with open('./sougou.html', 'w', encoding='utf-8') as fp:
    fp.write(page_data)

requests(response常用属性)
 
# 爬取搜狗首页的数据
import requests
# 1.指定url
url = 'https://www.sogou.com/'
# 2.发起get请求
res = requests.get(url=url)
# 3.获取响应中的数据值
# content获取的是response对象中的byte类型的页面数据
# print(res.content)
# status_code表示网页的响应状态码,返回响应状态码,查属性的结果,响应成功或失败
# print(res.status_code)
# 获取响应头信息(字典的形式)
# print(res.headers)
# 获取的是响应对象中的url,获取请求的url,返回的是请求中指定的url
# print(res.url)

requests模块带参get请求方式1
# 获取搜狗搜索结果对应页面数据
import requests
url = 'https://www.sogou.com/web?query=周杰伦&ie=utf-8'
 
res = requests.get(url=url)
 
# print(res.text)
 
with open('./Jay.html', 'w', encoding='utf-8') as fp:
    fp.write(res.text)
 

 
 
requests模块带参get请求方式2
# 获取搜狗搜索结果对应页面数据
import requests
 
url = 'https://www.sogou.com/web'
# 将参数封装到字典中
params = {
    'query': '周杰伦',
    'ie': 'utf-8',
}
res = requests.get(url=url, params=params)
 
# print(res.text)
 
with open('./Jay2.html', 'w', encoding='utf-8') as fp:
    fp.write(res.text)

requests模块get请求自定义请求头信息
 
 
 
 
 
 
import requests
# 自定义请求头信息
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
}
 
 
url = 'https://www.sogou.com/web'
# 将参数封装到字典中
params = {
    'query': '周杰伦',
    'ie': 'utf-8',
}
res = requests.get(url=url, params=params, headers=headers)
 
# print(res.text)
 
with open('./Jay3.html', 'w', encoding='utf-8') as fp:
    fp.write(res.text)
 

request模块的post请求
 
 
# 登录豆瓣网,获取登陆成功后的页面数据
import requests
# 指定url
url = 'https://accounts.douban.com/login'
# 封装post请求的参数
data = {
'source': 'movie',
'redir': 'https://movie.douban.com/',
'form_email': 'a873245193@sina.com',
'form_password': 'dota2009',
'login': '登录'
}
headers = {
#     存储任意的请求头信息
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
}
# 发起post请求
req = requests.post(url=url, data=data, headers=headers)
# 3.获取响应对象中的页面数据
page_text = req.text
# 4.持久化操作
with open('./douban.html', 'w', encoding='utf-8') as fp:
    fp.write(page_text)
 
 
requests模块ajax的get请求
 
 
import requests
 
url = 'https://movie.douban.com/j/chart/top_list?'
# 封装ajax中get请求携带的参数
params = {
    'type': '13',
    'interval_id': '100:90',
    'action': '',
    'start': '0',
    'limit': '2000',
}
headers = {
    #     存储任意的请求头信息
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
}
req = requests.get(url=url, params=params, headers=headers)
print(req.text)
 
 
requests模块处理ajax的post请求
 
# 爬取肯德基餐厅的位置数据
import requests
 
# 1.指定url
post_url = r'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
# 2.处理post请求的参数
data = {
    'cname': '',
    'pid': '',
    'keyword': '江苏',
    'pageIndex': '1',
    'pageSize': '10',
}
headers = {
    #     存储任意的请求头信息
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
}
req = requests.post(url=post_url, data=data, headers=headers)
print(req.text)
 
request模块综合练习
 
 
import requests
# 爬取搜狗、知乎某一个词条对应的一定范围表示的页面数据
# 获取前3页页面数据
# 1.指定url
url = 'https://zhihu.sogou.com/zhihu'
params = {
    'query': '人工智能',
    'page':'6',
    'ie':'utf8',
}
headers = {
    #     存储任意的请求头信息
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
}
req = requests.get(url=url, params=params, headers=headers)
# print(req.text)
with open('./人工智能.html', 'w', encoding='utf-8') as fp:
    fp.write(req.text)
 
request模块的cookie操作
 
# cookie
# 基于用户的数据
# 爬取豆瓣网的个人主页页面数据
# cookie作用,服务端使用cookie来记录客户端的状态信息
# 1.执行登录操作
# 2.发起个人请求主页请求时,需要将cookie携带到该请求中
# session也可以使用来发起请求,该cookie对象会自动存储在session中
import requests
 
session = requests.session()
login_url = 'https://www.douban.com/accounts/login'
data = {
    'source': 'movie',
    'redir': 'https://movie.douban.com/',
    'form_email': 'a873245193@sina.com',
    'form_password': 'dota2009',
    'login': '登录',
}
headers = {
    #     存储任意的请求头信息
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
}
res = session.post(url=login_url, data=data, headers=headers)
print(res.text)
with open('./dou.html', 'w', encoding='utf-8') as fp:
    fp.write(res.text)
 
 
 
requests模块的代理操作
 
 
# -代理操作,使用第三方代替本体去操作事务
# -为什么要使用代理?
# 反爬操作有关联
# 设置代理ip防止门户网站封禁ip,使用代理是一种反反爬的手段
# 代理分类
# -正向代理 代替客户端获取数据
# -反向代理 代替服务器端提供数据
# 4.免费代理ip的网站提供商
# -www.goubanjia.com
# -快代理
# -西祠代理
 
Win a contest, win a challenge
原文地址:https://www.cnblogs.com/pandaboy1123/p/9925511.html