一、爬虫概念
1.爬虫是什么:
卡卡写一段代码,代码的功能能从互联网中提取数据信息
2.互联网:
每一个互联网都有一个节点,节点就是一个Url(统一资源定位符),很多a链接组成
3.互联网爬虫:
简单来说互联网爬虫就是写代码,模拟浏览器访问节点(Url),从而提取数据内容。通俗易懂
4.能用哪些语言实现爬虫?
(1)PHP(自称最优美的语言,谁用谁知道。不是难用,关键你这PHP天生就对多线程、多进程支持的就不是很友好,优美有啥用,老哥?)
(2)Java(是咱们Python最主要的竞争对手,学Python吗肯定得喷一下他们的缺点呀,比如代码臃肿,项目重构代价大等等,不敢多喷,毕竟在互联网行业还是Java学的人多,瑟瑟发抖不敢说话)
(3)C,C++(大佬,绝对的大佬。Python这种编译性语言也是根据C来编写的,用C,C++来写爬虫不说别的,就是NB。如果有C,C++爬虫大佬。请收下我的膝盖)
(4)Python(到自己家了哈,那不吹不黑,代码简洁对吧,学习成本低对吧,支持模块多也没错吧,关键还有专门的爬虫框架Scrapy框架,你说是有多方便,多便捷。这都是知识点呀,)
5.通用爬虫、聚焦爬虫
通用爬虫:
搜索引擎:百度、360、火狐、谷歌等
①从互联网上抓取所有的数据 ②对数据进行处理 ③对用户提供检索服务
例如百度抓取新的内容?
①主动将域名提交给百度 ②在其他网站设置友情链接 ③自己会和DNS(域名系统)服务商进行合作
有些东西我不想让你百度爬取信息,淘宝就不让百度爬取信息,你都爬出来了,我还挣哪门子钱。所以在一些大型的互联网公司都有一个协议
Robots协议:这个Robots协议简单来说就是一个君子协议。这个协议就是一个文件,让在你网站的根目录。在写到框架的时候在说这个协议。(像咱们这些写的爬虫程序,你就先没必要遵从,毕竟是学习吗。)
对了,科普一下。百度搜索中一些排名分为两种方式:
①根据pagerank的值进行排名 ②竞价排名,谁出价高就先把谁放到前面。太烧钱了
通用爬虫的缺点:
1.抓取的很多数据都是没用的
2.不能根据需求来抓取信息
聚焦爬虫:
根据自己需求来抓取你所需要的数据信息。
如何实现抓取指定的数据?
①每一个网页都有自己唯一的Url
②网页都是有html组成的
③网页传输使用的都是http、https协议
聚焦爬虫的思路分为以下三步:
第一步:要抓取网页的Url
第二步:写代码模拟浏览器发送Http请求
第三步:解析网页内容,字符串处理,根据指定规则提取数据
6.开发环境:
windows、linux都可以
python 3.x 64位
编辑工具:pycharm sublime
7.整体内容介绍:
① 模拟浏览器发送请求
urllib.request \ urllib.parse\ requests
② 解析内容
正则表达式、bs4、xPath、jsonpath
③ 动态html
selenium+phantomjs
④ scrapy框架学习
⑤ scrapy-redis组件
⑥ 涉及到爬虫-反爬虫-反反爬虫 内容
User-Agent、代理、验证码、动态数据
最终:理论上,只要浏览器能够访问的数据,你的程序就能访问
模拟登录
二、Http协议
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
http://www.baidu.com:80/index.html?username=goudan&password=123456&lala=xixi#dudu
一个完整的Url需要(协议 域名 端口号 请求的资源 get参数 锚点)组成
锚点:可以实现同一个页面跳转
3.请求
请求行、请求头、空行
常见请求头
accept:浏览器通过这个头告诉服务器,它所支持的数据类型
Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式(重要)
Accept-Language:浏览器通过这个头告诉服务器,它的语言环境
Host:浏览器通过这个头告诉服务器,想访问哪台主机
If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间
Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链(重要)
Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接
4.响应
状态行、响应头、实体内容
常见响应头
Location: 服务器通过这个头,来告诉浏览器跳到哪里
Server:服务器通过这个头,告诉浏览器服务器的型号
Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式
Content-Length: 服务器通过这个头,告诉浏览器回送数据的长度
Content-Language: 服务器通过这个头,告诉浏览器语言环境
Content-Type:服务器通过这个头,告诉浏览器回送数据的类型
Refresh:服务器通过这个头,告诉浏览器定时刷新
Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式打数据
Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的
Expires: -1 控制浏览器不要缓存
Cache-Control: no-cache
Pragma: no-cache
三、抓包工具
sublime安装和使用(1)安装插件管理器,packagecontrol
(2)安装插件
按:ctrl + shift + p
输入pci,点击installpackage即可
搜索想要安装的插件,敲enter即可安装
(3)卸载插件
按:ctrl + shift + p
输入remove,选中remove package即可
抓包:
谷歌浏览器自带抓包工具:
network,点击看详情
response.headers 响应头部
request.headers 请求头
query_string 请求字符串,get参数
formadata 请求参数,post参数
response: 响应内容
fiddler软件(专业抓包软件)
###必须要配置这一步,配置成功才能进行下一步。####
配置:正常步骤:options==》https==》capture https connects==>action==>trust root certificate
###这是windows系统配置方法,Mac、ubuntu配置自行百度。###
配置完毕,重启fiddler即可。
fiddler使用文档
1、配置
2、使用
左边:所有的请求
<> : 返回的是html文档
图片标记:代表是图片
{json} : 返回json格式
{css} : css文件
js: js文件
右边:查看某个请求的详细信息
inspectors
右上:这个请求所有的请求信息
raw:请求的原始信息
webforms:请求所带参数,query_string代表get参数,formdata代表post参数
右下:所有的响应信息
raw:查看详细的响应信息
json:如果返回的是json数据,在这里查看
清除所有请求
removeall 清除所有请求
file==》capture 关闭或者启动抓包
快捷键:
select html : 所有的html请求
select js : 所有的js请求
?baidu : 选中所有带有baidu的请求
cls : 清除所有的请求
四、Urllib库
urllib库是干什么的?
是Python用来模拟http发送请求的,是Python中自带的一个模块。
python 2.x : urllib, urllib2
python 3.x : urllib
urllib.request : 发送请求、获取响应
urlopen(url=xxx, data=xxx) : 发送get,直接将参数拼接到url的后面,发送post,就需要data参数了
urlopen()#打开url
urlretrieve()#不仅要打开url,还要保存url
import urllib.request
url = 'http://www.baidu.com/'
# 发送请求
# response = urllib.request.urlopen(url)
read() : 读取的为二进制数据,需要进行转换
# print(response.read().decode())
readlines() : 读取为列表格式,按行读取
# print(response.readlines())
getcode() : 获取状态码
# print(response.getcode())
geturl() : 获取请求的url
# print(response.geturl())
getheaders() : 返回响应头部,列表里面有元组
# print(response.getheaders())
response对象:
read() : 读取的为二进制数据
字符串类型《====》二进制类型
encode() : 字符串格式转化为二进制格式,不写代表utf8,写gbk就代表gbk
decode() : 二进制转为字符串,不写就是utf8,写gbk就是gbk
readlines() : 读取为列表格式,按行读取
getcode() : 获取状态码
geturl() : 获取请求的url
getheaders() : 返回响应头部,列表里面有元组
# 将响应的内容保存起来, 考虑字符集
# with open('baidu.html', 'w', encoding='utf8') as fp:
# fp.write(response.read().decode())
# 不考虑字符集
# with open('baidu1.html', 'wb') as fp:
# fp.write(response.read())
# urllib.request.urlretrieve(url=url, filename='./baidu2.html')
urllib.parse: 用来处理数据
quote():对Url里面的非法字符进行编码。只能出行字母、数字、下划线、&、://
unquote():url解码
url = 'http://www.baidu.com/index.html?username=狗蛋&pwd=123'
# url编码
string = urllib.parse.quote(url)
# url解码
lala = urllib.parse.unquote(string)
print(lala)
#####queote与unquote一般是成对出现#######
urlencode():
将其拼接组成起来
url = 'http://www.baidu.com/index.html?'
# get参数
data = {
'username': '狗蛋',
'pwd': '123',
'height': '170'
}
string = urllib.parse.urlencode(data)
url += string
print(url)
5、构建请求对象
User-Agent : 客户端浏览器类型
定制请求头部,将自己伪装成pc浏览器
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}
# 构建请求对象
request = urllib.request.Request(url=url, headers=headers)