爬虫初始
爬虫相关介绍
- 什么是爬虫
-
就是通过编写程序,“模拟”浏览器上网,然后让其在互联网中“抓取”数据的过程。
- 模拟:浏览器本身就是一个纯天然的爬虫工具。爬虫相关的操作都是模拟/基于浏览器为基础开发实现出来的。
- 抓取:
- 一种是抓取一张页面中所有的数据
- 一种是抓取页面中局部的数据
-
提问:如果日后你的爬虫程序没有爬取到你想要的数据,why?
- 你的程序模拟浏览器的力度不够!
-
- 爬虫在应用场景的分类
- 通用爬虫:将一整张页面源码数据进行爬取。
- 聚焦爬虫:将一张页面中局部/指定的数据进行抓取。建立在通用爬虫的基础上。
- 爬虫的矛与盾(重点)
- 反爬机制:对应门户网站,网站可以指定相关的机制阻止爬虫对其网站数据的采集
- 反反爬策略:对应爬虫程序,爬虫可以制定相关的策略将网站的反爬机制破解,从而爬取到指定的数据
requests基础操作
-
基本介绍
- requests是一个基于网络请求的模块。可以使用程序模拟浏览器上网。
-
环境安装
- pip install requests
-
编码流程
- 指定url
- 发起请求
- 获取响应数据
- 持久化存储
import requests
# 指定url
url = 'https://www.eastmoney.com/'
# 发起请求
response = requests.get(url=url)
response.encoding = 'utf-8'
# 获取响应数据
page_text = response.text
# 持久化存储
with open('df.html', 'w', encoding='utf-8') as f:
f.write(page_text)
发送请求
- 爬虫模拟浏览器主要是模拟请求参数和主要的请求头。
- User-Agent:请求载体的身份标识。
- 使用浏览器发请求,则请求载体就是浏览器
- 使用爬虫程序发请求,则请求载体就是爬虫程序
- User-Agent:请求载体的身份标识。
- 反爬机制:UA检测
- 网站后台会检测请求的载体是不是浏览器,如果是则返回正常数据,不是则返回错误数据。
- 反反爬机制:UA伪装
- 将爬虫发起请求的User-Agent伪装成浏览器的身份。
请求方式
# get请求
requests.get()
# post请求
requests.post()
请求参数
- url :请求地址
- params :get请求中请求参数
- data :post请求中请求参数
- proxies={‘http’:‘xxx.xxx.xx.xx:xxxx’} : 代理地址请求
- headers :请求头
- User-Agent :身份标识
- Referer :防盗链
获取响应数据
# 获取html响应数据
response.text
# 获取json响应数据
response.json()
# 获取二进制响应数据(图片、音频、视频、压缩包、媒体资源)
response.content
获取图片
不用UA伪装的简洁处理
from urllib import request
request.urlretrieve(图片地址, 图片存储路径)
防盗链
-
现在很多网站启用了防盗链反爬,防止服务器上的资源被人恶意盗取。什么是防盗链呢?
-
从HTTP协议说起,在HTTP协议中,有一个表头字段:referer,采用URL的格式来表示从哪一个链接跳转到当前网页的。通俗理解就是:客户端的请求具体从哪里来,服务器可以通过referer进行溯源。一旦检测来源不是网页所规定的,立即进行阻止或者返回指定的页面。
-
哪里找Refere:抓包工具定位到某一张图片数据包,在其requests headers中获取
-
Cookie
-
什么是cookie?
-
cookie的本质就是一组数据(键值对的形式存在)
-
是由服务器创建,返回给客户端,最终会保存在客户端浏览器中。
-
如果客户端保存了cookie,则下次再次访问该服务器,就会携带cookie进行网络访问。
- 典型的案例:网站的免密登录
-
为什么拿不到数据?
- 切记:只要爬虫拿不到你想要的数据,唯一的原因是爬虫程序模拟浏览器的力度不够!一般来讲,模拟的力度重点放置在请求头中!
-
爬虫中cookie的处理方式(两种方式):
-
手动处理:将抓包工具中的cookie赋值到headers中即可
- 缺点:
- 编写麻烦
- cookie通常都会存在有效时长
- cookie中可能会存在实时变化的局部数据
- 缺点:
-
自动处理 (推荐)
-
爬虫的session会话对象:
- 在 爬虫里,session对象是一个非常常用的对象,这个对象代表一次用户会话(从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开)。session对象能让我们在跨请求时候保持某些参数,比如在同一个 Session 实例发出的所有请求之间保持 cookie 。
-
基于session对象实现自动处理cookie。
- 1.创建一个空白的session对象。
- 2.需要使用session对象发起请求,请求的目的是为了捕获cookie
- 注意:如果session对象在发请求的过程中,服务器端产生了cookie,则cookie会自动存储在session对象中。
- 3.使用携带cookie的session对象,对目的网址发起请求,就可以实现携带cookie的请求发送,从而获取想要的数据。
-
注意:session对象至少需要发起两次请求
- 第一次请求的目的是为了捕获存储cookie到session对象
- 后次的请求,就是携带cookie发起的请求了
-
-
-
#创建一个session对象
session = requests.Session()
'''
session对象可以像reqeusts一样进行请求发送
如果通过session进行请求发送,如果请求后会产生cookie的话,该cookie会被
自动保存到session对象中。
'''
#使用session对象发请求,获取cookie保存到该对象中
session.get(url='第一次访问url',headers=headers)
url = '具体url'
#使用了携带cookie的session发起请求
response= session.get(url=url,headers=headers)
模拟登录
import requests
# 指定配置项
headers = {
'User-Agent': ''
}
data = {
"userName": "",
"password": ""
}
# 登录url
url = 'http://download.java1234.com/user/login'
# 创建session对象
session = requests.session()
# 在session会话中获取cookie
session.post(url, headers=headers, data=data)
# 首页url
page_url = 'http://download.java1234.com/'
page_text = session.get(url=page_url, headers=headers)
page_text.encoding = 'utf-8'
html = page_text.text
with open('login.html', 'w', encoding='utf-8') as f:
f.write(html)
7603

被折叠的 条评论
为什么被折叠?



