零基础学习python_爬虫(53课)
1、Url的格式简单介绍,如下图:
2、我们要对网站进行访问,需要用到python中的一个模块或者说一个包吧,urllib(这个在python2中是urllib+urllib2,python3将这两个合并为一)
Urllib这个包内有几个模块,我们用最难的那个就可以啦,哈哈哈,request模块。
urllib.request.
urlopen
(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
url: 网站地址 data:Post要提交的数据 (不写的话默认为get请求) timeout:设置网站的访问超时时间
直接用urllib.request模块的urlopen()获取页面,html的数据格式为bytes类型,需要decode()解码,转换成str类型。
举个简单的实例,我们爬取百度的网址:
import urllib.request as urt #模块别名
response = urt.urlopen(r"https://www.cnblogs.com/") #获取博客地址内容
html = response.read() #因为是一个对象,所以用读的方式将内容读出
html = html.decode('utf-8') #因为是二进制(byte的类型)的字符串,要解码成unicode
print(html)
urlopen返回对象提供方法:
- read() , readline() ,readlines() , fileno() , close() :对HTTPResponse类型数据进行操作。
- info():返回HTTPMessage对象,即服务器返回的头信息。
- getcode():返回Http状态码。
- geturl():返回请求的url地址。
urllib.request.
urlopen实际上执行的是两个动作,先是urllib.request.
Request(url)然后再urlopen这个对象,因此我们可以通过Request来包装请求,然后再通过urlopen来访问地址。
urllib.request.
Request
(url, data=None, headers={}, method=None)
import urllib.request url = r'http://www.lagou.com/zhaopin/Python/?labelWords=label'
#以字典形式添加,当然有些只需要添加User-Agent 即可
headers = {
'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
'Connection': 'keep-alive'
} req = urllib.request.Request(url, headers=headers) #这里可以添加header头
page = urllib.request.urlopen(req).read()
page = page.decode('utf-8')
print(page)
用来包装头部的数据:
- User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号等
- Referer:可以用来防止盗链,有一些网站图片显示来源http://***.com,就是检查Referer来鉴定的
- Connection:表示连接状态,记录Session的状态。
刚刚开始的时候我们用urlopen做了get请求,现在我们试试post请求,以下面实例进行讲解:
from urllib import request, parse url = r'https://www.lagou.com/jobs/companyAjax.json?needAddtionalResult=false&isSchoolJob=0' headers = {
'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
'Connection': 'keep-alive'
} data = {
'first': 'true',
'pn': 1,
'kd': 'Java'
} data = parse.urlencode(data).encode('utf-8') #Post的数据必须是bytes或者iterable of bytes,不能是str,因此需要进行encode()编码
req = request.Request(url, headers=headers, data=data) #也可以将data数据在urlopen中再传入
page = request.urlopen(req).read()
page = page.decode('utf-8')
print(page)
这里需要注意下:urllib.parse.urlencode
(query, doseq=False, safe='', encoding=None, errors=None),这个是将数据格式变成人家能看懂的数据,经过urlencode()转换后的data数据为URL后面加上?first=true?pn=1?kd=Java
当然,有些网站为了防止别人爬虫或者恶意访问,可能会做诸多限制,比如发现同一个ip一秒内下载了几十张图片,那么这肯定就有可能不是正常访问,因此很可能就会判断为爬虫或者其它,然后发个验证码让你输入,为了避免这种情况出现,于是乎我们使用代理的方式进行访问,例子如下:
urllib.request.
ProxyHandler
(proxies=None)
import urllib.request
import random url = 'http://www.whatismyip.com.tw'
iplist = ['180.149.131.67:80','27.221.93.217:80','111.2.122.46:8080'] proxy_support = urllib.request.ProxyHandler({'http':random.choice(iplist)})
opener = urllib.request.build_opener(proxy_support)
opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/5')]
urllib.request.install_opener(opener)
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
print(html)
上面是代码,我们来详细说下整个过程:
1、首先我们先创建一个代理处理器 ProxyHandler,ProxyHandler是一个类,其参数是一个字典,上面就是我们的iplist,我们本来也可以写一个ip,但是由于免费的代理ip不稳定,因此我们写成了一个列表,然后每次随机从列表中取出一个代理Ip。
什么是Handler?Handler也叫作处理器,每个handlers知道如何通过特定协议打开URLs,或者如何处理URL打开时的各个方面,例如HTTP重定向或者HTTP cookies。
2、定制(创建)一个opener,opener = urllib.request.build_opener(proxy_support)
什么是opener?python在打开一个url链接时,就会使用opener。其实,urllib.request.urlopen()函数实际上是使用的是默认的opener,只不过在这里我们需要定制一个opener来指定handler。
3、安装opener,urllib.request.install_opener(opener),install_opener 用来创建(全局)默认opener,这个表示调用urlopen将使用你安装的opener,当然你也可以不用安装,你可以直接opener.open(url),修改上面的代码为:
import urllib.request
import random url = 'http://www.whatismyip.com.tw'
iplist = ['180.149.131.67:80','27.221.93.217:80','111.2.122.46:8080'] proxy_support = urllib.request.ProxyHandler({'http':random.choice(iplist)})
opener = urllib.request.build_opener(proxy_support)
opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/5')]
#urllib.request.install_opener(opener) #注释了这一行,下一行修改为 opener.open(url),但是我们这样修改如果使用urlopen的话就不会打开我们特制的opener,因此这个看需求而定。
response = opener.open(url)
html = response.read().decode('utf-8') print(html)
下面说下异常处理,详细就不多说了,看下就知道了,如下:
from urllib import request, parse url = r'https://www.lagou.com/jobs/companyAjax.json?needAddtionalResult=false&isSchoolJob=0' headers = {
'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
'Connection': 'keep-alive'
} data = {
'first': 'true',
'pn': 1,
'kd': 'Java'
} data = parse.urlencode(data).encode('utf-8') #Post的数据必须是bytes或者iterable of bytes,不能是str,因此需要进行encode()编码
try:
req = request.Request(url, headers=headers, data=data) #也可以将data数据在urlopen中再传入
page = request.urlopen(req).read()
page = page.decode('utf-8')
print(page)
except error.HTTPError as e:
print(e.code())
print(e.read().decode('utf-8'))
零基础学习python_爬虫(53课)的更多相关文章
- 零基础学习python_类和对象(36-40课)
今天我们开始学习面向对象的知识咯,之前我对面向对象也学的懵懵的,因为感觉知道好像又不是特别清楚,接下来我们一起来学习类和对象吧.零基础的课程我都是看小甲鱼的视频学的,没基础的可以去这个网址下载视频学习 ...
- 零基础学习python_文件(28-30课)
本人小白一枚,随着现在对测试要求越来越高,动不动就要去会一门编程语言,没办法只能学习学习Python,今天看到几个月前还是菜鸟的人突然就已经能使用Python写简单系统了,没办法,虽然之前也简单学习过 ...
- 零基础学习python_字符串(14-15课)
今天回顾下我之前学习python的第一个对象——字符串,这个对象真蛋疼,因为方法是最多的,也是最常见的类型,没有之一... 内容有点多,我就搜了下网上的资料,转载下这个看起来还不错的网址吧:http: ...
- 零基础学习python_字典(25-26课)
今天学到后面的知识,突然发现之前学习到的字典列表啥的都有点忘了,打算补一下之前学到的字典,到时候你看的时候,字符串.列表.字典.元祖这几个没啥顺序,刚开始学的时候了解下方法,当然你可以死记硬背下,后面 ...
- 零基础学习python_模块(50-52课)
今天学了下模块,那什么是模块呢?其实我们写的以py结尾的一个文件就是一个模块,模块也就是程序 还记得我们之前学过容器.函数.类吧 容器 -> 数据的封装 函数 -> ...
- 零基础学习python_生成器(49课)
一个生成器函数的定义很像一个普通的函数,除了当它要生成一个值的时候,使用yield关键字而不是return.如果一个def的主体包含yield,这个函数会自动变成一个生成器(即使它包含一个return ...
- 零基础学习python_魔法方法(41-48课)(迭代器)
接下来这个为啥要叫魔法方法呢,额,这个嘛我是跟小甲鱼的视频取的名字一样的,因为会讲比较多杂的东西,有... 魔法方法详细阅读地址:http://bbs.fishc.com/thread-48793-1 ...
- 零基础学习python_列表和元组(10-13课)
一时兴起今天又回过头来补一下列表和元组,先来说说列表哈,列表其实是python最经常用到的数据类型了,不仅经常用还很强大呢,这个跟C语言里面的数组是类似的,列表当然也可以增删改查,不过我可没打算用之前 ...
- 零基础学习python_异常处理(32-33课)
我们写完python执行的时候是不是经常会遇到报错,而且报错都是大片红字,这样给别人的感受就是你写的程序怎么老是出问题啊,这样我们还咋么混下去呢?于是乎,就有了异常处理的东东. python的try语 ...
随机推荐
- httpService 和 WebService接口协议
http协议: 1.调用接口 例1:此例子传输参数为XML文本格式字符串: 将数据缓冲区上载到具有指定 URI 的资源. var url = "http://localhost:23265 ...
- windbg 如何再内核模式调试用户空间的程序
1:使用!process 0 0 获取用户空间的所有的进程的信息 !process 0 0 **** NT ACTIVE PROCESS DUMP **** PROCESS 80a02a60 ...
- RHEL 6.5系统安装配置图解教程(rhel-server-6.5)
转自:http://www.jb51.NET/os/128752.html 说明: 截止目前RHEL 6.x最新版本为RHEL 6.5,下面介绍RHEL 6.5的具体安装配置过程 服务器相关设置如下: ...
- Vim插件集合
插件Nerdtree实现浏览文件系统并打开文件或目录,在window中是非常不错的插件,但是在Ubuntu中这个插件就是一坑,特别提示,且无解.若在Ubuntu中使用目录浏览插件,建议使用其他插件,如 ...
- 启动代码和Bootloader区别
很多人都会把两者混淆,所以这里稍微说一下. 启动代码和Bootloader有点类似于类和结构体的关系,也就是说结构体只是一种很特殊很特殊的类,但不能说类是一种结构体. 也就是说可以说启动代码是Boot ...
- Excel技巧--分类求和与空白批量填充
分类求和: 当我们要对以上多个分类空白求和时,可以巧用Alt+=键: 1.选择对应要求和的列: 2.点击“查找与选择”下拉列,选择“定位条件”,对话框选择“空值”,点确定.将列中的空白单元格选好: 3 ...
- idea下的调试配置
react和ts的整合 https://github.com/Microsoft/TypeScript-React-Starter vue的 https://github.com/ducksoupde ...
- 细看Thread的 start() 和 run()方法
1.start(): 我们先来看看API中对于该方法的介绍: 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 结果是两个线程并发地运行:当前线程(从调用返回给 start 方法)和另一 ...
- 关于Nginx配置性能优化
基本的 (优化过的)配置 将修改的唯一文件是nginx.conf,其中包含Nginx不同模块的所有设置.在服务器的/etc/nginx目录中找到nginx.conf. 首先,我们将谈论一些全局设置,然 ...
- ALGO-141_蓝桥杯_算法训练_P1102
定义一个学生结构体类型student,包括4个字段,姓名.性别.年龄和成绩.然后在主函数中定义一个结构体数组(长度不超过1000),并输入每个元素的值, 程序使用冒泡排序法将学生按照成绩从小到大的顺序 ...