今天我们将要学习如何使用BeautifulSoup库来抓取网站。BeautifulSoup是一个很好的工具,用于解析HTML代码并准确获取所需的信息。因此,无论您是从新闻网站,体育网站,还是在线商店的价格中提取新闻等,BeautifulSoup和Python都可以帮助您快速轻松地完成这些工作。
接下来先看看BeautifulSoup的基本使用,我在桌面上新建一个test.html内容如下:
该文件的html源代码如下:
接下来我们使用BeautifulSoup来进行操作解析这个文件。首先需要安装BeautifulSoup库,lxml解析器库用于解析html,html5lib库用于像访问浏览器页面一样访问网页:
安装requests库,用于请求web地址:
开始编码操作,首先我们导入BeautifulSoup和requests包:
from bs4 import BeautifulSoup
import requests
接下来打开上面新建的test.html获取到源代码信息,注意这里的编码选择utf-8,然后初始化BeautifulSoup,并使用lxml进行解析:
with open('test.html',encoding='utf-8') as html_file:
soup = BeautifulSoup(html_file,'lxml')
我们打印一下soup看下输出的内容:
print(soup)
<!DOCTYPE html>
<html class="no-js" lang="">
<head>
<title>一个简单的web网页</title>
<meta charset="utf-8"/>
<link href="css/normalize.css" rel="stylesheet"/>
<link href="css/main.css" rel="stylesheet"/>
</head>
<body>
<h1 id="site_title">测试网页</h1>
<hr/>
<div class="article">
<h2><a href="article_1.html">文章1</a></h2>
<p>文章1内容</p>
</div>
<hr/>
<div class="article">
<h2><a href="article_2.html">文章2</a></h2>
<p>文章2内容</p>
</div>
<hr/>
<div class="footer">
<p>底部信息</p>
</div>
<script src="js/vendor/modernizr-3.5.0.min.js"></script>
<script src="js/plugins.js"></script>
<script src="js/main.js"></script>
</body>
</html>
这是一个标准的html源代码输出内容。接下来我们获取title标签,并输出:
title = soup.title
print(title)
<title>一个简单的web网页</title>
获取一下title标签中的文本:
title_text = soup.title.text
print(title_text)
一个简单的web网页
获取div标签:
div = soup.div
print(div)
<div class="article">
<h2><a href="article_1.html">文章1</a></h2>
<p>文章1内容</p>
</div>
使用find方法获取div并且指定div的样式class名字为footer的div:
foot_div = soup.find('div',class_='footer')
print(foot_div)
<div class="footer">
<p>底部信息</p>
</div>
使用find_all方法获取所有div并且指定div的样式class名字为article的div,获取到标题和内容:
for article in soup.find_all('div',class_='article'):
headline = article.h2.a.text
print(headline)
summary = article.p.text
print(summary)
文章1
文章1内容
文章2
文章2内容
以上呢就是BeautifulSoup的基本使用方法了,接下来步入正题,我们开始搞一波天涯论坛的帖子,然后将帖子的标题、链接、作者、点击率、回复率、回复时间信息保存到一个csv的文件中去。
这里我们去爬取天涯论坛-旅游论坛-辽阔东北板块为例,地址为:
http://bbs.tianya.cn/list-874-1.shtml,内容截图大致如下:
分析网页html源代码可知,这是一个table表格组成的数据列表,我们只需要解析td中的内容提取出来放入到csv中即可:
我们新建一个py3_tianya.py文件:
#引入相关的包
from bs4 import BeautifulSoup
import requests
import csv
#定义一个类天涯 初始化需要的字段属性
class Tianya:
title = ''
link = ''
author = ''
click = ''
replay = ''
replaytime = ''
#使用requests库访问论坛地址,获取到html源代码
source = requests.get('http://bbs.tianya.cn/list-874-1.shtml').text
#初始化BeautifulSoup,并使用lxml进行解析
soup = BeautifulSoup(source,'lxml')
#定义天涯根地址之后获取链接拼接使用
root_site ='http://bbs.tianya.cn'
#创建csv文件进行写入
csv_file = open('tianya_scrape.csv', 'w')
csv_writer = csv.writer(csv_file)
#写入csv标题头内容
csv_writer.writerow(['标题', '链接', '作者','点击','回复','回复时间'])
#查出所有表格中tr标签
for index,article in enumerate(soup.find_all("tr")):
#实例化天涯对象
ty = Tianya()
#index为0的tr过滤掉,因为是表格标题头部分
if index > 0 :
#使用find_next()方法获取所有的属性信息
ty.title = article.find_next('td').text.strip()
ty.link = root_site+article.find_next('td').a['href'].strip()
ty.author = article.find_next('td').find_next('td').text
ty.click = article.find_next('td').find_next('td').find_next('td').text
ty.replay = article.find_next('td').find_next('td').find_next('td').find_next('td').text
ty.replaytime = article.find_next('td').find_next('td').find_next('td').find_next('td').find_next('td').text
#写入csv文件中
csv_writer.writerow([ty.title, ty.link, ty.author,ty.click,ty.replay,ty.replaytime])
#关闭文件流
csv_file.close()
执行代码会生成一个tianya_scrape.csv文件,内容截图如下:
今天的初始web爬虫就到这里,我们下节见了
下面的是我的公众号二维码图片,欢迎关注。
yale记公众号