一、爬虫介绍
1.1 内容介绍
爬虫简单⼀句话就是代替⼈去模拟浏览器进⾏⽹⻚操作。
为什么需要爬⾍
为其他程序提供数据源如搜索引擎(百度、Google等)、数据分析、⼤数据等等。企业获取数据的⽅式
1、公司⾃有的数据
2、第三⽅平台购买的数据 (百度指数、数据堂)
3、爬⾍爬取的数据Python做爬⾍的优势
1、PHP : 对多线程、异步⽀持不太好
2、Java : 代码量⼤,代码笨重
3、C/C++ : 代码量⼤,难以编写
4、Python : ⽀持模块多、代码简介、开发效率⾼ (scrapy框架)爬⾍的分类
1、通⽤⽹络爬⾍,例如:baidu、google、yahoo等搜索引擎(支持Robots协议)
2、聚焦⽹络爬⾍,根据既定的⽬标有选择的抓取某⼀特定主题内容。
3、增量式⽹络爬⾍,指对下载⽹⻚采取增量式的更新和只爬⾏新产⽣的或者已经发⽣变化的⽹⻚爬⾍。
4、深层⽹络爬⾍,指那些⼤部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有⽤户提交⼀些关键词才能获得的web⻚⾯。例如:⽤户登录注册才能访问的⻚⾯
1.2 几个概念
1.2.1 GET和POST
- GET : 查询参数都会在URL上显示出来。
只是从服务器获取数据,并不会对其产生影响! - POST : 查询参数和需要提交数据是隐藏在Form表单⾥的,不会在URL地址上显示出来。
会对服务器产生影响,比如输入密码、账户等!
1.2.2 URL组成部分
URL:统⼀资源定位符
https://new.qq.com/omn/TWF20200/TWF2020032502924000.html
1、https:协议
2、new.qq.com:主机名可以将主机理解为⼀台名叫 news.qq.com 的机器,这台主机在 qq.com 域名下。
3、port 端⼝号:80 /new.qq.com 在他的后⾯有个 :80 可以省略
4、TWF20200/TWF2020032502924000.html 访问资源的路径
5、#anchor:锚点⽤前端在做⻚⾯定位的。
PS:
注意 : 在浏览器请求⼀个url,浏览器会对这个url进⾏⼀个编码。(除英⽂字⺟、数字和部分标识其他的全部使⽤%加⼗六进制码进⾏编码)
例如 : https://tieba.baidu.com/f?ie=utf-8&kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&fr=search%E6%B5%B7%E8%B4%BC%E7%8E%8B = 海贼王
1.2.3 User-Agent ⽤户代理
作⽤:记录⽤户的浏览器、操作系统等,为了让⽤户更好的获取HTML⻚⾯效果。
User-Agent:
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36Mozilla Firefox:(Gecko内核)
1.2.4 Refer
- 表明当前这个请求是从哪个url过来的,⼀般情况下可以⽤来做反爬的技术。
(在网页network中的Headers中可看到网址),没有refer就表明是直接进入网站找到的数据,没有经过网站首页!
1.2.5 状态码
200 : 请求成功
301 : 永久重定向
302 : 临时重定向
403 : 服务器拒绝请求
404 : 请求失败(服务器⽆法根据客户端的请求找到资源(⽹⻚))
500 : 服务器内部请求
1.3 抓包工具
1、Elements : 元素 ⽹⻚源代码,提取数据和分析数据(有些数据是经过特殊处理的所以并不是都是准确的)。
2、Console : 控制台 (打印信息)
3、Sources : 信息来源 (整个⽹站加载的⽂件)
4、NetWork : ⽹络⼯作(信息抓包) 能够看到很多的⽹⻚请求
二、urllib.request模块(Python自带模块)
- 版本
python2 :urllib2、urllib
python3 :把urllib和urllib2合并,urllib.request
2.1 常用方法
-
urllib.request.urlopen("⽹址")
作⽤ :向⽹站发起⼀个请求并获取一个响应结果,用变量接收;再从响应对象中利用read()函数读取数据。
然后对网页进行“解码”(decode)得到如下结果:
总结:
获取字节流结果是:字节流 = response.read()
字符串 = response.read().decode("utf-8")
urlopen()不⽀持重构User-Agent,即headers -
urllib.request.Request("⽹址",headers="字典")
(1)创建请求对象(构建User-Agent)
(2)获取响应对象(urlopen())
(3)读取响应对象的内容(read().decode('utf-8'))
eg.
2.2 响应对象
- read() 读取服务器响应的内容
- getcode() 返回HTTP的响应码
-
geturl() 返回实际数据的URL(防⽌重定向问题)
eg.
三、urllib.parse模块(Python自带模块)
- 常用方法
urllib.parse.urlencode(字典)
eg1.
eg2.
urllib.parse.quote(字符串)
eg.