Python爬虫---爬虫介绍,实战案例
目录标题
- 1、爬虫介绍
- 1.1 爬虫的合法性
- 1.2 网络爬虫的尺寸
- 1.3 robots.txt协议
- 1.4 http&https协议
- 1.5 requests模块
- 1.5.1 request库的异常
- 2、实战案例
- 2.1 百度页面
- 2.2 爬取京东商品页面
- 2.3 爬取亚马逊商品页面-更改headers
- 2.4 百度/360搜索关键词提交-params
- 2.5 网络图片的爬取和存储
- 2.6 IP地址归属地的自动查询
- 2.7 爬取搜狗首页
- 2.8 搜索词条
- 2.9 破解百度翻译
- 2.10 豆瓣电影排行
- 2.11 爬取肯德基餐厅查询指定地点的餐厅
- 2.12 爬取国家药品监督管理局
1、爬虫介绍
什么是爬虫?
– 通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程
浏览器抓取的是一个整页面,而我们很多时候爬虫是先抓取符合特定要求的信息
1.1 爬虫的合法性
在法律中是不被禁止的,但具有违法风险
不合法:爬虫+黑客技术,攻击别人的网站
善意爬虫 -搜索引擎里的抓取系统其实就是各自编写的一个爬虫程序
恶意爬虫 - 抢票软件对12306的多次操作
爬虫类似骚扰电话,网络爬虫会对web开发带来问题
爬虫带来的风险可以体现在如下2个方面:
- 骚扰问题:爬虫行为干扰了被访问网站的注册运营
- 法律问题:爬虫抓取的数据用于牟利将带来法律风险
如何避免进局子?
- 时常优化自己的程序,避免干扰被访问网站的正常运行
- 在使用、传播爬取到的数据时,审查抓取到的内容,涉及用户隐私或者商业机密等敏感内容,及时停止爬取或传播
因为这些问题,网站人员会限制爬虫:
- 来源审查:判断User-Agent进行限制,如果User-Agent字段不是已知的浏览器,则很可能是爬虫
- 发布公告:Robots协议,告知可爬取的内容
1.2 网络爬虫的尺寸
大规模的全网爬虫,类似百度,谷歌这种浏览器,速度是关键
爬虫在使用场景中的分类:
1.通用爬虫:(搜索引擎中的抓取系统重要部分)抓取的是一整张页面的数据
2.聚焦爬虫:是建立在通用爬虫的基础上。抓取的是页面中特定的局部内容。(先通用爬虫找到一页面,再聚焦爬虫找到页面中局部内容)
3.增量爬虫:监测网站中数据更新的情况。只会抓取网站中最新更新出来的数据。
爬虫中的矛与盾?
例子:电商中店家,一方面希望产品被爬取,这样会增加产品的流量。另一方面,不希望被同行爬取,或得产品价格、产品描述等详细信息
反爬机制
门户网站,通过制定相应策略或技术手段,防止爬虫程序进行网站数据的爬取。
反反爬策略
爬虫程序通过制定相关策略或技术手段,破解门户网站中的反爬机制,从而获得门户网站中的相关数据
1.3 robots.txt协议
robots-机器人
use-agent
disallow
- —表示所有
君子协议。规定了哪些数据可以被爬取哪些数据不可以被爬取。
如何查看:网站地址/robots.txt
例如:https://www.taobao.com/robots.txt
如果网站没用robosts协议,默认允许所有爬虫
1.4 http&https协议
http协议-超文本传输协议
概念:服务器与客户端进行数据交互的一种形式。http是一种基于“请求与响应”模式的、无状态的应用层协议。
无状态是指:第一次请求与第二次请求之间没有关联
应用层协议:该工作在TCP协议之上
HTTP协议采样URL作为定位网络资源的标识
理解URL:通过HTTP协议存取资源的Internet路径,一个url对应一个数据资源
patch与put的对比:
常用请求头信息:
User-Agent : 请求载体的身份标识(浏览器的标识,例谷歌。)
Connection : 请求完毕后,是断开连接还是保持连接
常用响应头信息:
Content-Type :服务器响应回客户端的数据类型(可以是字符串类型,jesen类型等)
https协议:
https协议与http协议几乎类似,唯一的区别是s (secure安全)
安全的http协议,安全的超文本传输协议,安全涉及到数据加密,交互、传输过程中的数据是加密过的。
加密方式:
- 对称密钥加密:客户端把密钥+密文发给服务器,缺点容易被截取
- 非对称密钥加密:服务器发公钥给客户端,客户端据此加载密文后传回,缺点公钥可能会被拦截且篡改
- 证书密钥加密(https采取的证书密钥加密):引入一个证书认证机构
1.5 requests模块
网络请求模块:urllib模块与 requests模块
requests模块:python中原生的一款基于网络请求的模块,功能强大,简单便捷,效率极高。
作用:模拟浏览器发请求。
如何使用?(requests模块的编码流程)
遵从浏览器发请求的流程
- 指定url (要访问的网页)
- 发起请求
- 获取响应数据
- 持久化存储响应数据
环境安装:pip install requests
测试:import requests
实战:
需求1:爬取搜狗指定词条对应的搜索结果页面(简易网页采集器)
UA检测、UA伪装需求2:破解百度翻译
post请求(携带了参数)
响应数据是一组json数据需求3:爬取豆瓣电影分类排行榜中电影详情数据
request.get(url,params=None,**kwargs)
url :拟获取页面的url链接
params: 参数,字典或者字节流格式
**kwargs: 12个控制访问的参数
r.status.code —状态码。如果是200说明请求成功,否则请求失败
type® —是一个类
r.headers ----get请求获得页面的头部信息
r.text----http响应内容的字符串形式,即url对应的页面内容
r.encoding ----编码方式
r.apparent_encoding — 备选编码方式
r.content—HTTP响应内容的二进制形式
使用requests.get请求时的流程:
1.5.1 request库的异常
r.raise_for_status() —用来查看是否异常,如果不是200,产生requests.HTTPError异常
通用代码框架:
import requests
def getHTMLText(url):try:r = requests.get(url,timeout=30)r.raise_for_status() #如果不是200,产生requests.HTTPError异常r.encoding = r.apparent_encoding #让编码为utf-8return r.textexcept:return "产生异常"if __name__ =='__main__':url = "https://www.baidu.com"print(getHTMLText(url)) #正常输出内容
Requests库的7个主要方法
最常使用的方法:requests.get()
2、实战案例
2.1 百度页面
import requests
r = requests.get("https://www.baidu.com")
r.status_code #输出200---正常
r.text #输出乱码
r.encoding #不是utf-8
r.encoding = 'utf-8'
r.text #这是输出内容出现中文,我们可读
如果header中不存在charset,则认为编码为ISO-8859-1,但这个没法解析中文
2.2 爬取京东商品页面
import requests
url = "https://item.jd.com/236897.html" #某一个具体商品的链接
try:r = requests.get(url) r.status_for_status() #输出200,访问正常r.encoding = r.apparent_encodingprint(r.text[:100])
except:print("爬取失败")
2.3 爬取亚马逊商品页面-更改headers
import requests
r = requests.get("https://www.amazon.cn/gp/product/Bo1M8L5z3Y")
r.status_code #输出503---不正常
r.text #输出乱码
r.encoding #不是utf-8
r.encoding = 'utf-8'
r.text #输出内容还是有问题
r.request.headers #头信息诚实的告诉了网站是python爬虫kv = {'user-agent','Mozilla/5.0'} #字段写成了Mozilla/5.0一个浏览器
url = "https://www.amazon.cn/gp/product/Bo1M8L5z3Y"
r = requests.get(url,headers = kv)
r.status_code #输出200
r.text[:1000]
2.4 百度/360搜索关键词提交-params
import requests
kv = {'wd':'Python'}
r = requests.get("http://www.baidu.com/s",params = kv)
r.status_code #200
r.request.url #输出完整的url:http://www.baidu.com/s?wd=Python
len(r.text) #太大了,先不打印
2.5 网络图片的爬取和存储
如果一个url链接是以.jpg结尾,则表示的是一个图片文件
import request
path = "D:/abc.jpg" #保存的目标路径
url = "http://........jpg" #图片的url
r = requests.get(url)
r.status_code #200
with open(path,'wb') as f: #打开路径并写入f.write(r.content)
用图片原本的名字命名:
图片、视频、动画等都是类似这种
2.6 IP地址归属地的自动查询
IP138网站提供了IP地址查询归属地的功能,所以借助IP138网站
import requests
url = "http://m.ip138.com/ip.asp?ip="
r = requests.get(url+'202.204.80.112')
r.status_code #200
r.text[-500:] #内容可能会很大,所以一般取前1000,或者后500
网站平台提供的一些点查询的功能,可能都是通过链接来实现的
2.7 爬取搜狗首页
需求:爬取搜狗首页的页面数据
#!/usr/bin/env python
# -*- coding:utf -8 -*-
#- 需求:爬取搜狗首页的页面数据
import requests
if __name__ == "__main__":#step 1:指定urlurl = "https://www.sogou.com/"#step 2:发起请求#get方法会返回一个响应对象response = requests.get(url=url)#step 3:获取响应数据,.text返回的是字符串形式的响应数据page_text = response.text #即将该页面的编码以字符串形式返回给了page_textprint(page_text) #打印出来观察一下,打印出的是源码数据#step 4:持久化存储响应数据#搜狗首页的源码数据存储在当前地址的sogou.html文件中with open('./sogou.html','w',encoding= 'utf-8') as fp:fp.write(page_text)print('爬取数据结束!!!')
结束后点击文件夹中的sogou.html项目,加载出来的网页即爬出来的页面
2.8 搜索词条
需求1:爬取搜狗指定词条对应的搜索结果页面(简易网页采集器)
#!/usr/bin/env python
# -*- coding:utf-8 -*-#UA:User-Agent(请求载体的身份标识)
#UA伪装 :门户网站的服务器会检测对应请求的载体身份标识,
# 如果检测到请求的载体身份标识为某一款浏览器,说明该请求是一个正常请求。但是。。
#但是如果检测到请求的载体身份标识不是基于某一款浏览器的,则表示该请求为不正常的请求(即是爬虫)则服务器很有可能会拒绝此请求
#所以,每次爬虫中要进行UA伪装,这一反爬
#UA伪装:让爬虫对应的请求载体身份标识伪装成某一款浏览器
import requests
if __name__ == "__main__":#UA伪装:将对应的USer-Agent 封装到一个字典中#headers封装的是一个基于谷歌浏览器的headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}url = 'https://www.sogou.com/web?'#处理url携带的参数:封装到字典中kw = input('enter a word:')param = {'query':kw}#对指定的url发起的请求对应的url是携带参数的,并且请求过程中处理了参数response=requests.get(url = url,params=param,headers = headers) #动态拼接params参数page_text = response.textfileName = kw+'.html'with open(fileName,'w',encoding='utf-8') as fp:fp.write(page_text)print(fileName,'保存成功!!!')
输入自己想要查询的关键词,爬取出浏览器搜索出的结果页面
2.9 破解百度翻译
数据解析:一张页面中的局部解析
局部页面刷新:
post请求(携带了参数)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import json
if __name__ == '__main__':#1,指定urlpost_url = 'https://fanyi.baidu.com/sug'#2,请求前进行UA伪装headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}#3,post请求参数处理(同get请求一致)word = input('enter a word:')data = {'kw':'word'}#4,请求发送response = requests.post(url = post_url,data = data,headers = headers)#5,获取相应数据# 本例中拿到json数据,json()方法返回的是obj。只有确认拿到的响应数据是json类型时,才可以用json()(看Content-Type: application/json)dic_obj = response.json()#持久化存储fileName = word + '.json'fp = open(fileName,'w',encoding='utf-8')json.dump(dic_obj,fp=fp,ensure_ascii=False)#ensure_ascii拿到的是中午,不能用asciiprint('over!!')
2.10 豆瓣电影排行
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import json
#滑动页面,会刷新页面---json数据
#Content-Type: application/json; ---确定是json数据
if __name__=='__main__':url = 'https://movie.douban.com/j/chart/top_list'#url 复制过来,但是字典形式要重新封装param = {'type': 24,'interval_id': '100:90','action':'','start': 0, #从库中第几部电影开始取,从0开始'limit': 20, #一次取出的个数}headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}response = requests.get(url=url,params = param,headers=headers)list_data = response.json()fp = open('./douban.json','w',encoding='utf-8')json.dump(list_data,fp=fp,ensure_ascii=False)print('over!!')
2.11 爬取肯德基餐厅查询指定地点的餐厅
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import json
#滑动页面,会刷新页面---json数据
#Content-Type: application/json; ---确定是json数据
if __name__=='__main__':url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'kw = input('enter a word:')param = {'cname':'','pid':'','keyword': kw,'pageIndex': 1,'pageSize': 10,}headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}response = requests.get(url=url,params = param,headers=headers)page_text = response.textfileName = kw+'.html' #存入文件的文件名with open(fileName,'w',encoding='utf-8') as fp:fp.write(page_text)print(fileName,'保存成功!!!')
有点不理解,为啥这里url的问号后面部分不删掉?
2.12 爬取国家药品监督管理局
网站设置了新的反爬机制,无法实际爬到,但思路仍然值得学习
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
if __name__ = "__main__":url = ''headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}response = requests.get(url=url,params = param,headers=headers)page_text = response.textwith open('./huazhuangpin.html','w',encoding='utf-8') as fp:fp.write(page_text)
代码测试or抓包工具,得到不是由于地址栏中的url得到的。可能是由于ajax请求得到的
XHR中的ajax请求包
通过对详情页的url分析得到:
- url的域名都是一样的,只有携带的参数id不一样
- id值可以从首页对应的ajax请求到的json中获取
- 域名和id值拼接出一个完整的详情页的url
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
if __name__ ="__main__":url = '首页的url'data = {参数键值形式}headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}id_list=[]#存储企业的idall_Data_list = []#存储所有的企业详情数据json_jds = requests.post(url=url,params = param,headers=headers).json()#json_jds字典形式,从其中获取idfor dic in json_ids['list']:id_list.append(dic['ID'])#获取企业的详情post_url = '详情页的url'for id in id_list:data = {'id':id}detail_json = requests.post(url=url,params = param,headers=headers).json()#print(detail_json,'-----ending-----')all_data_list.append(detail_json)#持久化存储all_data_listfp = open('./allData.json','w',encoding='utf-8')json.dump(all_data_list,fp=fp,ensure_ascii=False)print('over!!')
Python爬虫---爬虫介绍,实战案例相关推荐
- python爬取电影网站存储于数据库_Python零基础爬虫教程(实战案例爬取电影网站资源链接)...
前言 好像没法添加链接,文中的链接只能复制到浏览器查看了 这篇是我写在csdn的,那里代码格式支持更好,文章链接 https://blog.csdn.net/d497465762/article/de ...
- python爬网站的题库_Python零基础爬虫教程(实战案例爬取电影网站资源链接)
前言 好像没法添加链接,文中的链接只能复制到浏览器查看了 这篇是我写在csdn的,那里代码格式支持更好,文章链接 https://blog.csdn.net/d497465762/article/de ...
- 盘点一个Python自动化办公的实战案例
点击上方"Python共享之家",进行关注 回复"资源"即可获赠Python学习资料 今 日 鸡 汤 岭猿同旦暮,江柳共风烟. 大家好,我是皮皮. 一.前言 前 ...
- 27 个Python数据科学库实战案例 (附代码)
为了大家能够对人工智能常用的 Python 库有一个初步的了解,以选择能够满足自己需求的库进行学习,对目前较为常见的人工智能库进行简要全面的介绍. 1.Numpy NumPy(Numerical Py ...
- python鲜花_【实战案例】90 行Python代码实现一棵鲜花盛开树
今天请各位读者朋友欣赏用 Python 实现的鲜花盛宴,你准备好了吗?90 行代码即可实现一棵美丽的鲜花盛开树.对于知识的运用也是如此,需要不断吸收新知识,学习新技能,才能盛开出美丽的花朵.接下来就看 ...
- 敢看系列?Python字体反爬实战案例之实习那僧,继续挖坑
文章目录 ⛳️ 实习 实战场景 僧 ⛳️ 实习 实战编码 僧 ⛳️ 实习 实战场景 僧 本篇博客继续学习字体反爬,涉及的站点是实习 x,目标站点地址直接百度搜索即可. 可以看到右侧源码中出现了很多&q ...
- 数据挖掘r语言和python知乎_Hellobi Live |R语言爬虫实战案例分享:网易云课堂、知乎live、今日头条、B站视频...
课程名称 R语言爬虫实战案例分享:网易云课堂.知乎live.今日头条.B站视频 网络数据抓取是数据科学中获取数据中的重要途径,但是一直以来受制于高门槛,都是专业程序员的专属技能.直到R语言和Pytho ...
- python爬取喜马拉雅_Python爬虫实战案例之爬取喜马拉雅音频数据详解
这篇文章我们来讲一下在网站建设中,Python爬虫实战案例之爬取喜马拉雅音频数据详解.本文对大家进行网站开发设计工作或者学习都有一定帮助,下面让我们进入正文. 前言 喜马拉雅是专业的音频分享平台,汇集 ...
- Python开发实战案例之网络爬虫(附源码)-张子良-专题视频课程
Python开发实战案例之网络爬虫(附源码)-35人已学习 课程介绍 课程特色: 特色1:案例驱动-围绕两大完整的Python网络爬虫实战开发案例:IT电子书下载网络爬虫和股票交易数据 ...
最新文章
- 26. Intellij IDEA 启动项目ClassNotFoundException
- JS与JQ的对比与提高
- 推荐的 PHP 读物列表
- 百度网盘javascript加速视频播放速度
- SpringBoot中整合Mail实现发送带附件的邮件
- msdn windows server 按电源事件api_【tornado源码分析】I/O事件循环机制与多进程
- CRM产品主数据在行业解决方案industry solution中的应用
- Oracle 大规模 delete,update 操作 注意事项
- 漫步VR——Unity语音聊天室开发小结
- idea 启动选择profiles_玩转SpringBoot 2 之项目启动篇
- linux与s7-300,Siemens SIMATIC S7-300硬编码凭证安全限制绕过漏洞
- 基础数据结构-线性表-顺序表的连续操作
- 关于游戏开发流程解析
- CMPP3.0状态报告状态码
- 几种常用的电机控制法
- PPT中插入矢量图(以及从visio直接复制变模糊的处理方法)
- Flowable 流程实例
- C语言中.和-的区别
- 嵌入式实操----基于RT1170 移植mbw做SDRAM带宽测试(三十一)
- OSDev——Bare Bones