一、爬虫基本概念:
1.通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程。
2.实现爬虫的主流编程语言及缺点:
(1)PHP:对多线程、多进程的支持不好
(2)代码臃肿,重构成本较大
(3)C/C++:是一个非常不明智的选择,学习成本高,使用难度大,很装X
(4)PYTHON:几乎没有缺点!!!代码优雅,学习成本低,具有非常多的模块,并具有框架的支持:Scrapy
3.使用场景(分类)
(1)通用爬虫:是搜索引擎中“抓取系统”的重要组成部分。(爬取的是整张页面)
①搜索引擎如何抓取互联网的网页?
1)门户主动将自己的url提交给搜索引擎公司
2)搜索引擎公司会和DNS服务商进行合作
3)挂靠知名网站的友情链接
(2)聚焦爬虫:根据指定的需求去网上爬去指定的内容
4.robots.txt协议:指定的是门户中哪些数据可以供爬虫程序进行爬取和非爬取
5.反爬虫:门户网站可以通过某些技术手段或者策略阻止爬虫程序对其数据的爬取
6.反反爬虫:爬虫程序通过某些技术手段或者策略破解门户网站的反扒策略
二、http和https
1.http:HTTP协议就是服务器(Server)和客户端(Client)之间进行数据交互(相互传输数据)的一种形式。我们可以将Server和Client进行拟人化,那么该协议就是Server和Client这两兄弟间指定的一种交互沟通方式
2.Request:
常见的请求头:
accept:浏览器通过这个头告诉服务器,它所支持的数据类型
Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式
Accept-Language:浏览器通过这个头告诉服务器,它的语言环境
Host:浏览器通过这个头告诉服务器,想访问哪台主机
If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间
Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链
Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接
X-Requested-With: XMLHttpRequest 代表通过ajax方式进行访问
User-Agent:请求载体的身份标
3.Response:
Location: 服务器通过这个头,来告诉浏览器跳到哪里
Server:服务器通过这个头,告诉浏览器服务器的型号
Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式
Content-Length: 服务器通过这个头,告诉浏览器回送数据的长度
Content-Language: 服务器通过这个头,告诉浏览器语言环境
Content-Type:服务器通过这个头,告诉浏览器回送数据的类型
Refresh:服务器通过这个头,告诉浏览器定时刷新
Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式打数据
Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的
Expires: -1 控制浏览器不要缓存
Cache-Control: no-cache
https:安全超文本传输协议,HTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版。
SSL三种加密方式:
对称秘钥加密:
非对称秘钥加密:
数字证书秘钥加密:
四、Requests模块:
1.Requests:非常强大。
(1)指定url
(2)发请求
(3)数据解析
(4)持久化存储
安装:pip3 install requests
2.Get
3.Post
4.Ajax的get
5.Ajax的post
6.综合练习
三、知识笔记
requests入门 response的常用方法 response.text 和response.content的区别?
为什么要学习requests,而不是urllib?
1. requests的底层实现就是urllib
2. requests在python2 和 python3中通用,方法完全一样
3. request简单易用
4. Requests能够自动帮助我们解压(gzip压缩的等)网页内容
requests的作用:
作用:发送网络请求,返回响应数据
response = requests.get(url)
response的常用方法:
response.text
response.content
response.status_code
response.request,headers
response.headers
response.text 和response.content的区别?
response.text
类型:str
解码类型:根据HTTP头部对响应的编码做出有根据的推测,推测的文本编码
如何修改编码方式:response.encoding="gbk"
response.content
类型:bytes
解码类型:没有指定
如何修改编码方式:response.content.decode("utf8")
Progress Telerik Fiddler Web Debugger 软件使用技巧:
QueryString 集合检索 HTTP 查询字符串中变量的值。HTTP 查询字符串由问号 (?) 后的值指定。
最简单的爬虫案例:
#演示一个最简单的爬虫程序
#导包
import requests
#import urllib.request
#import urllib.parse
#指定一个url
url = 'https://www.taobao.com'
#通过requests模块发起请求:get函数返回响应对象
response = requests.get(url=url)
#response.json()#获取响应对象中json格式的数据
#response.encoding #获取响应数据的编码格式(可被修改)
#content获取的是二进制的数据
#data = response.content
#获取响应内容(爬取淘宝页面数据)
#response.status_code #响应状态码
#response.headers #获取响应头信息
data = response.text #获取字符串类型的数据
print(response.encoding)
简单get请求案例:
import requests
import urllib.parse
import urllib.request
#requests的get请求
#模拟抓取系统:手动指定关键字进行百度搜索,保存搜索结果
wd = input('enter a word:')
get_url = 'http://www.baidu.com/s'
#url的特性:url必须是有ASCII编码的数据组成
#可以将请求携带的参数封装到一个字典中
param = {
'ie':'utf-8',
'wd':wd
}
#参数2:对请求参数的封装
response = requests.get(url=get_url,params=param)
#response.encoding = 'utf-8'
data = response.text
fileName = wd + '.html'
with open(fileName,'w',encoding='utf-8') as fp:
fp.write(data)
简单post请求案例:
#百度翻译
import requests
#如下两行代码表示的是忽略证书(SSLError)
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
url ='https://fanyi.baidu.com/sug'
#post请求参数的封装
data = {
'kw':'dog'
}
#给请求对象进行定制
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
response = requests.post(url=url,data=data)
print(response.text)
简单的IO操作:
#需求:根据指定的url进行网页数据的爬取,且进行持久化操作(即将数据存储在硬盘中为持久化操作)
import requests
#指定url
url = 'https://www.taobao.com'
#发起请求
response = requests.get(url)
#response.encoding = 'utf-8'
data = response.text
#进行文件操作
with open('./taobao.html','w',encoding='utf-8') as fp:
fp.write(data)
print('over')
简单的Ajax-get请求案例:
import requests
url = 'https://movie.douban.com/j/chart/top_list'
param = {
'type':'13',
'interval_id':'100:90',
'action':'',
'start':'1',
'limit':'20'
}
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
response = requests.get(url,headers=header,params=param)
print(response.text)
简单的Ajax-post请求案例:
import requests
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
address = input('enter a address:')
start_page = int(input('enter a start pagenum: '))
end_page = int(input('enter a end pagenum:'))
for page in range(start_page,end_page+1):
data = {
'cname':'',
'pid':'',
'keyword':address,
'pageIndex':str(page),
'pageSize':'10'
}
response = requests.post(url=url,headers=header,data=data)
print(response.text)