爬虫简介和requests模块
爬虫介绍
爬虫的本质就是模拟发送http请求(requests模块),之后解析返回的数据(re,bs4,lxml,json等模块),最后将数据入库(redis,mysql,mongodb)。
app的爬虫,本质上是一模一样的。
python做爬虫的优势在于:包多,而且有爬虫的框架scrapy,是一个性能很高的爬虫框架,类似后台框架中的Django,该框架,大而全(爬虫相关的东西都集成了。)
百度和谷歌其实就是个大爬虫,在百度搜索,其实是去百度的服务器的库搜的,百度一直开着爬虫,一刻不停的在互联网上爬取,把页面存储到自己库中
requests模块
该模块可以模拟http请求,是基于urlib2封装出来的模块(urlib2:内置库,不太好用,繁琐)。
安装:
pip3 install requests
requests模块
1、requests模块的基本使用
import requests
# get,delete,post等等请求方式都是调用的requests模块中的request函数
ret = requests.post()
# ret = requests.request('post', ) 内部都是调用request函数
ret = requests.delete()
ret = requests.get('https://www.cnblogs.com')
print(ret.status_code) # 响应状态码
print(ret.text) # 响应体,转成字符串
print(ret.content) # 响应体,二进制的,用于获取视频等
2、get 请求携带参数,调用params参数,其本质上还是调用urlencode
# 方式一
ret = requests.get('https://www.baidu.com/s?wd=python&pn=1',
headers={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
})
print(ret.text)
# 方式二(建议使用方式二),因为中文会自动转码
ret = requests.get('https://www.baidu.com/',
params={
'wd': "美女",
'pn': 1
},
headers={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
})
print(ret.text)
3、携带headers,请求头是将自身伪装成浏览器的关键
ret = requests.get('http://0.0.0.0:8001/?name=%E7%BE%8E%E5%A5%B3',
headers={
# 标志,什么东西发出的请求,浏览器信息,django框架,从哪取?(meta)
'User-Agent': '',
# 上一个页面的地址,图片防盗链,大型网站通常回根据该参数判断请求的来源
'Referer': 'xxx',
# 存放cookie的地方
'Cookie': ''
})
print(ret)
"""
图片防盗链:如果图片的referer不是我自己的网站,就直接禁止掉
<img src="https://www.lgstatic.com/lg-community-fed/community/modules/common/img/avatar_default_7225407.png">
"""
4、带cookie
随机字符串(用户信息:也代表session),不管后台用的token认证,还是session认证,一旦登陆了,带着cookie发送请求,表示登陆了(可以下单,可以12306买票,可以评论)
# 第一种方式
ret = requests.get('http://0.0.0.0:8001/?name=%E7%BE%8E%E5%A5%B3',
headers={
'cookie': 'key3=value;key2=value',
})
# 第二种方式
ret = requests.get('http://0.0.0.0:8001/?name=%E7%BE%8E%E5%A5%B3',
cookies={"islogin":"xxx"})
print(ret)
5、发送post请求(注册,登陆),携带数据(body)
# data=None, json=None
# data: urlencoded编码
ret = requests.post('http://0.0.0.0:8001/',data={'name':"lqz",'age':18})
# json: json编码
import json
data = json.dumps({'name':"lqz",'age':18})
ret = requests.post('http://0.0.0.0:8001/',json=data)
print(ret)
# 注意:编码格式是请求头中带的,所有我可以手动修改,在headers中改
6、session对象
session = requests.session()
# 跟requests.get/post用起来完全一样,但是它处理了cookie
# 假设是一个登陆,并且成功登陆,就可以使用session.post()进行请求,但无需携带cookie
session.post()
# 再向该网站发请求,就是登陆状态,不需要手动携带cookie
session.get("地址")
7、响应对象
print(respone.text) # 响应体转成str
print(respone.content) # 响应体二进制(图片,视频)
print(respone.status_code) # 响应状态码
print(respone.headers) # 响应头
print(respone.cookies) # 服务端返回的cookie
print(respone.cookies.get_dict()) # 转成字典
print(respone.cookies.items())
print(respone.url) # 当次请求的地址
"""
print(respone.history) # 如果有重定向,放到一个列表中
ret=requests.post('http://0.0.0.0:8001/')
ret=requests.get('http://0.0.0.0:8001/admin')
#不要误解
ret=requests.get('http://0.0.0.0:8001/user')
print(ret.history) # 只能获取到ret=requests.get('http://0.0.0.0:8001/user')的重定向网址
# 上面的三个ret是不同的三个响应,ret.history只能获取到一个响应对象的重定向的历史网址
"""
print(respone.encoding) # 编码方式
# response.iter_content() # 视频,图片迭代取值,避免一次取完,撑爆内存
with open("a.mp4",'wb') as f:
for line in response.iter_content():
f.write(line)
8、乱码问题
ret.encoding='gbk'
ret = requests.get('http://0.0.0.0:8001/user')
# ret.apparent_encoding 获取当前页面采用的编码
ret.encoding = ret.apparent_encoding
9、解析json
# 返回数据,有可能是json格式,有可能是html格式
ret = requests.get('http://0.0.0.0:8001/')
print(type(ret.text))
print(ret.text)
a = ret.json()
print(a['name'])
print(type(a))
10、使用代理
# 正向代理
# django如何拿到客户端ip地址 META.get("REMOTE_ADDR")
# 使用代理有什么用? 可以让服务端以为来访问的是代理的网站
# 一些网站,会限制ip的访问次数,因此我们可以使用代理池,去访问该网站,突破限制
ret = requests.get('http://0.0.0.0:8001/', proxies={'http':'地址'})
print(type(ret.text))
print(ret.text)
11、异常处理
# 用try except捕获一下 就用它就行了:Exception
12、上传文件(爬虫用的比较少,一般用于后台写服务,将爬取下来的文件上传给其他服务端)
file={'myfile':open("1.txt",'rb')}
ret=requests.post('http://0.0.0.0:8001/',files=file)
print(ret.content)
利用requests模块爬取梨视频
############
# 2 爬取视频
#############
#categoryId=9 分类id
#start=0 从哪个位置开始,每次加载12个
# https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=9&start=0
import requests
import re
ret=requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=9&start=0')
# print(ret.text)
# 正则取解析
reg='<a href="(.*?)" class="vervideo-lilink actplay">'
video_urls=re.findall(reg,ret.text)
print(video_urls)
for url in video_urls:
ret_detail=requests.get('https://www.pearvideo.com/'+url)
reg='srcUrl="(.*?)",vdoUrl=srcUrl'
mp4_url=re.findall(reg,ret_detail.text)[0] #type:str
# 下载视频
video_content=requests.get(mp4_url)
video_name=mp4_url.rsplit('/',1)[-1]
with open(video_name,'wb') as f:
for line in video_content.iter_content():
f.write(line)
代码可以优化,使用多线程进行爬取
模拟登陆某网站
############
# 3 模拟登陆某网站
#############
import requests
ret = requests.post('http://www.aa7a.cn/user.php',
data={
'username': '616564099@qq.com',
'password': 'lqz123',
'captcha': 'f5jn',
'remember': '1',
'ref': 'http://www.aa7a.cn/',
'act': 'act_login',
})
cookie=ret.cookies.get_dict()
print(cookie)
# 如果不出意外,咱么就登陆上了,再向首页发请求,首页返回的数据中就有616564099@qq.com
ret1=requests.get('http://www.aa7a.cn/',cookies=cookie)
# ret1=requests.get('http://www.aa7a.cn/')
print('616564099@qq.com' in ret1.text)
# 秒杀小米手机,一堆小号
# 定时任务:一到时间,就可以发送post请求,秒杀手机
# 以后碰到特别难登陆的网站,代码登陆不进去怎么办?
# 之所以要登陆,就是为了拿到cookie,下次发请求(如果程序拿不到cookie,自动登陆不进去)
# 就手动登陆进去,然后用程序发请求
代理
## 代理
# 网上会有免费代理,不稳定
# 使用代理有什么用?
# drf:1分钟只能访问6次,限制ip
# 每次发请求都使用不同代理,random一下
# 代理池:列表,其实就是代理池的一种
import requests
ret=requests.get('https://www.cnblogs.com/',proxies={'http':'222.85.28.130:40505'})
#高匿:服务端,根本不知道我是谁
#普通:服务端是能够知道我的ip的
# http请求头中:X-Forwarded-For:代理的过程,可以获取到最初发起请求的客户端ip地址和代理服务的ip地址,但对于高匿,是无法获取到的最初请求的客户端ip地址。
ret=requests.get('http://101.133.225.166:8080',proxies={'http':'222.85.28.130:40505'})
ret=requests.get('http://101.133.225.166:8080',proxies={'http':'114.99.54.65:8118'})
print(ret.text)
X-Forwarded-For: <client>, <proxy1>, <proxy2>
<client>
客户端的IP地址。
<proxy1>, <proxy2>
如果一个请求经过了多个代理服务器,那么每一个代理服务器的IP地址都会被依次记录在内。也就是说,最右端的IP地址表示最近通过的代理服务器,而最左端的IP地址表示最初发起请求的客户端的IP地址。
正向代理和反向代理
正向代理即是客户端代理,代理客户端,服务端不知道实际发起请求的客户端。
反向代理即是服务端代理,代理服务端,客户端不知道实际提供服务的服务端。
正向代理中,proxy和client同属一个LAN,对server透明;
反向代理中,proxy和server同属一个LAN,对client透明。
实际上proxy在两种代理中做的事都是代为收发请求和响应,不过从结构上来看正好左右互换了下,所以把后出现的那种代理方式叫成了反向代理
静态,动态和伪静态
静态是指http://127.0.0.1/user.html
这种url,页面中的内容是固定死的,数据也是死的,加载速度快,容易被搜索引擎爬取收录,可以优化seo。
动态是指http://127.0.0.1/?name='张三'&age=12
这种url,页面的数据是从数据库中获取的,加载速度较慢,不容易被搜索引擎爬取收录,seo没有优势。
伪静态是指http://127.0.0.1/user.html
通过一些路径规则(正则表达式)将动态url伪装为静态url,加载速度较慢,seo有优势。
总结:
静态url: 不方便管理,修改麻烦, seo优化相当好.
动态url : 方便管理,修改简单, seo没优势.
伪静态: 结合两者的优势. 方便管理, seo有优势.
爬虫简介和requests模块的更多相关文章
- 爬虫简介与requests模块
爬虫简介与requests模块 一 爬虫简介 概述 网络爬虫是一种按照一定规则,通过网页的链接地址来寻找网页的,从网站某一个页面(通常是首页)开始,读取网页的内容,找到网页中的其他链接地址,然后通过这 ...
- 爬虫简介、requests 基础用法、urlretrieve()
1. 爬虫简介 2. requests 基础用法 3. urlretrieve() 1. 爬虫简介 爬虫的定义 网络爬虫(又被称为网页蜘蛛.网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程 ...
- 爬虫简介与request模块
一 爬虫简介 概述 近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的利益,而网络爬虫是其中最为常用的一种从网 ...
- 爬虫基础之requests模块
1. 爬虫简介 1.1 概述 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 1.2 爬虫的价值 在互 ...
- 1、爬虫简介与request模块
一 爬虫简介 概述 近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的利益,而网络爬虫是其中最为常用的一种从网 ...
- 爬虫开发5.requests模块的cookie和代理操作
代理和cookie操作 一.基于requests模块的cookie操作 引言:有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests ...
- 爬虫开发3.requests模块
requests模块 - 基于如下5点展开requests模块的学习 什么是requests模块 requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求.功能 ...
- python网络爬虫之二requests模块
requests http请求库 requests是基于python内置的urllib3来编写的,它比urllib更加方便,特别是在添加headers, post请求,以及cookies的设置上,处理 ...
- 爬虫中之Requests 模块的进阶
requests进阶内容 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个 ...
随机推荐
- Python——五分钟带你弄懂迭代器与生成器,夯实代码能力
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是周一Python专题,给大家带来的是Python当中生成器和迭代器的使用. 我当初第一次学到迭代器和生成器的时候,并没有太在意,只是觉 ...
- 回想笔记 瞎比比 域名注册 解析绑定ip 下载证书 设置证书 重定向http到https请求
2019.7.27 回想笔记 拥有腾讯云服务器一台 阿里云注册5元域名,进行备案 完成之后 使用解析 绑定服务器ip地址 ,使用域名可以访问到web服务器而不是通过直接暴露ip地址进行访问 证书购买 ...
- chrome安装扩展插件出现-crx_header_invalid问题
1. 将*.crx文件重命名为*.rar 2.将rar文件解压 3. 在chrome浏览器添加扩展程序时选择“加载已解压的扩展程序” 4.添加成功
- Web Scraper 高级用法——利用正则表达式筛选文本信息 | 简易数据分析 17
这是简易数据分析系列的第 17 篇文章. 学习了这么多课,我想大家已经发现了,web scraper 主要是用来爬取文本信息的. 在爬取的过程中,我们经常会遇到一个问题:网页上的数据比较脏,我们只需要 ...
- Spring MVC系列-(2) Bean的装配
2. Bean的装配 Spring容器负责创建应用程序中的bean,并通过DI来协调对象之间的关系.Spring提供了三种主要的装配机制: XML显式配置: Java配置类进行显式配置: 隐式的bea ...
- tempdb 日志文件增长的问题
前两天在一个客户那里发现tempdb log 文件增长很大,已经使用40GB了,而tempdb log 文件总的分配空间是70GB,并且日志空间貌似不能重用,他们使用sql 2012 打的sp4补丁, ...
- EOS基础全家桶(一)开篇
简介 从今天开始我会在FishoPark上与大家分享EOS的一些技术经验和基础,如果大家在看文章的过程中有任何问题,欢迎在网站下方的评论里留言,我会尽力为大家解答,如果发现我内容中所写有错,欢迎指正, ...
- Swift中的感叹号( ! )与问号( ? )之谜
基本了解 在Swift代码会经常看到定义属性或方法参数时类型后面会紧跟一个感叹号( ! )或问号( ? ), 刚开始接触Swift的童鞋就可能不太明白之代表什么意思,一头雾水,开始凌乱了. 本文将带你 ...
- SQL的分类使用(增删改查)
1.SQL的分类使用(*代表重点的程度) DDL ** (Data Definition Language)数据库定义语言 用来定义数据库对象: 库 表 列 等 DCL (D ...
- 您知道SASS吗?
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://blog.bitsrc.io/4-reasons-to-use-sass-in-y ...