一.urllib库

  概念:urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求。其常被用到的子模块在Python3中的为urllib.requesturllib.parse,在Python2中是urllib和urllib2。

使用流程:

  • 指定url
  • 基于urllib的request子模块发起请求
  • 获取响应中的数据值
  • 持久化存储

爬取搜狗首页的页面数据

---

# 爬取搜狗首页的页面数据
import urllib.request
# 1.指定url
url = 'https://www.sogou.com/' #2.发起请求:urlopean可以根据指定的url发起请求,且返回一个响应对象
response = urllib.request.urlopen(url=url) #3.获取页面数据:read函数返回的就是响应对象中存储的页面数据(byte)-二进制形式
page_text = response.read()
#print(page_text) #4.持久化存储
with open('./sogou.html','wb')as f:
f.write(page_text)
print('写入数据成功')

补充说明:

urlopen函数原型:
urllib.request.urlopen(url, data=None, timeout=<object object at 0x10af327d0>, *, cafile=None, capath=None, cadefault=False, context=None) 在上述案例中我们只使用了该函数中的第一个参数url。在日常开发中,我们能用的只有url和data这两个参数。 url参数:指定向哪个url发起请求
data参数:可以将post请求中携带的参数封装成字典的形式传递给该参数(暂时不需要理解,后期会讲) urlopen函数返回的响应对象,相关函数调用介绍:
response.headers():获取响应头信息
response.getcode():获取响应状态码
response.geturl():获取请求的url
response.read():获取响应中的数据值(字节类型)

爬取指定词条所对应的页面数据

# 需求:爬取指定词条所对应的页面数据
import urllib.request
import urllib.parse #指定url
url = 'https://www.sogou.com/web?query=' # url特性:url不可以存在非ASCII编码的字符
word = urllib.parse.quote('人名币')
url += word # 发请求
response = urllib.request.urlopen(url=url) # 获取页面数据
page_text=response.read()
# print(page_text) #4.持久化存储
with open('rmb.html','wb')as f:
f.write(page_text)
print('写入数据成功')

双击rmb.html出现页面:

- 反爬机制:

网站检查请求的UA,如果发现UA是爬虫程序,则拒绝提供网站数据
- User-Agent(UA):请求载体的身份标识
- 反反爬机制:伪装爬虫程序请求的UA--如何通过代码实现

在百度浏览器下点击F12

然后输入www.sogou.com

------------------------

import urllib.request
#被访问的搜狗网页
url = 'https://www.sogou.com/'
# UA伪装
#1.自制定一个请求对象
#存储任意的请求头信息
# 此处用的百度的UA
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
#该请求对象的UA进行了成功的伪装
request = urllib.request.Request(url=url,headers=headers) # 2.针对自定制的请求发起请求
response = urllib.request.urlopen(request)
print(response.read())

携带参数的post请求:

案例:百度翻译发起post请求

import urllib.request
import urllib.parse
# 1.通过抓包工具抓取post请求的url
post_url='https://fanyi.baidu.com/sug'
# 2.封装post请求参数
data={
"kw":"西瓜"
}
# 3.使用parse模块中的urlencode(返回值类型为str)进行编码处理
data=urllib.parse.urlencode(data)
#自定义请求头信息字典
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
}
# 4.将步骤3中的编码结果转换成byte类型
data = data.encode() #自定义请求对象,然后将封装好的post请求参数赋值给Requst方法的data参数。 #data参数:用来存储post请求的参数
request=urllib.request.Request(post_url,data=data,headers=headers)
#自定义的请求对象中的参数(data必须为bytes类型)
response=urllib.request.urlopen(request)
response.read()

-----------------------------------------

urllib模块下的代理和cookie不常用-了解即可 

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) url='http://www.baidu.com/s?ie=UTF-8&wd=ip' 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
url = 'http://www.renren.com/289676607/profile'
#自定义请求头信息
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数据值
url='http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=201873958471'
#自定义一个请求对象,让该对象作为opener的open函数中的参数
data={
"email":"www.zhangbowudi@qq.com",
"icode":"",
"origURL":"http://www.renren.com/home",
"domain":"renren.com",
"key_id":"",
"captcha_type":"web_login",
"password":"40dc65b82edd06d064b54a0fc6d202d8a58c4cb3d2942062f0f7dd128511fb9b",
"rkey":"41b44b0d062d3ca23119bc8b58983104", 'f':"https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DpPKf2680yRLbbZMVdntJpyPGwrSk2BtpKlEaAuKFTsW%26wd%3D%26eqid%3Deee20f380002988c000000025b7cbb80"
}
data=urllib.parse.urlencode(data).encode()
request=urllib.request.Request(url,data=data)
opener.open(request) #获取当前用户的二级子页面
s_url='http://www.renren.com/289676607/profile'
#该次请求中就携带了cookie
resonse=opener.open(s_url) with open('./renren.html','wb') as fp:
fp.write(resonse.read())

爬虫--urllib模块的更多相关文章

  1. python爬虫 urllib模块url编码处理

    案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦'的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...

  2. python 爬虫 urllib模块 目录

    python 爬虫 urllib模块介绍 python 爬虫 urllib模块 url编码处理 python 爬虫 urllib模块 反爬虫机制UA python 爬虫 urllib模块 发起post ...

  3. python爬虫-urllib模块

    urllib 模块是一个高级的 web 交流库,其核心功能就是模仿web浏览器等客户端,去请求相应的资源,并返回一个类文件对象.urllib 支持各种 web 协议,例如:HTTP.FTP.Gophe ...

  4. Python爬虫urllib模块

    Python爬虫练习(urllib模块) 关注公众号"轻松学编程"了解更多. 1.获取百度首页数据 流程:a.设置请求地址 b.设置请求时间 c.获取响应(对响应进行解码) ''' ...

  5. python 爬虫 urllib模块 发起post请求

    urllib模块发起的POST请求 案例:爬取百度翻译的翻译结果 1.通过浏览器捉包工具,找到POST请求的url 针对ajax页面请求的所对应url获取,需要用到浏览器的捉包工具.查看百度翻译针对某 ...

  6. python 爬虫 urllib模块 反爬虫机制UA

    方法: 使用urlencode函数 urllib.request.urlopen() import urllib.request import urllib.parse url = 'https:// ...

  7. python 爬虫 urllib模块介绍

    一.urllib库 概念:urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urll ...

  8. 爬虫-urllib模块的使用

    urllib是Python中请求url连接的官方标准库,在Python3中将Python2中的urllib和urllib2整合成了urllib.urllib中一共有四个模块,分别如下: request ...

  9. python 爬虫 urllib模块 url编码处理

    案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦’的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...

随机推荐

  1. springboot(整合事务和分布式事务)

    springboot +mybatis 单数据源,事务 事务:简单理解指的是一组操作,里面包含许多个单一的逻辑,只要有一个逻辑没有执行成功 ,那么都算失败.所有的数据都回归到最初的状态(回滚) 代码实 ...

  2. Spring Boot 容器选择 Undertow 而不是 Tomcat

    Spring Boot 内嵌容器Undertow参数设置 配置项: # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程 # 不要设置过大,如果过大,启动 ...

  3. 服务网关zuul之三:zuul统一异常处理

    我们详细介绍了Spring Cloud Zuul中自己实现的一些核心过滤器,以及这些过滤器在请求生命周期中的不同作用.我们会发现在这些核心过滤器中并没有实现error阶段的过滤器.那么这些过滤器可以用 ...

  4. Ubuntu 16.04安装Pycharm2017.1.1

    安装pycharm 1.到官网下载安装包. 2.到下载目录下进行解压. 3.运行解压后的文件夹中的bin目录下的pycharm.sh文件. cd pycharm-community-2017.1.1/ ...

  5. 学习笔记之pandas Foundations | DataCamp

    pandas Foundations | DataCamp https://www.datacamp.com/courses/pandas-foundations Many real-world da ...

  6. eclipse安装、汉化、搭建安卓开发环境

    1.eclipse与jdk的位数(32bit or 64bit )要对应,否则会提示Failed to load JNI shared library.提示这一种错误据说还有另外一种原因就是Path路 ...

  7. ueditor 正在读取目录

    ueditor 版本为1.3.6  项目版本为2.0 引用 <script src="../ueditor/ueditor.config.js" type="tex ...

  8. [UE4]运行时脱离视角,进入自由视角

    按 Shift + F1让鼠标脱离游戏窗口,然后点击右上角的按钮,然后鼠标在游戏窗口点击一下,就只有自由漫游了. 还可以点击选中Word Outliner窗口的物体.

  9. c#day03

    c#中的随机数 Random random = new Random(); //随机1~200之间的一个数 random.Next(,); //怪兽:防御为10,血量为10 //玩家:随机8~12的攻 ...

  10. Unreal Engine 4 Based Materials

    转自:http://www.52vr.com/article-862-1.html 材质参数   UE4的材质参数有4个,输入范围都是0~1之间……分别为:   Base Color Roughnes ...