Python网络爬虫
第1章 Python爬虫的分类
1.1 通用爬虫:
通用爬虫是搜索引擎BaiDu Google YaHoo等,抓取的重要组成部分,主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。
1.2 聚焦爬虫
是根据指定的需求抓取网络上的数据
1.3 Robots.txt协议
自己的门户网站中的指定页面中的数据不想让爬虫程序取到的化,那么则可以通过编写一个robots.txt的协议文件来约束爬虫程序的数据爬取
1.4 反爬虫
门户网站通过相应的策略和技术手段,放置爬虫程序进行网站数据的爬取
1.5 反反爬虫
爬虫程序通过相应的策略和技术的手段,破解门户网站的反爬虫手段,从而爬取到相应的数据
第2章 什么是Jupyter Notebook
2.1 简介
Jupyter Notebook是基于网页的用于交互式计算的应用程序,期可被应用用全过程编码开发,文档编写,运行代码和展示结果
Jupyter Notebook的主要特点
- 编写时具有语法高亮、缩进、tab补全的功能
- 可直接通过浏览器运行代码,同时在代码块下放展示运行的结果
- 对代码编写说明文档或语句时,支持Markdown语法
2.2 安装
安装前提:
安装Jupter Noteboo的前提需要安装python3.3版本或2.7以上的版本
使用Anaconda安装
通过安装Anacida来解决Jupter NoteBoo的安装问题
官方下载地址: www.anaconda.com/download 自行下载,傻瓜式安装,默认配置环境变量
运行Jupyter Notebook
Jupyter notebook
2.3 使用介绍
常用快捷键
向下插入一个cell b
向上插入一个cell a
将cell的类型切换成Markdown类型 m
将cell的类型切换成code类型 y
运行 shift + enter
帮助文档 Shift + Tab
补全 tab
第3章 网络爬虫模块
3.1 Urlib
Python中自带的一个基于爬虫的模块。
作用:可以使用代码模拟浏览器发起请求.request parse
使用流程:
指定url
发起请求
获取页面数据
持久化存储
实例3-1 需求 爬取搜狗首页数据
#需求爬取搜狗首页
import urllib.request
#1.指定url
url = 'https://www.sogou.com/'
#2.发请求,urlopen可以根据指定的url发起请求,且返回一个响应对象
response = urllib.request.urlopen(url=url)
#3.获取页面数据:read函数返回的就是响应对象中存储的页面数据(byte)
page_text = response.read()
#4.持久化存储
with open('./sogou.html','wb') as fp:
fp.write(page_text)
print('写入数据成功')
#需求:爬取指定词条所对应的页面数据
import urllib.request
import urllib.parse
#指定url
url = 'https://www.sogou.com/web?query='
#url的特性:url不可以存在非ASCII编码的字符数据
word = urllib.parse.quote('范冰冰')
url += word #有效的url
#发送请求
response = urllib.request.urlopen(url=url)
#获取页面数据
page_text = response.read()
print(page_text)
#将获取的数据做持久化存储
page_text = response.read()
with open('fanbingbing.html','wb') as fp:
fp.write(page_text)
print('写入成功')
3.2 反爬机制
-反爬虫机制:网站会检查请求的UA,如果发现请求的UA是爬虫程序,则拒绝提供网站数据
-User-Agent(UA):请求载体的身份标识
-反反爬机制:伪装爬虫程序请求的UA,
实例3-2 UA伪装
import urllib.request
url = 'http://www.baidu.com/'
#UA伪装
#1.自制定一个请求的对象
headers = {
#存储任意的请求头信息
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
#该请求对象的UA进行了成功的伪装
request = urllib.request.Request(url=url,headers=headers)
#2.针对自制定的请求对象发起请求
response = urllib.request.urlopen(request)
print(response.read())
3.3 Post请求
import urllib.request
import urllib.parse
#指定url
url = 'https://fanyi.baidu.com/sug'
#post请求携带的参数进行处理 流程:
#1.将POST 请求参数封装到字典
data = {
'kw':'西瓜'
}
#2。使用parse模块中的urlencode(返回值类型为str)进行编码处理
data = urllib.parse.urlencode(data)
type(data)
#3.将步骤2的编码结果转换成byte类型
data = data.encode()
#2.发起post请求:urlopen函数的data参数表示的就是经过处理之后的post请求携带的参数
response = urllib.request.urlopen(url=url,data=data)
response.read()
3.4 Urllib操作
3.4.1 代理操作
什么是代理:代理就是第三方代替本体处理相关
代理分类:
正向代理:代理客户端获取数据,正向代理是为了保护客户端防止被追究责任
反响代理:代理服务端提供数据,反向代理为了保护服务器或负载均衡
3.5 Requests模块
1、 什么是requests模块
Python原生一个基于网络请求的模块,模拟浏览器发起请求。
2、 为什么要使用requests模块
- 自带处理url编码,
- 自动处理post请求的参数urlencode()
- 简化Cookie的代理的操作
创建一个cookiejar对象
创建一个handler对象
创建一个openrner
创建一个handler对象,代理IP和端口封装到该对象
创建openner对象
3.requests如何被使用
安装:pip install requests
使用流程:
- 指定url
- 使用requests模块发起请求
- 获取响应数据
- 进行持久化存储
3.6 基于requests模块
实例3-3 —爬取搜狗首页
import requests
url = 'https://www.sogou.com/'
#发起get请求:get 方法会返回请求成功后的响应对象
response = requests.get(url=url)
#获取响应中的数据值,text可以获取响应对象中的字符串形式页面的数据
page_data = response.text
print(page_data)
#持久化操作
with open('./sogou.html','w',encoding='utf-8') as fp:
fp.write(page_data)
实例3-4 Response对象中其他重要的属性
#response对象中其他重要的属性
import requests
url = 'https://www.sogou.com/'
#发起get请求:get 方法会返回请求成功后的响应对象
response = requests.get(url=url)
#获取响应中的数据值,text可以获取响应对象中的字符串形式页面的数据
#content获取的是response对象中二进制类型的数据
# print (response.content)
#返回一个状态码
#print(response.status_code)
#返回相应头信息
# print(response.headers)
#获取请求的url
print(response.url)
实例3-5 Requests如何请求携带参数的get请求
-方式一
方式二
实例3-6 Requsts模块get请求自定义请求头信息
#自定义请求头信息
import requests
url = 'https://sogou.com/web'
#将参数封装到字典中
params = {
'query':'周杰伦',
'ie':'utf-8'
}
#自定义请求头信息
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
response = requests.get(url=url,params=params,headers=headers)
response.status_code
实例3-7 基于requests模块发起的post请求
#基于requests模块发起的post请求
#- 需求:登陆豆瓣网,获取登陆成功后的页面数据
import requests
url = 'https://accounts.douban.com/login'
#封装post请求的参数
data = {
'source':'movie',
'redir':'https://movie.douban.com/',
'form_email':'18401747334',
'form_password':'fei@163.com',
'login':'登录',
}
#自定义请求头信息
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
#发起post请求
respomse = requests.post(url=url,data=data,headers=headers)
#获取响应对象中的页面数据
page_text = respomse.text
#持久化
with open('./douban.html','w',encoding='utf-8') as fp:
fp.write(page_text)
实例3-8 Requests模块ajax的get请求、
#基于ajax的get请求
import requests
url = 'https://movie.douban.com/j/chart/top_list?'
#封装ajax的get请求中携带的参数
params = {
'type': '13',
'interval_id': '100:90',
'action': '',
'start': '10',
'limit': '20'
}
#请求头信息
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
respomse = requests.get(url=url,params=params,headers=headers)
print(respomse.text)
实例3-9 基于ajax的post请求
#基于ajax的post请求
#需求:爬取肯德基城市餐厅位置数据
import requests
#指定url
post_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
#post请求的参数
data = {
'cname': '',
'pid': '',
'keyword': '杭州',
'pageIndex': '1',
'pageSize': '10'
}
#自定义请求头
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
#发起基于ajax的post请求
response = requests.post(url=post_url,headers=headers,data=data)
response.text
3.7 Requests模块综合学习
## 获取前3页
import requests
import os
#创建文件夹
if not os.path.exists('./pages'):
os.mkdir('./pages')
word = input('enter a word:')
#动态指定页码的范围
start_pagenum = int(input('enter a start pageNum:'))
end_pageNum = int(input('enter a end pageNum:'))
#请求头信息
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
#指定url,设计成一个具有通用的url
url = 'https://zhihu.sogou.com/zhihu'
for page in range(start_pagenum,end_pageNum+1):
param = {
'query':word,
'page':page,
'ie':'utf-8'
}
response = requests.get(url=url,params=params,headers=headers)
#获取相应中的页面数据(指定页面(page))
page_text = respomse.text
#持久化
fileName = word +str(page)+'.html'
filePath = 'pages/'+fileName
with open(filePath,'w',encoding='utf-8') as fp:
fp.write(page_text)
print('第%d页写入成功'%page)
实例3-10 Requests – cookie
--cookie
基于用户的用户数据
-需求:爬取张三用户的豆瓣网上的个人主页页面数据
--cookie作用:
1.执行登陆操作(获取cookie)
2.在发起个人主页请求时,需要将cookie携带到请求中
注意:session对象:发送请求
-代理操作:
为什么使用代理?
- 反爬操作
- 反反爬虫手段
分类:
正向代理:代替客户端获取数据
反向代理:代理服务端提供数据
免费代理ip的网站提供商
快代理
西祠代理
第4章 三种数据解析方式
4.1 数据解析
指定url
发起请求
获取数据
数据解析
持久化存储
4.2 三种数据解析方式
正则
Bs4
Xpath
安装xpath插件:就可以直接将xpath表达式作用于浏览器的网页当中
4.3 动态页面加载
- seleniun
- phantomJs
第5章 Scrapy框架
实例5-1
#创建爬虫项目
#创建爬虫文件
#编写爬虫文件
修改setting的19行的AU和22行的ROBOTSTXT_OBEY默认是true 改成False不让他遵循ROBOTS协议
启动>scrapy crawl qiubai –nolog
5.1.2 持久化存储
持久化存储操作
A 磁盘文件
基于终端指令:
保证parse方法返回一个可迭代类型的对象(存储解析到页面内容)
使用终端指令完成数据存储到指定的文件当中
-o 指定的磁盘文件 –nolog 不输出日志
实例5-2 基于管道的数据存储
- items:存储解析到的页面数据
- pipelines:处理解析持久化存储相关操作
- 基于mysql
- 基于redis存储