第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
# -快代理
# -西祠代理
 

路飞学城Python-Day142的更多相关文章

  1. 路飞学城—Python爬虫实战密训班 第三章

    路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ...

  2. 路飞学城—Python爬虫实战密训班 第二章

    路飞学城—Python爬虫实战密训班 第二章 一.Selenium基础 Selenium是一个第三方模块,可以完全模拟用户在浏览器上操作(相当于在浏览器上点点点). 1.安装 - pip instal ...

  3. 路飞学城Python爬虫课第一章笔记

    前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 之前看阮一峰的博客文章,介绍到路飞学城爬虫课程限免,看了眼内容还不错,就兴冲冲报了名,99块钱满足以下条件会返还并送书送视频. 缴 ...

  4. 路飞学城-Python开发集训-第3章

    学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ...

  5. 路飞学城-Python开发集训-第1章

    学习体会: 在参加这次集训之前我自己学过一段时间的Python,看过老男孩的免费视频,自我感觉还行,老师写的代码基本上都能看懂,但是实际呢?....今天是集训第一次交作业的时间,突然发现看似简单升级需 ...

  6. 路飞学城-Python开发集训-第4章

    学习心得: 学习笔记: 在python中一个py文件就是一个模块 模块好处: 1.提高可维护性 2.可重用 3.避免函数名和变量名冲突 模块分为三种: 1.内置标准模块(标准库),查看所有自带和第三方 ...

  7. 路飞学城-Python开发集训-第2章

    学习心得: 这章对编码的讲解超级赞,现在对于编码终于有一点认知了,但还没有大彻大悟,还需要更加细心的琢磨一下Alex博客和视频,以前真的是被编码折磨死了,因为编码的问题而浪费的时间很多很多,现在终于感 ...

  8. 路飞学城-Python开发-第二章

    ''' 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家' ...

  9. 路飞学城-Python开发-第三章

    # 数据结构: # goods = [ # {"name": "电脑", "price": 1999}, # {"name&quo ...

  10. 路飞学城-Python开发-第一章

    # 基础需求: # 让用户输入用户名密码 # 认证成功后显示欢迎信息 # 输错三次后退出程序 username = 'pandaboy' password = ' def Login(username ...

随机推荐

  1. C#的WaitHandle : 管理多线程状态

    有时候,我们创建了多线程,需要知道是否都完成了各自的工作.比如说,开启了多线程的下载,如何终止所有的线程并且在确保所有线程都终止之后才继续执行程序的退出呢? public partial class ...

  2. c++ 打飞机游戏开发日志

    设计思路:控制台模式 初始化: 建立画面,初始化数据 游戏过程: 1.获取操作 2.修改数据 3.更新画面 结束: 关闭画面,delete动态分配数据 4.29日 创建游戏背景,实现飞机移动操作,实现 ...

  3. [bzoj3389][Usaco2004Dec]Cleaning Shifts安排值班_最短路

    Cleaning Shifts bzoj-3389 Usaco-2004Dec 题目大意:每天有n个时间段,每个时间段都必须安排一个奶牛值班.有m个奶牛,每个奶牛只有一个空闲时间s[i]~e[i],求 ...

  4. Spring中获取Session的方法汇总

    Spring: web.xml <listener> <listener-class>org.springframework.web.context.request.Reque ...

  5. POJ 1155

    很久以前做的树形DP题,今天再遇到时,竟然不会了,所以写写.. 设数组: prf[MAX][MAX],cost[MAX],sum[MAX].分别表示,在第i个结点为根的子树内的情况下,若有j个用户申请 ...

  6. 神经网络入门游戏推荐BugBrain

    今天看到一款神经网络入门游戏.BugBrain.在游戏中,你能够通过连接神经元.设置神经元阈值等建造虫子的大脑,让瓢虫.蠕虫.蚂蚁等完毕各种任务.下载下来玩了玩,难度真不是入门级的= =! 真心佩服作 ...

  7. QUERY_REWRITE_INTEGRITY

    QUERY_REWRITE_INTEGRITY Property Description Parameter type String Syntax QUERY_REWRITE_INTEGRITY = ...

  8. 车载导航系统中GPS的定位

    首先购买的车载导航系统有GPS信号接受功能,能够接收GPS的经纬度信号,然后导航终端里面安装的导航地图能够非常详细的显示详细的经纬度坐标和地物信息.导航终端通过接收器接收到卫星24小时不间断发射的免费 ...

  9. bzoj5178: [Jsoi2011]棒棒糖

    就是裸的主席树嘛... 表扬一下自己1A #include<cstdio> #include<iostream> #include<cstring> #includ ...

  10. php简单测试slim框架的功能

    php简单测试slim框架的功能 监听主路径/ $app->get( '/', function () { $template = <<<EOT<!DOCTYPE htm ...