一、初始爬虫
1.爬虫的相关概念
1.1 什么是爬虫
网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动地爬取互联网信息的程序。
原则上,只要是浏览器(客户端)能做的事情,爬虫都能够做。
1.2 如何获取爬虫程序
-
下载其他公司开发的通用爬虫(八爪鱼)
-
开发人员自己编写
1.3 区别
通用爬虫:可以提取大多数网站的数据,但是对于网站中某些特殊数据的提取范式没有实现
自定义爬虫:可以针对某一种网站自行开发符号要求的爬虫
1.4 开发语言
只要能够发送HTTP(S)请求的任何编程语言都是可以完成爬虫程序的,例如:C++、java、php、JavaScript等待,但是论爬虫开发效率一般都指的是python语言。
1.5 爬虫分类
根据抓取网站的数量不同,大致将爬虫分为两种:
- 通用爬虫:通常指搜索引擎的爬虫,例如:https://www.baidu.com
- 聚焦爬虫:针对特定网站的爬虫
2.爬虫流程
聚焦爬虫代码执行流程:
流程说明:
- 向起始地址发送请求,并获取响应
- 对响应结果进行数据提取
- 如果获取的数据是新的网站地址则继续发送请求并获取响应
- 如果获取的数据为页面需要的数据则完成数据保存
3.HTTP与HTTPS协议
目前大部分网站时基于HTTP与HTTPS进行网络交互的,在爬虫程序中也是发送网络协议来获取对应的网站信息,所以还是有必要了解网络协议。
3.1 HTTP与HTTPS相关概念
- HTTP
- 超文本传输协议
- 默认端口号:80
- HTTPS
- HTTP+SSL(安全套接字层),即带有安全套接字层的超文本传输协议
- 默认端口号:443
HTTPS比HTTP更安全,但是性能更低
HTTP协议的重要信息
我们想要给浏览器发送信息并显示,就必须要带上HTTP协议。HTTP协议中有一部分数据对爬虫程序来说非常重要。分别时请求头与响应头。
常见的请求头参数:
- Host(主机和端口号)
- Connection(链接类型)
- Upgrade-Insecure-Requests(升级为HTTPS请求)
- User-Agent(浏览器名称)
- Accept(传输文件类型)
- Referer(页面跳转处)
- Accept-Encoding(文件编解码格式)
- Cookie(Cookie信息)
- x-requested-with:XMLHttpRequest(表示该请求是Ajax异步请求)
响应头参数:
- Set-Cookie(对方服务器设置cookie到用户浏览器的缓存)
响应状态码:
- 200:成功
- 302:临时转移至新的url(一般会用GET,例如原本是POST则新的请求则是GET)
- 307:临时转移至新的url(原本是POST则新的请求依然是POST)
- 403:无请求权限
- 404:找不到该页面
- 500:服务器内部错误
- 503:服务不可用,一般是被反爬
3.2 浏览器发送HTTP请求过程
- 客户端发送网站域名到DNS服务器
- DNS服务器返回IP地址到客户端
- 客户端根据返回的IP地址访问网站后端服务器并请求网站资源
- 网站后端服务器返回对应页面资源
3.3 robots协议
网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,但它仅仅是互联网中的约定而已,可以不用遵守。
3.4 谷歌浏览器插件
- XPath Helper
- Web Scraper
- Toggle JavaScript
- User-Agent Switcher for Chrome
- EditThisCookie
- SwitchSharp
插件下载地址:
- https://extfans.com/
- https://chrome.zzzmh.cn/#/index
3.5 请求测试软件
PostMan : https://www.postman.com/downloads
ApiPost : https://www.apipost.cn/download.html
4.编码
字符是各种文字和符号的总称,包括国家文字、标点符号、图形符号、数字等等。
字符集是多个字符的集合,字符集包括:ASCII、GB2312、Unicode等等。UTF-8是Unicode的实现方式之一。
Python3中的字符串:
- str: unicode的呈现
- bytes:字节类型,互联网上的数据都以二进制的方式传输的
str 与 bytes 类型的互相转换
- str 使用 encode 方法转换为 bytes
str_code='abc'
print(type(str_code))
byte_code=str_code.encode()
print(type(byte_code))
- bytes 使用 decode 方法转换为str
byte_code=b'abc'
print(type(byte_code))
str_code=byte_code.decode()
print(type(str_code))
注意:编码方式必须和解码方式一样,否则就会出现乱码问题。例如使用utf-8编码,那么就必须使用utf-8解码。