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请求->查看响应内容 ’理解和简单应用算是成功告一段落啦~

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

简述python爬虫_python爬虫入门篇了解相关推荐

  1. Python+django建站入门篇(2):素数判断

    本文使用django框架搭建网站,运行之后,获取用户输入的整数,判断是否为素数并进行相应的提示. 本文技术要点: 1)使用django创建网站 2)了解MVC开发模式 3)设置路由 4)接收用户输入 ...

  2. Python:Excel自动化实践入门篇 甲【留言点赞领图书门票】

    *以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s?__biz=MzUxMTgxMzExNQ==&mid=22 ...

  3. python机器人视觉编程——入门篇(下)

    目录 1 全篇概要 2 图像的读取与运算基础 2.1图像的读取 2.1.1 从磁盘的图像(.jpg,.npg,.gif等等)读取 2.1.2 从摄像头里读取图像 2.2图像的运算 2.2.1 图像的数 ...

  4. 10分钟python爬虫_python scrapy 入门,10分钟完成一个爬虫

    在TensorFlow热起来之前,很多人学习python的原因是因为想写爬虫.的确,有着丰富第三方库的python很适合干这种工作. Scrapy是一个易学易用的爬虫框架,尽管因为互联网多变的复杂性仍 ...

  5. python网络爬虫学习之入门篇

    预备知识 学习者需要预先掌握Python的数字类型.字符串类型.分支.循环.函数.列表类型.字典类型.文件和第三方库使用等概念和编程方法. Python入门篇:https://www.cnblogs. ...

  6. 推荐一部python教程_Python爬虫入门教程:博客园首页推荐博客排行的秘密

    1. 前言 虽然博客园注册已经有五年多了,但是最近才正式开始在这里写博客.(进了博客园才知道这里面个个都是人才,说话又好听,超喜欢这里...)但是由于写的内容都是软件测试相关,热度一直不是很高.看到首 ...

  7. python从入门到爬虫_python爬虫从入门到放弃(一)之初识爬虫

    什么是爬虫? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引. ...

  8. python 基金净值_Python爬虫周记之案例篇——基金净值Selenium动态爬虫

    在成功完成基金净值爬虫的爬虫后,简单了解爬虫的一些原理以后,心中不免产生一点困惑--为什么我们不能直接通过Request获取网页的源代码,而是通过查找相关的js文件来爬取数据呢? 有时候我们在用req ...

  9. 快速学python爬虫_Python爬虫丨应当如何快速高效学习

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云,作者:小小科 ( 想要学习Python?Python学习交流 ...

  10. 51自学网python爬虫_Python爬虫基本流程

    爬虫定义 爬虫是请求网站并提取自己所需要数据的过程.通过我们的程序,可以代替我们向服务器发送请求,然后进行批量的数据下载. 爬虫基本流程 发起请求 通过url向服务器发送requests请求,请求可以 ...

最新文章

  1. Vlan 4096的限制原因
  2. web中静态资源和动态资源的概念及区别
  3. Nginx学习笔记(七) 创建子进程
  4. setjump和longjump
  5. C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)
  6. linux 命令行图形界面切换
  7. 普通人赚大钱,做好这一点,才是真正的捷径
  8. 文件服务器 ftp服务器的优缺点,FTP服务器优缺点分析.doc
  9. 图的存储结构——邻接表
  10. 陕西中际现代:基于自适应算法的PLC滴灌控制系统
  11. BDC的执行模式与更新模式
  12. Steam平台——全球最大的游戏平台,现在给大家介绍下steam搬砖项目,这个项目既小众又稳定。
  13. 【每日一练】小米搜索框
  14. 硬核FutureTask解析
  15. 婴幼儿呼吸道感染和发烧
  16. Wikibon:云计算2022年及以后的发展趋势
  17. 什么是好的技术氛围?
  18. Windows快捷键命令
  19. DroidDraw不能运行,显示The application requires a Java Runtime Environment 1.4.0的问题
  20. 强大的字体编辑器推荐,设计属于自己的字体

热门文章

  1. hashset java_Java HashSet clear()方法与示例
  2. c#象棋程序_C ++程序确定象棋方块的颜色
  3. HashMap 的 7 种遍历方式与性能分析!「修正篇」
  4. Redis 6.0 正式版终于发布了!除了多线程还有什么新功能?
  5. 苹果系统使用之输入法的呈现与设置问题
  6. Python RSA加密与解密 公钥和私钥 读写pem文件
  7. Navicat中无法自定义标量值函数的问题
  8. php维护页面,php – Symfony2中的“维护网站”页面
  9. html5的交互标签,html5里交互元素的使用方法
  10. java反码_Java:二进制(原码、反码、补码)与位运算