python 网络爬虫全流程教学,从入门到实战(requests+bs4+存储文件)

requests是一个Python第三方库,用于向URL地址发起请求

bs4 全名 BeautifulSoup4,是编写 python 爬虫常用库之一,主要用来解析 html 标签。

一、爬虫编写过程解析

1.1 导入库文件(请求库、解析库)

#导入 requests请求库
import requests #导入bs4解析库
from bs4 import BeautifulSoup

1.2 发起对指定网页的请求

#对爬取网页的链接
url='请求地址' #请求头(作用:为了不被对方发现是爬虫的访问)
#去需要爬取网页上>打开开发者模式(F12)>网络(network)>随便点开一个文件>标头>请求头里的User-Agent
headers={'User-Agent': '请求头'} #发起get请求,获取请求内容,并用(utf-8)解码(编码一般是:utf-8,gbk,gb2312)
html=requests.get(headers=headers,url=url).content.decode('utf-8')

1.3 解析为 bs4格式

#解析为bs4,BeautifulSoup(html文本,'解析器'),如下表
soup=BeautifulSoup(html,'html.parser')

如果一段HTML或XML文档格式不正确的话,那么在不同的解析器中返回的结果可能是不一样的。

解析器 使用方法 优势
Python标准库 BeautifulSoup(html, "html.parser") 1、Python的内置标准库 2、执行速度适中 3、文档容错能力强
lxml HTML BeautifulSoup(html, "lxml") 1、速度快 2、文档容错能力强
lxml XML BeautifulSoup(html, ["lxml", "xml"]) BeautifulSoup(html, "xml") 1、速度快 2、唯一支持XML的解析器
html5lib BeautifulSoup(html, "html5lib") 1、最好的容错性 2、以浏览器的方式解析文档 3、生成HTML5格式的文档

1.4 解析获取的内容(获取想要的数据)

#获取想要的网页标签(如div)
Tdiv=soup.find_all('div',class_="div的class样式名") #输出查找到的结构
print(Tdiv)

1.5 存储爬取的数据

#格式
with open('./文件路径/文件名.文件类型','权限') as f:
f.write('字符型文本')

二、bs4核心函数

作用:获取,网页中的各个自己想要的标签,一般是从大标签到小标签的过程

操作案例百度

#导入库
from bs4 import BeautifulSoup
import requests #百度的url地址
url="https://www.baidu.com/"
#请求头(作用:为了不被对方发现是爬虫的访问)
hearders={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.53'}
#获取百度的请求
html=requests.get(url=url, headers=hearders).content.decode("utf-8")
#解析为bs4
soup = BeautifulSoup(html,"html.parser")

2.1 find()

查找符合条件的第一个标签,结果是标签对象

find( name , attrs/class_ , recursive , string , **kwargs )

soup.find('标签名',属性名=“属性”/class_="类名",recursive=“是否只要子节点(默认False)”,string="标签内容")

参数可以任意组合或只填写一个

①根据标签名定位第一个指定的标签

#查询出第一个p标签对象,并输出
print(soup.find('p')) #查询出第一个a标签对象,并输出
print(soup.find('a'))

②根据属性名定位满足条件的第一个标签

#查询class属性为’s-top-wrap s-isindex-wrap‘的任意标签
print(soup.find_all(class_='s-top-wrap s-isindex-wrap')) #查询id属性为s_top_wrap的所有标签,其他属性名照写
print(soup.find_all(id='s_top_wrap'))

③根据标签和标签属性定位

#查询class为’s-top-wrap s-isindex-wrap‘的一个div标签
print(soup.find('div',class_='s-top-wrap s-isindex-wrap')) #查询id为s_top_wrap的第一个div标签
print(soup.find('div',id='s_top_wrap'))

④根据指定的标签名和对应的标签内容定位

#查询到内容为“设置“的第一个span标签
print(soup.find('span',string="设置"))

2.2 find_all()

find()函数用法一样,不同之处在于find()只返回满足条件的第一个标签对象,而find_all()返回所有满足条件的标签对象,是一个列表。有时需要两个配合使用。

①根据标签名定位所有指定的标签

#查询所有是img的标签,返回的是一个列表
print(soup.find_all('img'))

②根据属性名定位所有满足条件的标签

#查询所有class属性为’s-top-wrap s-isindex-wrap‘的任意标签
print(soup.find_all(class_='s-top-wrap s-isindex-wrap')) #查询id属性为s_top_wrap的所有标签,其他属性名照写
print(soup.find_all(id='s_top_wrap'))

③根据指定的标签和对应的属性名定位所有满足条件的标签

#查询所有class属性为's-top-wrap s-isindex-wrap'的div标签
print(soup.find_all('div',class_='s-top-wrap s-isindex-wrap')) #查询所有id属性为's_top_wrap'的div的标签
print(soup.find_all('div',id='s_top_wrap'))

④根据指定的标签名和对应的标签内容定位

#查询内容为“设置“的所有span标签
print(soup.find_all('span',string="设置"))

2.3 select()

select()函数也是定位所有满足条件的标签,返回值也是一个列表

①根据标签名定位

#查询所有是img的标签,返回的是一个列表
print(soup.select("img"))

②根据标签名和属性定位

#查询class属性为’s-top-wrap‘的所有标签
print(soup.select('.s-top-wrap')) #查询id属性为‘s_top_wrap'的所有标签
print(soup.select('#s_top_wrap')) #通过标签名和属性一起配合查询,其他属性直接写对应的属性如:a[hrsr='https']
print(soup.select('div[id="s_top_wrap"]'))

③定位对应的子标签

#查所有a标签下的img标签
print(soup.select('a>img'))

三、bs4基本操作

作用:获取标签中自己想要的内容,如:文字、图片链接、视频链接、音频链接等

注意:soup只是一个变量,就是你查询出来后新的获取范围

3.1 获取标签内的文本

#分别获取a标签和p标签内的文本内容(推荐第一种方式)
print(soup.a.text)
pring(soup.p.string)

3.2 获取标签属性

#获取第一个div标签的所有属性
print(soup.div.attrs)

3.3 获取指定标签的属性值

#获取div标签中的class属性的值
print(soup.div.attrs.get('class')) #获取div标签中的id属性的值
print(soup.div.get('id')) #获取img标签中的src属性的值
print(soup.img.get('src'))

3.4 遍历获取的标签的属性值

#获取到所有的img标签,返回值为列表
imgs=soup.find_all('img')
for i in imgs:
#img标签中src的值
print(i['src'])
#获取到所有的img标签,返回值为列表
imgs=soup.find_all('img')
for i in imgs:
#img标签中src的值
print(i.get('src'))

3.5 获取指定标签内所有的元素

print(soup.p.contents)

3.6 获取标签的父标签

print(soup.a.parent)

四、存储数据

存储为:文本文档(txt)、表格(excel)、图片、音频、视频

注意:本章节只讲解写操作,写出什么文件写什么格式

4.1 with open() as f: 用法

#格式
with open('./文件路径/文件名.文件类型','权限') as f:
f.write('字符型文本')
权限 作用
w 写入,新的会覆盖旧的
a 写入,在末尾追加写入,不会覆盖旧的
wb 写入,以二进制的方式写入(图片、音频、视频)

4.2 写入为文本文档(txt)

#将变量里的内容写入到“文本.txt”文件中,没有"文本.txt"会自动创建
wb='我是被爬取下来的文字'
with open('文本.txt','w') as f:
f.write(wb)

4.3 循环写入到文本文档中(txt)

#将列表里的内容循环到“文本.txt”文件中,没有"文本.txt"会自动创建
wb=['文本1','文本2','文本3','文本4']
for i in wb:
with open('文本.txt','a') as f:
f.write(i)

4.4 存储图片

#导入请求库
import requests #请求头
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42'} #图片地址列表
imgs=['https://img-blog.csdnimg.cn/a263ea6716ff44d4a2a825dbf26d2666.png','https://img-blog.csdnimg.cn/43112c81ed164acfb45295f516d08925.png'] #为图片命名的变量
i=1 #遍历图片地址
for img in imgs:
#向图片地址发起请求,并且获取请求内容
res=requests.get(url=img,headers=headers).content
#写出图片(注意:权限是wb,写图片扩展名和获取的图片保存一致)
with open(str(i)+'.png','wb') as f:
#写出的参数为请求回来的内容
f.write(res)
i+=1
print("写出成功!")

4.5 存储视频

写出音频也是如此

#导入库
import requests #请求头
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42'} #视频地址
video='https://prod-streaming-video-msn-com.akamaized.net/3f6ca508-598d-4cbd-a3e2-43deea7bc377/b60c553e-9f3f-4164-8850-700a9a73a899.mp4' #发起请求
res=requests.get(url=video,headers=headers).content #写出视频
with open('视频.mp4','wb') as f:
f.write(res)
print("写出成功!")

4.6 存储为excel

sheet.write(行,列,内容)

注意:行和列都是从0开始的,保存的格式为:.xls

#导入写出excel的库
import xlwt #写入的数据
tn=['姓名','性别','年龄']
wb=['玲华','女','18']
#1、创建Workbook对象,就是创建Excel文件
work_boot=xlwt.Workbook(encoding='utf-8'); #2、创建sheet表单
sheet=work_boot.add_sheet('formName') #formName为表单名称 #3、写入内容
for i in range(len(wb)):
sheet.write(0,i,tn[i]) #write(行,列,内容)
sheet.write(1,i,wb[i]) #保存文件
work_boot.save("个人信息.xls")

五、爬虫实战操作

实战是需要自己去分析网页结构的,博主代码只是一种参考,还是要自己去分析。

5.1 百度热搜榜

获取标题、热度、简介、新闻链接、图片、文本保存为txt,并输出

注意:这里没有自动创建保存文件的文件夹,自行修改

#导入库文件
import requests
from bs4 import BeautifulSoup #请求头
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42'}
#请求地址
url='https://top.baidu.com/board?tab=realtime' def Hot_search():
#发起请求
html=requests.get(url=url,headers=headers).text;
#解析为bs4
res=BeautifulSoup(html,"html.parser")
#获取类名获取指定的div(包含所有的新闻信息)
news_div=res.find_all("div",class_="category-wrap_iQLoo horizontal_1eKyQ")
#遍历div(提取每一个新闻)
for new in news_div:
try:
#获取新闻的标题(标题在下标为0的地方,获取文本)
title=new.find_all("div",class_="c-single-text-ellipsis")[0].text
#获取新闻的热度(热度在下标为0的地方,获取文本)
hot=new.find_all("div",class_="hot-index_1Bl1a")[0].text
#获取新闻的简介(简介在下标为0的地方,获取文本)
conent=new.find_all("div",class_="hot-desc_1m_jR small_Uvkd3 ellipsis_DupbZ")[0].text
#获取新闻的链接(通过第一个a标签,的href属性获取)
newUrl=new.find('a').attrs.get('href')
#获取要下载的图片链接的img标签(标签在下标为0的地方)
imgUrl=new.find_all("img")[0]
#获取要下载的图片链接(通过img的src属性获取)
imgUrl=imgUrl.attrs.get('src')
print('\n'+'标题:' + str(title) + '\n' + '热度:' + str(hot) + '\n' + '简介:' + str(conent) + '\n' + '新闻链接:' + str(newUrl) + '\n\n')
#请求图片
img=requests.get(url=imgUrl,headers=headers).content
#写出图片
with open('./百度热搜/' + str(title.strip()) + '.png', 'wb') as f:
f.write(img)
#写出文本
with open('./百度热搜/热搜文本.txt', 'a') as f:
f.write('\n'+'标题:' + str(title) + '\n' + '热度:' + str(hot) + '\n' + '简介:' + str(conent) + '\n' + '新闻链接:' + str(newUrl) + '\n\n')
except:
continue;
print('写出成功!') Hot_search()

5.2 爬取图片壁纸

注意:这里没有自动创建保存文件的文件夹,自行修改

import requests
from bs4 import BeautifulSoup headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40"
} def indexUrl():
indexUrls = ['http://www.netbian.com/meinv/index.htm']
for i in range(2,4):
indexUrls.append('http://www.netbian.com/meinv/index_'+str(i)+'.htm')
#保存图片链接
imgUrls=[]
#当作图片名字
imgName=1;
for i in indexUrls:
html=requests.get(url=i,headers=headers).content.decode('gbk') soup=BeautifulSoup(html,'html.parser')
Alable=soup.find('div',class_='list').find_all('a')
# print(Alable)
for i in Alable:
#获取图片地址的后半段地址
iUrlP=i.attrs.get('href')
#去除无效地址
if 'http' in iUrlP:
continue;
#将残缺的图片页面地址拼起来,形成完整图片页面地址
imgUrlP= 'http://www.netbian.com' + iUrlP
#向图片网页发起请求
imgPage=requests.get(url=imgUrlP,headers=headers).content.decode('gbk')
#将请求回来的源码转换为bs4
soup=BeautifulSoup(imgPage,'html.parser')
#获取图片链接地址
imgUrl=soup.find_all('div',class_='pic')[0].find('img').attrs.get('src')
#将图片地址保存到列表中(可以不存)
imgUrls.append(imgUrl)
#向图片地址发起请求
imgget=requests.get(url=imgUrl,headers=headers).content;
#下载图片
with open('./壁纸/'+str(imgName)+'.jpg','wb') as f:
f.write(imgget)
imgName+=1;
print('下载成功') indexUrl()

5.3 豆瓣电影 Top 250

结果保存到excel中的

import requests;
from bs4 import BeautifulSoup
import xlwt # https://movie.douban.com/top250?start=25&filter=
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42'} #获取翻页页面连接
def top250Urls():
purls=[]
urls=[]
for i in range(0,25,25):
url = 'https://movie.douban.com/top250?start='+str(i)+'&filter='
purls.append(url)
for purl in purls:
html=requests.get(url=purl,headers=headers).content.decode('utf-8')
soup=BeautifulSoup(html,'html.parser')
movie_div = soup.find_all('div', class_='item')
for movie in movie_div:
movieUrl = movie.find_all("div", class_="pic")[0]
movieUrl=movieUrl.find('a')
movieUrl=movieUrl.attrs.get('href')
urls.append(movieUrl)
return urls, def Top250():
moviesTop=[]
urls=top250Urls()[0]
for url in urls:
html=requests.get(url=url,headers=headers).content.decode('utf-8')
soup=BeautifulSoup(html,"html.parser")
title=soup.find_all('span',property="v:itemreviewed")[0].text;
move_info=soup.find_all('div',id="info")[0]
performer=move_info.find_all('a',rel="v:starring")
actors=[]
for per in performer:
actors.append(per.text)
typeSpan=move_info.find_all('span',property="v:genre")
types=[]
for type in typeSpan:
types.append(type.text)
content = soup.find_all('span', property="v:summary")[0].text.strip('\n')
movies={
'title': title,
'performer': actors,
'type': types,
'content': content
}
moviesTop.append(movies)
WriteExcle(moviesTop)
# return moviesTop; def WriteExcle(movies):
try:
#1、创建Workbook对象,就是创建Excel文件
work_boot=xlwt.Workbook(encoding='utf-8');
#2、创建sheet表单
sheet=work_boot.add_sheet('formName') #formName为表单名称
#3、写入Excel表头
header=['电影名','演员','类型','电影简介'];
for i in range(len(header)):
sheet.write(0,i,header[i]); #write(行,列,内容) #写入Excel内容
for i in range(len(movies)):
sheet.write(i+1,0,movies[i]['title'])
sheet.write(i+1, 1, movies[i]['performer'])
sheet.write(i+1, 2, movies[i]['type'])
sheet.write(i+1, 3, movies[i]['content'])
#保存文件
work_boot.save("小电影.xls")
print('写入成功!')
except:
print('写入失败!') Top250()

求求点赞、评论、收藏呀~

python 网络爬虫全流程教学,从入门到实战(requests+bs4+存储文件)的更多相关文章

  1. 学习推荐《精通Python网络爬虫:核心技术、框架与项目实战》中文PDF+源代码

    随着大数据时代的到来,我们经常需要在海量数据的互联网环境中搜集一些特定的数据并对其进行分析,我们可以使用网络爬虫对这些特定的数据进行爬取,并对一些无关的数据进行过滤,将目标数据筛选出来.对特定的数据进 ...

  2. python网络爬虫入门范例

    python网络爬虫入门范例 Windows用户建议安装anaconda,因为有些套件难以安装. 安装使用pip install * 找出所有含有特定标签的HTML元素 找出含有特定CSS属性的元素 ...

  3. Python网络爬虫实战(一)快速入门

    本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要 ...

  4. python网络爬虫之入门[一]

    目录 前言 一.探讨什么是python网络爬虫? 二.一个针对于网络传输的抓包工具fiddler 三.学习request模块来爬取第一个网页 * 扩展内容(爬取top250的网页) 后记 @(目录) ...

  5. python网络爬虫实战之快速入门

    本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要 ...

  6. Python网络爬虫

    http://blog.csdn.net/pi9nc/article/details/9734437 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛 ...

  7. 第3次作业-MOOC学习笔记:Python网络爬虫与信息提取

    1.注册中国大学MOOC 2.选择北京理工大学嵩天老师的<Python网络爬虫与信息提取>MOOC课程 3.学习完成第0周至第4周的课程内容,并完成各周作业 4.提供图片或网站显示的学习进 ...

  8. python网络爬虫学习笔记

    python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...

  9. Python 网络爬虫干货总结

    Python 网络爬虫干货总结 爬取 对于爬取来说,我们需要学会使用不同的方法来应对不同情景下的数据抓取任务. 爬取的目标绝大多数情况下要么是网页,要么是 App,所以这里就分为这两个大类别来进行了介 ...

随机推荐

  1. ora-26002:Informatica的Powercenter跑ETL时,出现ora-26002错误解决办法

    在使用Informatica进行ETL导数的时候,出现下面的错误: WRT_8229 Database errors occurred: ORA-26002: Table REPORT.TB_JK_0 ...

  2. 【原创】Asp.NET Core Web API与Vue 3.0搭建前后分离项目

    特地记录一下,网上的教程写的稀里糊涂的,整得我都心塞塞的,其实实现的过程蛮简单的 问题是这样的:我将Vue构建生成好的文件,放在后端wwwroot文件里面,并开启静态文件访问功能,结果总是无法显示相应 ...

  3. One---python的六种数据类型及数据转换

    python的六种数据类型 python中数据类型分为不可变数据类型和可变数据类型 可变数据类型 可变数据类型包括:List(列表).Dictionary(字典).Set(集合) 不可变数据类型 不可 ...

  4. Docker 10 镜像原理

    参考源 https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0 https://www.bilibili.com/vid ...

  5. linux centos 系统盘文件系统损坏-已解决

    当我们使用的Linux虚拟机(云服务器/vps)磁盘出现xfs文件系统损坏时,该如何进行修复? xfs格式文件系统损坏,是运维常见的一个场景,经常发生在强制重启.异常关机.软件冲突.误删文件等事件后, ...

  6. 乘风破浪,遇见最佳跨平台跨终端框架.Net Core/.Net生态 - 官方扩展集锦(Microsoft.Extensions on Nuget)

    什么是Microsoft.Extensions .NET Platform Extensions是一套.Net官方的API集合,提供了一些常用的编程模式和实用工具,例如依赖项注入.日志记录.缓存.Ho ...

  7. Java八股文纯享版——篇①:Java基础

    注: 1.笔记为个人归纳整理,尽力保证准确性,如有错误,恳请指正 2.写文不易,转载请注明出处 3.本文首发地址 https://blog.leapmie.com/archives/b8fe0da9/ ...

  8. 刷题记录:Codeforces Round #734 (Div. 3)

    Codeforces Round #734 (Div. 3) 20210920.网址:https://codeforces.com/contest/1551. 编程细节:下标定义不要一会[1,n]一会 ...

  9. Mybatis的ResultMap与limit分页查询

    ResultMap主要解决的是:属性名和字段不一致 如果在pojo中设置的是一个名字,在数据库上又是另一个名字,那么查询出来的结果或者其他操作的结果就为null. //在pojo中 private S ...

  10. C++中的STL大法整理

    C++中的STL大法整理 由于碰到了一些不知道怎么用的STL vector vector是数组的STL,对于普通数组的优势就在于,可以动态地变化数组长度.那么面对一些数据范围非常大而又可以边读入边处理 ...