浅试python爬取网页数据

2,674 阅读3分钟

前言

最近突然对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) #输出接收的内容

效果图: image.png

这样就抓取到了目标网页的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())

效果: image.png 它的输出效果虽然和上面的结果看上去是差不多的,但是上面的那个res.text就是返回了一个单纯的字符串,而这个就把字符串解析成了一个大对象

然后重点来了!!! 在很多网页设计上多多少少都会用到模块化设计的思想,具体到前端代码层面来说就是有很多class样式是用的一个属性 image.png 就比如菜鸟教程这个网站,你能看到许多重复的样式(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)#打印数据

运行结果:

image.png

这样我们就筛选掉了大部分自己不想要的数据

不过还不够精确(如果我单纯只是想要学习标题与学习链接的话)

我们再完善一下~

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)#输出结果

输出结果:

image.png

优化一下结果

实际上如果只是自己代码里使用的话,以上的东西是已经完全够了, 都把数据筛出来了,你还要怎样!?

但是,有时候我们的采集数据是要提供给其他人的,所以我们可以将这些数据转换为一份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文件截图:

image.png

OK,以上就是我第一次用python扒数据的大致过程,其实还有很多好玩的,比如扒一些图片呀、视频呀啥的,都大差不差~