Python爬虫基础01–认识爬虫

一、爬虫概念

1.什么是爬虫?
​程序猿:写程序,然后去互联网上抓取数据的过程
​互联网:网,有好多的a链接组成的,网的节点就是每一个a链接 url(统一资源定位符)
2.哪些语言可以实现爬虫?
​(1)php,可以做,号称世界上最优美的语言,多进程、多线程支持的不好
​(2)java,也可以做爬虫,人家做的很好,最主要的竞争对手,代码臃肿,重构成本大
​(3)c、c++,是你能力的体现,不是良好的选择
​(4)python,语法简单、代码优美,学习成本低,支持的模块多,非常强大的框架 scrapy

二、爬虫分类:通用爬虫、聚焦爬虫

1.通用爬虫:

​例如:百度、360、搜狐、谷歌、必应等
​原理:
​(1)抓取网页
​(2)采集数据
​(3)数据处理
​(4)提供检索服务
​爬虫:baiduspider
通用爬虫如何抓取新网站?
​(1)主动提交url
​(2)设置友情链接
​(3)百度会和DNS服务商合作,抓取新网站
​检索排名
​竞价排名
​根据pagerank值、访问量、点击量(SEO岗位)
​robots.txt
​如果不想让百度爬取,可以编写robots.txt,这个协议是口头上的协议
​自己写的爬虫程序不需要遵从
2.聚焦爬虫
聚焦爬虫就是根据特定的需求,抓取指定的数据
聚焦爬虫的思路?就是代替浏览器上网

网页的特点:
		(1)网页都有自己唯一的url
		(2)网页内容都是html结构的
		(3)使用的都是http、https协议

爬取数据步骤

(1)给一个url
(2)写程序,模拟浏览器发送http请求,访问url
(3)解析内容,从html中提取数据(其实整个网页就是字符串),从字符串中根据规则提取制定数据

所需环境:
​windows环境、linux环境
​Python3.6—64位的(32位的某些依赖库不支持)
​sublime pycharm

三、爬虫的主要内容

(1)使用到的python库
		urllib\requests\selenium\jsonpath\lxml等一些库
(2)解析网页内容的知识
		正则表达式、bs4解析、xpath解析、jsonpath解析
(3)涉及采集动态html
		DOM操作动态的添加或者删除节点,selenium+phantomjs、chromeheadless
(4)scrapy框架
		异步高性能框架使用
(5)scrapy-redis组件分布式部署
		redis,分布式爬虫
(6)涉及到爬虫-反爬虫-反反爬虫的一些内容
反爬虫会会伤害真实的用户,一般情况下,反爬虫涉及到
		UA、代理(封ip)、验证码(图形、滑块、光学识别,打码平台)、、动态页面等

四、http协议

什么是协议?双方规定的传输形式,

1.http协议:网站原理

![](D:\Pythonfile\Four爬虫\扣丁学习笔记\day01 爬虫的介绍\网站原理.png)


​应用层的协议 ftp(21)
​http(80)\https(443) ssh(22) mysql(3306) redis(6379)
​mongo(27017)
https://www.cnblogs.com/wqhwe/p/5407468.html
2.HTTPS和HTTP的区别主要如下:

(1)、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
(2)、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
(3)、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
(4)、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

​公钥、私钥
​加密:密钥 解密:密钥
​对称加解密
​非对称加解密
​服务端:公钥、私钥
​http协议详解(图解http协议)
https://www.cnblogs.com/10158wsj/p/6762848.html

3.组成

​http请求
​包含:请求行、请求头、请求内容
4.请求行

​包括请求方式、请求资源、协议版本号

​get、post,以及区别

5.HTTP常见请求头:

​accept:浏览器通过这个头告诉服务器,它所支持的数据类型
​  Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
​  Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式
​  Accept-Language:浏览器通过这个头告诉服务器,它的语言环境
​  Host:浏览器通过这个头告诉服务器,想访问哪台主机
​  If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间
​  Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链
​  Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接
​X-Requested-With: XMLHttpRequest 代表通过ajax方式进行访问

![](D:\Pythonfile\Four爬虫\扣丁学习笔记\day01 爬虫的介绍\请求头.png)

6.http响应头部信息
​Location: 服务器通过这个头,来告诉浏览器跳到哪里
​  Server:服务器通过这个头,告诉浏览器服务器的型号
​  Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式
​  Content-Length: 服务器通过这个头,告诉浏览器回送数据的长度
​  Content-Language: 服务器通过这个头,告诉浏览器语言环境
​  Content-Type:服务器通过这个头,告诉浏览器回送数据的类型
​  Refresh:服务器通过这个头,告诉浏览器定时刷新
​  Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式打数据
​  Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的
​  Expires: -1 控制浏览器不要缓存
​  Cache-Control: no-cache
​  Pragma: no-cache

6.常见http状态码

常见的http状态码

100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。

101: 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。

102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。

200:请求成功 处理方式:获得响应的内容,进行处理(重要)

201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到

202:请求被接受,但处理尚未完成 处理方式:阻塞等待

204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃

300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃
301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL(永久重定向,重要)

302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL(临时重定向,重要)

304:请求的资源未更新 处理方式:丢弃,使用本地缓存文件(没有发送请求,用的是本地缓存文件,重要)

400:非法请求 处理方式:丢弃

401:未授权 处理方式:丢弃

403:禁止 处理方式:丢弃(重要)

404:没有找到 处理方式:丢弃(重要)

500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。(服务器问题,代码有问题,重要)

501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。

502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。

503:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。

五、抓包工具

1.谷歌自带的抓包工具

右键开发者工具network–>

XHR:xmlHttpRequest 前端想发送ajax请求,通过他创建对象发送请求

query_string_parameters请求字符串,get参数

form data: post参数

2.抓包工具fiddler

自己下载安装包,主要用来看抓到的内容有哪些头部

(1)、配置


	tools==>options==>https
	选中:capture https
		  decrypt https trafic
		  ignore xxx
	点击右边的action,信任根证书
	配置完毕,fiddler关闭重启即可

(2)、界面使用


	<> : html内容
	{json} : json数据,很有可能就是个接口
	{css} : css文件
	{js} : js文件

	停止抓取: file==》capture  点击就会切换

	点击请求,右边选中 Inspectors
	右上:http请求信息
		raw:请求头部的详细信息(纯文本内容)
		webforms: 请求所带参数,query_string  formdata
	右下:http响应信息
		首先点击黄色条进行解码
		raw: 响应的所有信息(以纯文本的形式)
		headers:响应头
		json:接口返回的内容

(3)常用指令

左下黑色框,输入指令
		cls:清楚所有请求
		select json: 快速选择所有json请求
		select image: 图片请求
		select html: html请求
		?内容 : 搜索包含这个内容的所有请求
		敲enter执行

六、sublime插件安装:

sublime的基础使用应该很简单,涉及到爬虫内容需要安装相关插件
1.安装插件管理器----package control
安装两种方式:
(1)指令安装

安装 package control , 按view下面的 show console, 输入如下指令敲enter即可
	import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())
问题解决:
	解决输入pci,找不到包库的问题
	输入如下指令,敲enter
	import urllib.request,os,hashlib; h = 'eb2297e1a458f27d836c04bb0cbaf282' + 'd0e7a3098092775ccb37ca9d6b2e4b7d'; pf = 'Package Control.sublime-、package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)

	解决鼠标跟随问题
		安装IMESupport插件
	代码智能提示插件
		Anaconda
	终止程序运行
		Tools==>Cancel Build
		设置快捷键
		{
			"keys": ["ctrl+shift+p"],
			"command": "cancel_build"
		}

(2)下载packagecontrol包放到指定位置即可(搜教程)

安装成功后, 在界面preferences下拉菜单可以查看packagecontro包

2、安装插件
​输入ctrl+shift+p
​输入pci,选中 install packages
​进来输入插件名字点击就能安装

例如

安装IMESupport插件   解决鼠标跟随问题
Anaconda   代码智能提示插件
emmet      html快速插件

七、urllib库—request

1.什么是urllib

​urllib库就是模拟浏览器发送请求的库,Python自带,不用安装

Python2系列:

urllib
urllib2

Python3系列:

urllib.request   模拟发送请求
urllib.parse      处理参数或者url
urllib.error 	如何处理异常

2.基本命令

字符串==》字节类型之间的转化
	encode()    字符串-->字节类型
		encode翻译成编码
		如果小括号里面不写参数,默认是utf8,如果写,你就写 gbk
	decode()    字节类型 -->字符串
		decode翻译成解码
		如果不写   默认utf8
		如果写   写 gbk
urllib.request
	urlopen(url)   发送请求
	urlretrieve(url, image_path)  下载
urllib.parse
	quote   url编码函数,将中文进行转化为%xxx
	unquote url解码函数,将%xxx转化为指定字符
	urlencode  给一个字典,将字典拼接为query_string,并且实现了编码的功能
response
	read()       读取相应内容,内容是字节类型
	geturl()     获取请求的url
	getheaders() 获取头部信息,列表里面有元组
	getcode()    获取状态码
	readlines()  按行读取,返回列表,都是字节类型

【案例】基础演示:

import urllib.request

url = 'http://www.baidu.com'

response = urllib.request.urlopen(url=url)
print(response)
print(response.geturl())   #获取url地址
print(dict(response.getheaders()))  #头部信息
print(response.getcode()) 	#获取状态码
print(response.readlines())  #获取网页信息
print(response.read().decode()) #读取网页信息

3.将内容保存成文件

例1.将获取的内容保存到htnl文件中

import urllib.request


url = 'http://www.taobao.com'

response = urllib.request.urlopen(url=url)

with open('taobao.html','w',encoding='utf8')as f:
    f.write(response.read().decode('utf8'))

显示结果:此时同级中生成一个taobao.html文件会将淘宝网的页面信息写在‘taobao.html’文件中

例2:不考虑编码,直接二进制

import urllib.request

url = 'http://www.taobao.com'
response = urllib.request.urlopen(url=url)

with open('taobao2.html','wb')as f:
    f.write(response.read())

结果:生成文件

例3.用urlretrieve方法

import urllib.request

url = 'http://www.csdn.net'
response = urllib.request.urlopen('http://www.csdn.net')

urllib.request.urlretrieve(url,'csdn.html')

4.将图片文件下载到本地

方式一:写

在网页中找到图片,右击复制图片网址

import urllib.request

url = 'http://img.zcool.cn/community/01d881579dc3620000018c1b430c4b.JPG@3000w_1l_2o_100sh.jpg'
response = urllib.request.urlopen(url)

with open ('man.jpg','wb')as f:
	f.write(response.read())

此时会在当前目录下生成一个man.jpg图片文件

方式二:urlretrieve方式—

import urllib.request

url = 'http://img.zcool.cn/community/01d881579dc3620000018c1b430c4b.JPG@3000w_1l_2o_100sh.jpg'
response = urllib.request.urlopen(url)

#后面跟url、文件保存路径和名字,没有路径默认保存到当前路径下
urllib.request.urlretrieve(url,'man2.jpg')

八、urllib库—parse

urllib.psrse方法是用来处理url请求的,常用的有

url.parse.quote
url.parse.unquote
url.parse.urlencode

1.quote和unquote

url格式要求:

url只能由特定的字符组成,字母、数字、下划线
 如果出现其他的,比如 $ 空格  中文等,就要对其进行编码,

这里要用到url.parse.quote,将编码后的url进行解码就用到url.parse.unquote

注意:平时网上也有编码和解码的在线编解码器

【例】

import urllib.parse

url = 'https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&word=周杰伦'
string1 = urllib.parse.quote(url)
string2 = urllib.parse.unquote(url)
print(string1)
print(string2)

运行结果

https%3A//www.baidu.com/s%3Frtt%3D1%26bsst%3D1%26cl%3D2%26tn%3Dnews%26word%3D%E5%91%A8%E6%9D%B0%E4%BC%A6
https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&word=周杰伦

2.urlencode

还是以刚才的url为例

方式一:遍历拼接

url = 'https://www.baidu.com/s?rtt=1&bsst=1&cl=2&'
data = {
    "tn":"news",
    'word':'baby'
}
# 将data放到url后面
# 遍历字典,拼接为指定格式
lt = []
for k,v in data.items():
    values = k + '=' +v
    lt.append(values)
# 将lt用&符号连接起来
query_string = '&'.join(lt)
# print(query_string)
url += query_string
print(url)

显示结果:

https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&word=baby

但是如果word的名字写成汉字就会显示汉字,不符合url的格式要求,这种方式不会自动编码

所以就会用到urlencode方法

方式二:urlencode方法

url = 'https://www.baidu.com/s?rtt=1&bsst=1&cl=2&'
data = {
    "tn":"news",
    'word':'周杰伦'
}
query_string = urllib.parse.urlencode(data)
url += query_string
print(url)

输出内容:

https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&word=%E5%91%A8%E6%9D%B0%E4%BC%A6

这里将汉字自动编码了

九、构建请求头部信息(这是反爬第一步)

####1. User-Agent(简称UA)
User-Agent(简称UA),即用户代理,通过这个参数浏览器可以识别访问者的类型,包括操作系统、浏览器版本等,例如京东的pc端和手机端界面会根据大家的访问来判断是电脑端用户还是手机端用户。没有伪装请求头的话,从python运行爬虫文件浏览器会识别,所以爬虫第一步,自己定制UA

​伪装自己的UA,让服务端认为你是浏览器在上网

​构建请求对象: urllib.request.Request()

import urllib.request
import urllib.parse
import ssl
ssl._create_default_https_context = ssl._create_unverified_context


url = 'http://www.baidu.com/'

response = urllib.request.urlopen(url)
 print(response.read().decode())

# 自己要伪装的头部
headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
 }
# 构建请求对象
request = urllib.request.Request(url=url)
# 发送请求
response = urllib.request.urlopen(request)

print(response.read().decode())
11-05 22:57