简述python爬虫_python爬虫入门篇了解

1. 爬虫分类:

1.1 通用爬虫:例如搜索引擎:无差别的收集数据;提取存储关键字;构建索引库;给用户提供搜索接口。

1.2 聚焦爬虫:有针对性的编写特定领域数据的爬取程序。

2. Robots协议:

指定一个robots.txt文件,告诉爬虫引擎什么可以爬取,什么不可以爬取。君子协议,不受法律保障。

例如:http://www.taobao.com/robots.txt

3. Http请求与响应:

爬取网页就是通过http协议访问网页,通过浏览器是人的行为,将这种行为变成程序行为,就是爬虫。

python里提供了urllib包来处理url,访问网页:

urllib.request  # 打开和读写url

urllib.error  # 由urllib.request引起的异常

urllib.parse  # 解析url

urllib.robotparser  # 分析robots.txt文件

(python2里提供了urllib和urllib2:urllib提供较为底层的接口,urllib2对urllib进行了进一步的封装;python3中将urllib和urllib2合并,并只提供了标准库urllib包。)

3.1 urllib.request模块

身份验证、重定向、cookies等应用中打开url(主要是http)的函数和类。

urlopen方法:建立http连接,获取数据。

urlopen(url, data=None)

# url是链接地址字符串或请求对象;data是提交的数据。如果data为None则发起GET请求,如果为非None,发起POST请求;返回http.client.HTTPResponse类的响应对象,是一个类文件对象。

#GET方法:数据通过URL传递,放在HTTP报文的header部分;POST方法:数据放在HTTP报文的body中提交。数据都是键值对形式,多个参数之间通过'&'连接,url和数据之间通过'?'连接。

from urllib.request importurlopen#打开url返回一个响应对象,类文件对象

response = urlopen('http://www.bing.com') #data为None,所以是get方法

print(response.closed) #False。类似于文件对象,不会自动关闭

with response:print(type(response)) #

print(response.status) #状态码200,表示成功。

print(response.reason) #OK

print(response._method) #请求方法:get。_method表示是内部方法

print(response.geturl()) #http://cn.bing.com/?setmkt=zh-CN&setmkt=zh-CN。'http://www.bing.com'链接跳转至的真正url

print(response.info()) #返回headers的信息

print(response.read()) #读取返回的网页内容;字节类型

print(response.closed) #True。说明with方法同文件对象一样会自动关闭。

简述上述过程:通过urllib.request.urlopen方法,发起一个HTTP的GET请求,WEB服务器返回网页内容。响应的数据被封装到类文件对象(response)中。可以通过read、readline、deadlines等方法获取数据,status和reason属性表示返回的状态,info方法返回头信息等。

上述代码可以获得网站的响应数据,但是urlopen方法只能传递url和data参数,不能构造http请求。在python的源码中,User-agent值为Python-urllib/3.6(3.6为对应的python版本号),因此就能被一些反爬虫的网站识别出来。于是需要更改User-agent值来伪装成浏览器:赋值浏览器的UA值。

Request方法:构建request请求对象,可以修改请求头信息。

Request(url, data=None, headers={})

from urllib.request importRequest, urlopenimportrandom

url= 'http://www.bing.com/' #要访问的url;实际上是自动跳转 301 302#不同浏览器的User-Agent值。切换浏览器的不同的用户代理,查看网络下标头里user-agent值

ua_list = ['Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36','Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15','Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299']#ua要添加到请求头中

ua =random.choice(ua_list)#request = Request(url, headers={'User-agent': ua}) # 实现的功能跟下面两行代码是一样的

request =Request(url)

request.add_header('User-Agent', ua)print(type(request)) #

response= urlopen(request, timeout=20) #urlopen传入的参数可以是url对象,也可以是request对象

print(type(response)) #

with response:print(response.status) #200

print(response.getcode()) #200

print(response.reason) #OK

print(response.geturl()) #http://cn.bing.com/

print(response.info()) #header里的信息:包含Cache-Control,Content-Length,Set-Cookies,Connection等字段信息

print(response.read()) #网页html内容

print(request.get_header('User-agent')) #Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0);伪装的浏览器ua值

print('user-agent'.capitalize()) #User-agent;User-agent首字母要大些

3.2 urllib.parse模块

对url进行编码和解码。

urlencode方法:url编码:主要是对post或get方法请求传递的参数编码,与原url结合,使其成为能够被访问的url格式。

urlencode(data)  # 传入的data参数需要是字典或者二元组序列

from urllib.parse importurlencode

u1= urlencode({'name': 'danni', 'age': 23})print(u1) #name=danni&age=23;get方法下u的值是以?连接放在url后,post方法下u的值是放在body里

u2= urlencode({'test': 'http://www.taobao.com?name=danni&age=23'})print(u2) #test=http%3A%2F%2Fwww.taobao.com%3Fname%3Ddanni%26age%3D23

从的运行结果我们可以发现:

1.斜杠、&、冒号、等号、问号等都被全部编码了(%之后实际上是单字节十六进制表示的值)。 因为提交的数据中,可能会像上述情况一样有斜杠、等号、问号等特殊符号,但这些字符表示数据,不表示元字符。直接发给服务器端会导致接收方无法判断谁是元字符谁是数据了。因此,将这部分特殊的字符数据也要进行url编码,这样就不会有歧义。

2.中文同样也会被编码,一般先按照字符集的encoding要求将其转换成字节序列,每一个字节对应的十六进制字符串前面加上百分号即可。

unquote方法:url解码

在百度上搜索汉字“中”:网页上呈现出来的url:https://www.baidu.com/s?wd=中;复制粘贴后呈现出的url:https://www.baidu.com/s?wd=%E4%D8%AD

from urllib.parse importurlencode, unquote

u= urlencode({'wd': '中'}) #urlencode对中文的编码

print(u) #wd=%E4%B8%AD

url= 'https://www.baidu.com/s?{}'.format(u)print(url) #https://www.baidu.com/s?wd=%E4%B8%AD

print('中'.encode('utf-8')) #b'\xe4\xb8\xad' utf-8对中文的编码

print(unquote(u)) #wd=中 unquote解码

print(unquote(url)) #https://www.baidu.com/s?wd=中

参与到实际:假设一个场景需求:连接必应搜索引擎,获取一个搜索的URL:http://cn.bing.com/search?q=马哥教育。通过程序代码完成对关键字“马哥教育”的bing搜索,并将返回的结果保存为网页文件。

from urllib.parse importurlencode, unquote

base_url= 'http://cn.bing.com/search' #是http而不是https

d = {'q': '马哥教育'} #注意必应浏览器下是'q'

u= urlencode(d) #q=%E9%A9%AC%E5%93%A5%E6%95%99%E8%82%B2;编码

url = '{}?{}'.format(base_url, u) #?连接url和关键字参数

print(url) #http://cn.bing.com/search?q=%E9%A9%AC%E5%93%A5%E6%95%99%E8%82%B2

print(unquote(url)) #http://cn.bing.com/search?q=马哥教育;解码可以比对看一下是否有错误

from urllib.request importurlopen, Request#伪装成浏览器

ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'req= Request(url, headers={'User-agent': ua}) #构建http请求对象

res = urlopen(req) #传入请求对象,建立http连接,获取数据

with res:

with open('test_python.html', 'wb') as f:

f.write(res.read())#将返回的网页内容写入新文件中

print('success')

上述需求讲的是测试get方法的应用,我们可以用http://httpbin.org/这个测试网站,来测试自己post出去的数据是否能正确返回。

from urllib.request importRequest, urlopenfrom urllib.parse importurlencodeimportsimplejson

request= Request('http://httpbin.org/post') #post

request.add_header('User-agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36')

data= urlencode({'name': '张三!@#$%^&*(,.)', 'age': '6'}) #post的dataurl编码,放在body里。不做url编码有风险

print(data)print(type(data))

d= data.encode() #POST方法传入的需为json格式的Form表单数据

res = urlopen(request, data=d)

with res:

text=res.read()print(text) #包含args,data,files,form,headers等字段的信息;form字段里是post出去的data数据

d = simplejson.loads(text) #bytes转dict

print(d)

到这里,python爬虫的‘伪装成浏览器的请求对象->建立http连接->发起post或get请求->查看响应内容 ’理解和简单应用算是成功告一段落啦~

接下来在下一篇里我们就可以开始简单的豆瓣网站爬虫啦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

修改固态硬盘的物理序列号_买固态怕踩坑?收下这些软件,轻松鉴别好坏

再有半个月,就迎接年中的促销旺季。不少朋友都希望趁着各种优惠、跳楼价,组一台梦想机、升级一下自己的电脑。说到体验升级,相信就算是DIY新手和硬件小白都知道,要想电脑快,必须选固态。但是固态参数多,又是…

python乘法表代码注释_Python统计python文件中代码,注释及空白对应的行数示例【测试可用】...

本文实例讲述了Python实现统计python文件中代码,注释及空白对应的行数。分享给大家供大家参考,具体如下:其实代码和空白行很好统计,难点是注释行python中的注释分为以#开头的单行注释或者以开头以结尾 或以"""开头以"&qu…

32位python和64位python区别_python32位和64位有什么区别

python32位和64位有什么区别?64位能够用更大的内存空间,64位可以在64位的系统下运行,但是不能在32位系统下运行。32位能够在32位和64位上运行,考虑到兼容性,建议使用32位的python。如何查看python是32位还是64位可使用…

《常用控制电路》学习笔记——数控锁相环调速电路

序言 今天开始我将把自己学习《常用控制电路》的一些内容发到互联网上,希望能和大家交流学习。 这本书主要介绍了一系列控制电路的经典案例,进行了电路和代码的设计,我将把这本书中学习到的内容和学习的过程尽量准确的分享出来与大家交流&…

《常用控制电路》学习笔记——数字控制直流电动机调速电路

书中该节讲述的电路通过ADC芯片将电位器的阻值转换为电压量,然后使用单片机输出PWM进行电路控制。本电路也可扩展应用至需要模拟量输入与输出的场合。 目录 一、系统设计思路 二、各模块电路分析 2.1电路构成 2.2工作状态分析 三、程序分析 3.1 变量定义 3.…

《常用控制电路》学习笔记——数控直流恒流源电路

书中该项目内容设计了一个从交流220V市电作为供电电源的恒流源电路,并且此电路可由加减计数器74LS193控制输出的电流大小。 目录 一、系统方案 二、各模块电路分析 整流滤波及稳压电路 数字量控制电路 数模转换电路 数控恒流源产生电路 三、电路仿真结果 四…

图像太宽无法输出请裁剪图像或降低分辨率然后重试_真·无监督!延世大学提出图像到图像无监督模型,实验结果超SOTA...

作者 | 蒋宝尚编辑 | 丛 末图像翻译目的是用模型将源域图像转换到目标域图像,通常涉及标签图到场景图的转换、图像风格、人脸的属性变换、标签图到场景图的转换。图像翻译任务自生成对抗网络提出就得到了快速发展,例如经典的pix2pix、CycleGAN、StarGAN。…

python图像文件压缩_python实现图片压缩代码实例

前言项目中大量用到图片加载,由于图片太大,加载速度很慢,因此需要对文件进行统一压缩一:导入包from PIL import Imageimport os二:获取图片文件的大小def get_size(file):# 获取文件大小:KBsize os.path.getsize(file…

php serialize和json_encode哪个更快_世界 10 大编程语言,Java 不是第一,PHP 才第五...

来源:toutiao.com/a6764554659349676557/如果你是软件开发领域的新手,那么你会想到的第一个问题是“如何开始?”编程语言有数百种可供选择,但是你怎么发现哪个最适合你,你的兴趣和职业目标又在哪里呢?选择最…

python列表操作程序_Python入门篇(三)之列表

1、列表定义names ["ZhangYang","Guyun","Xiangpeng","Xuliangchen"] #列表存储,类似数组2、列表的操作(1)切片names ["ZhangYang","Guyun","Xiangpeng","Xuliangchen"] #列表存…

python编程制作_一种Python编程创作平台的制作方法

本发明涉及在线浏览器技术领域,特别涉及一种Python编程创作平台。背景技术:目前项目整体使用javascripthtmlcss实现,用户界面编写上使用react框架。具体实现上是将python语法转换为js语法,使其可以在浏览器中运行,目前…

tomcat7.0支持什么版本的jdk_恭喜你喜提JDK,那你知道JDK是什么吗?先来看看吧

点击蓝字关注一行JDK 大家都知道电脑的操作系统是由汇编和C语言写出,因此操作系统无法直接识别其他语言。这时我们就需要为我们写的Java程序配备一名翻译官 ----- 编译环境,将Java程序翻译成电脑可以识别的程序,C或者汇编。 那么对于这个…

我的python 入门 安装 -- hello world

我的python 安装–>“hello world” 最近老听到关于python的声音,而且越来越强烈。就好奇下载了下,在win10 的应用商店下载的 够傻瓜了吧 环境变量也不用配置 直接上手 hello world了 cmd 窗口 输入 python -v 正常显示 显示版本号 不能正常显示…

python if try except_python try except

python中try/except/else/finally语句的完整格式如下所示:try:Normal execution blockexcept A:Exception A handleexcept B:Exception B handleexcept:Other exception handleelse:if no exception,get herefinally:print("finally")说明:正常…

多台Linux服务器之间互相免密登陆

多台Linux服务器之间互相免密登陆 例如我们有三台Linux 服务器: 192.168.0.1 192.168.0.2 192.168.0.3 1.1 首先配置服务器 1 面密令登录2 和 3 1.2 登录服务器1,然后输入命令:ssh-keygen -t rsa ,一路按 回车, …

python多进程内存共享_Python—并发编程04多进程内存共享,python,间,的

Manaegr实现数据共享导入 :from multiprocessing import Manager实例化:m Manager()num m.dict( {键 : 值} )num m.list( [1, 2, 3] )程序示例:from multiprocessing import Manager,Processdef fun(num):num[0] 0print(子进程中num:, num)if __name…

记录spring、springboot集成apollo配置中心

一, spring集成apollo,前提是apollo配置中心服务端已经在运行中 上面是我在阿里云服务搭建的apollo配置中心服务端,登录后的样子。没有搭建服务端的小伙伴,请先搭建好apollo的服务端 然后点击‘创建项目’,新建测试用的项目 填…

python中不同类型的数据不能相互运算_Python第三课——数据类型与运算(2)

hello大家好,我是你们的小蒟蒻鸭,终于终于有时间写博客了(虽然刚开始期末复习),真的非常非常抱歉,拖更太厉害了。反正还有一个月不到小蒟蒻就要放暑假了!!!(激动.jpg),蒟蒻保证会一周…

Java多线程--死锁例子

package qzy.thread.deadLock;/*** 描述模拟死锁** 形成死锁的四个必要条件是什么** 1.互斥条件:线程(进程)对于所分配到的资源具有排它性,即一个资源只能被一个线程(进程)占用,直到被该线程(进程)释放* 2.请求与保持条件:一个线程…

python重写和装饰器_python装饰器

python装饰器的本质,就是闭包!我们一般谈Python的闭包,都是指普通的入参,而谈装饰器的时候,入参一定有函数!闭包和装饰器,返回的都是函数。函数是代码的最小封装单位,装饰器作用于函…