前言
最近突然对python如何爬取网页数据比较感兴趣,所以就有了这篇文章。
简单介绍
对于python爬取网页数据的原理,简单来说就是运用python代码写一个http请求到目标网站,然后抓取该网页的页面数据,再筛去对我们没用的信息(比如说图标,广告链接等等)
至于为啥用python而不是别的语言来实现该程序,我的观点是python有很多很好用的库来实现该需求。
实现对目标网站进行访问
我们要想对目标网站进行访问,那么就得先用python模拟一个http请求,这个时候就可以用到requests库了
import requests
首先导入该库,如果报错可以看一下有没有安装requests模块,window用下面这行命令就能安装
pip install requests
然后我们来试试效果,这里用菜鸟编程官网作样例
import requests
#模拟请求
res = requests.get('https://www.runoob.com/')
res.encoding='UTF-8'#设置编码(这里不写可能会乱码)
print(res.text) #输出接收的内容
效果图:
这样就抓取到了目标网页的html代码即页面数据
数据筛选
但是我们光要一个html代码感觉也没啥意思,而且一些无效信息也太多了,所以我们要筛选出正确有效的数据信息。
在这里我用的是BeautifulSoup模块,
网上有很多教程都是用的lxml模块,但是我用的pycharm下了lxml模块总是识别不到该库的etree(版本-python3.10,-lxml4.9.2)
写成html.etree也没用,所以我就换了一个库
具体写法:
import requests
# 导入BeautifulSoup中的bs4模块
from bs4 import BeautifulSoup
res = requests.get('https://www.runoob.com/')
res.encoding='UTF-8'
# 将请求返回的html代码字符串进行解析,返回一个对象
soup = BeautifulSoup(res.text,'html.parser')
print(soup.prettify())
效果:
它的输出效果虽然和上面的结果看上去是差不多的,但是上面的那个res.text就是返回了一个单纯的字符串,而这个就把字符串解析成了一个大对象
然后重点来了!!! 在很多网页设计上多多少少都会用到模块化设计的思想,具体到前端代码层面来说就是有很多class样式是用的一个属性
就比如菜鸟教程这个网站,你能看到许多重复的样式(codelist、codelist-desktop等), 而在BeautifulSoup中又有一个find_all() 它能够根据标签名和相应属性定位到你想要的标签上来
import requests
from bs4 import BeautifulSoup
res = requests.get('https://www.runoob.com/')
res.encoding='UTF-8'
soup = BeautifulSoup(res.text,'html.parser')
#调用find_all()查找属性列表中class为codelist的div标签
linkBox= soup.find_all('div',attrs={'class':"codelist"})
print(linkBox)#打印数据
运行结果:
这样我们就筛选掉了大部分自己不想要的数据
不过还不够精确(如果我单纯只是想要学习标题与学习链接的话)
我们再完善一下~
import requests
from bs4 import BeautifulSoup
res = requests.get('https://www.runoob.com/')
res.encoding='UTF-8'
soup = BeautifulSoup(res.text,'html.parser')
linkBox= soup.find_all('div',attrs={'class':"codelist"})
linkList=[]#用来存放最后的结果
#因为没在网上找到如何获取strong标签的文本内容方式
#所以自己写了一个筛选函数
def removeStrong(s):
result = s
if(s==None):
result="无"
else:
result = result[8:len(result)]
result = result[0:result.find('<')]
return result
#将需要的信息从标签中提取出来
for i in linkBox:
linkBoxA = i.find_all('a')
for j in linkBoxA:
allLink = []
link = j.get('href')
linkName = j.h4.string
linkText = removeStrong(str(j.strong))
allLink.append(linkName)
allLink.append(link)
allLink.append(linkText)
linkList.append(allLink)
print(linkList)#输出结果
输出结果:
优化一下结果
实际上如果只是自己代码里使用的话,以上的东西是已经完全够了,
都把数据筛出来了,你还要怎样!?但是,有时候我们的采集数据是要提供给其他人的,所以我们可以将这些数据转换为一份excel文件(因为常用通用)
所幸,python将代码数据转换为excel文件还是很方便的
这里我用的是xlwt库
import requests
from bs4 import BeautifulSoup
import xlwt
res = requests.get('https://www.runoob.com/')
res.encoding='UTF-8'
soup = BeautifulSoup(res.text,'html.parser')
linkBox= soup.find_all('div',attrs={'class':"codelist"})
linkList=[]
def removeStrong(s):
result = s
if(s==None):
result="无"
else:
result = result[8:len(result)]
result = result[0:result.find('<')]
return result
for i in linkBox:
linkBoxA = i.find_all('a')
for j in linkBoxA:
allLink = []
link = j.get('href')
linkName = j.h4.string
linkText = removeStrong(str(j.strong))
allLink.append(linkName)
allLink.append(link)
allLink.append(linkText)
linkList.append(allLink)
#创建基本文件并初始化
linkbook = xlwt.Workbook(encoding='utf-8',style_compression=0)
#创建sheet表
linksheet = linkbook.add_sheet('菜鸟编程学习链接',cell_overwrite_ok=True)
#编写第一行数据
linksheet.write(0,0,'学习标题')
linksheet.write(0,1,'学习链接')
linksheet.write(0,2,'内容简介')
#从第二行开始依次填入数据
for i in range(0, len(linkList)):
data = linkList[i]
for j in range(0, len(linkList[i])):
linksheet.write(i+1,j,data[j])
#设置文件保存路径
savepath = 'C:/test/excel表格.xls'
linkbook.save(savepath)
excel文件截图:
OK,以上就是我第一次用python扒数据的大致过程,其实还有很多好玩的,比如扒一些图片呀、视频呀啥的,都大差不差~