Python开发简单爬虫速成教程
b站学习视频网址
https://www.bilibili.com/video/BV1164y1m7Xb?p=1
一、简介
按照一定的规则,自动抓取网络信息的程序或者脚本,搜索引擎的重要组成。
-
搜索引擎
-
数据分析
-
人工智能
-
薅羊毛、抢车票
爬虫产品:
神箭手、八爪鱼、造数、后羿采集器
数据储备:
- python编程基础
- http
- 数据库
怎么学:
-
python语法知识
-
python爬虫常用到的几个重要内置库Requests,用于请求网页
-
学习正则表达式re、Xpath(IxmI)等网页解析工具
-
开始一些简单的网站爬取,了解爬取数据的过程(当当网图书数据)
-
与数据库结合,将爬取数据进行存储
安装MongoDB数据库
- 介于关系型数据库和非关系型数据库之间的产品
- 本质是非关系型数据库,最像关系数据库
- 支持的数据结构非常松散,类似json的bson格式
- 可以存储比较复杂的数据
非关系模型:
- 列模型,一列为一个记录,分布式数据库,HBase
- 键值对,redis
- 文档类,类似键值对,Mongodb
效率非常高,存储在内存中,断电即失,现在也可存储到磁盘中
检查安装是否成功:
修改设置:
/bin/mongod.cfg
右击我的电脑,管理,服务和应用程序,服务,找到MongoDB,点击重新启动。同一个局域网的机器可以连接。
安装Navicat:支持多种数据库的连接
安装教程:Navicat安装教程
使用教程:在 Navicat for MongoDB 使用文档
使用Navicat,进行MongoDB数据库的连接:
注意主机和端口号的设置
二、request模块入门
requests库:
-
Requests是一个简单优雅的python HTTP库
通过Requests库发送http请求:
Requests模块的安装:
cmd直接安装:pip install requests
Requests模块支持的http方法:
-
Get方法:请求资源
-
Post方法:向服务端发送信息和数据,表单提交
-
Head方法:请求资源的一些信息而不是全部信息,用于确认URL的有效性以及资源更新的日期时间
-
Put方法:上传文档
-
Connection方法:客户端想要确定一个明确的连接到远程主机,便于通过Http代理服务器进行SSL加密通信时连接使用,在抓包时使用
【重点】通过requests模块发送get请求
import requests
r=requests.get('http://httpbin.org/ip') #会返回当前主机的一个外网地址
# r1=requests.get('https://www.imooc.com')
print(r.text) # 输出请求体
cmd查看内网ip:ipconfig
百度查看ip地址:ip地址
【重点】通过requests模块发送post请求
一般出现在html的form表单里面
import requests
r2=requests.post(url='http://httpbin.org/post',data={
'name':'imooc'})
print(r2.text)
通过requests模块的get请求构造url
主要用在get请求里面
data={
"key1":"value1","key2":"value2"}
response=requests.get("http://httpbin.org/get",params=data)
# 查看当前请求的url
print(response.url)
查看响应的返回头和返回体
# 查看响应的返回头
print(response.headers)
# 查看响应的返回体
print(response.text)
返回头:
【重点】请求图片
url='https://www.imooc.com/static/img/index/logo2020.png'
r1=requests.get(url)
# 访问图片返回的是二进制数据,需要用content查看输出
print(r1.content)
#写入图片数据
with open("imooc.png","wb") as f:
f.write(r1.content)
图片二进制数据:
写入图片:
查看响应的json数据
r1=requests.get(url="http://httpbin.org/ip")
print(r1.json()) # 整个json对象 {'origin': '124.160.215.146'}
print(r1.json()["origin"]) # json中某一项 124.160.215.146
查看响应状态码
print(r1.status_code)
查看request的请求头
print(r1.request.headers)
请求头可以修改,可以通过构造request请求头
headers={
"user-agent":"joseph/v1"
}
r1=requests.get(url="http://httpbin.org/ip",headers=headers)
print(r1.request.headers)
在反爬机制中可以使用,可以模拟win,ipad,手机
三、requests模块进阶
设置连接超时
当请求超时,放弃请求
# 0.0001秒之内返回网页数据
# 超时时间一般设置为2到3秒
start_time=time.time()
r1=requests.get(url="https://www.imooc.com",timeout=2)
end_time=time.time()
print(r1.text)
print(end_time-start_time)
查看响应设置的cookies
可以在headers中查看
也可以通过cookies查看
行为和字典非常的像
r1=requests.get(url="https://www.baidu.com")
print(r1.headers)
print(r1.cookies)
print(r1.cookies["BDORZ"])
在请求中携带cookies
cookies={
"username":"joseph"
}
r1=requests.get(url="http://httpbin.org/cookies",cookies=cookies)
print(r1.cookies) # 输出响应设置的cookies
print(r1.text) # 请求url在响应中返回请求的cookies
证书校验,SSLError问题
request可以为HTTPS请求验证SSL证书,就像web浏览器一样
SSL验证默认是开启的,如果证书验证失败,requests会抛出SSLError
# 关闭SSL校验
r1=requests.get(url="https://www.baina.org",verify=False)
# 方法二:指定网站的SSL证书,但是一般没有
print(r1.text)
异常
-
网络问题:如DNS查询失败,拒绝连接,会抛出ConnectionError异常
-
Http请求返回了不成功的状态码:HTTPError异常
-
请求超时:Timeout异常
-
请求次数超过了设定的最大重定向次数,TooManyRedirects异常
-
所有request显式抛出的异常都继承自requests.exceptions.RequestException
【重点】保持登录凭据,requests.session(),爬取需登录的网站+定制请求头
http://account.chinaunix.net/login进行登录验证
1.通过get请求访问登录页面,这个时候还没有填写username和password
2.post请求访问登录
第二个使用的token信息就是第一个请求setCookies设置的
时间戳,删除后3位
3.index页面
cookies携带了很多数据,
可以通过定制请求头和设置请求的cookies 进入index页面,可行但太麻烦。
保持登录凭据,从而直接绕过登录,直接进入到index页面:
-
get请求拿token信息
-
post请求提交用户名密码
-
第三个请求直接访问登录后index页面
定制请求头header
请求头替换添加引号:
采用正则表达式
代码实现,利用requests.session()保存登录凭据
# request.session,创建一个保持登录凭据的session实例
login_session=requests.session()
# 1、get请求,获取token信息
token_url="http://account.chinaunix.net/login?"
headers={
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Encoding":"gzip, deflate",
"Accept-Language":"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Cache-Control":"no-cache",
"Host":"account.chinaunix.net",
"Pragma":"no-cache",
"Proxy-Connection":"keep-alive",
"Upgrade-Insecure-Requests":"1",
"User-Agent":