目录
一、requests
二、BeautifulSoup
三、爬虫实战-新浪财经新闻
1、导包
2、BeautifulSoup解析
3、提取新闻标题
4、提取新闻发布时间
5、提取正文内容
四、爬虫实战-小说爬取及可视化
1、爬取小说信息
2、可视化
五、总结
在终端运行以下命令即可安装requests:
pip install requests
使用requests:
# 导入Requests模块
import requests as rq
#使用get方法,请求指定的页面信息,并返回实体主体
response = rq.get('http://httpbin.org/get')
#使用post方法,请求服务器接受所指定的文档作为对所标识的URI的新的从属实体
response = rq.post('http://httpbin.org/post')
#使用put方法,从客户端向服务器传送的数据取代指定的文档的内容
response = rq.put('http://httpbin.org/put')
#使用delete方法,请求服务器删除指定的页面
response = rq.delete('http://httpbin.org/delete')
#使用head方法,只请求页面的首部
response = rq.head('http://httpbin.org/get')
#使用options方法,可用于检测服务器允许的http方法
response = rq.options('http://httpbin.org/get')
httpbin是一个使用Python + Flask编写的HTTP Request & Response Service,该服务主要用于测试HTTP库,你可以向他发送请求,然后他会按照指定的规则将你的请求返回(查看你所发送请求中的信息)。
响应:
Response "200" 是一个HTTP状态码,表示请求已成功处理。
response.text 是获取HTTP请求的响应内容,即服务器返回的数据。
response.json() 是将HTTP请求的响应内容解析为JSON格式的方法。如果 JSON 解码失败, 就会抛出一个异常。
response.encoding 是HTTP请求响应的字符编码方式。
response.content 是以字节的方式访问请求响应体。
BeautifulSoup是一个Python库,用于从HTML和XML文件中提取数据。它的主要作用是解析网页内容,将网页转换为一个结构化的数据对象,以便于进一步处理和分析。BeautifulSoup提供了简洁而直观的API,能够自动纠正不规范的HTML代码,并处理嵌套标签、缺失标签等问题,还支持多种解析器,可以根据需要选择不同的解析器来提高解析速度和效果,被广泛应用于爬虫中。
简而言之,我们可以使用requests获取网页内容后,交给BeautifulSoup来解析。
Beautiful Soup支持多种解析器,其中常用的有三种:html.parser、lxml和html5lib。它们各自有一些特点和用途。以下是它们之间的主要区别:
html.parser:
速度: 是Python标准库中的内置解析器,因此速度相对较快。
依赖: 不需要额外安装依赖。
兼容性: 在处理一些复杂或损坏的HTML时,可能不如其他解析器稳定。
soup = BeautifulSoup(html, 'html.parser')
lxml:
速度: 通常比内置解析器快,是C语言编写的。
依赖: 需要额外安装lxml库。
功能: 支持XPath表达式,处理HTML和XML的能力强。
soup = BeautifulSoup(html, 'lxml')
html5lib:
严格性: 以浏览器的方式解析文档,生成严格的HTML5。
兼容性: 处理损坏的HTML时表现良好,但相对较慢。
依赖: 需要额外安装html5lib库。
soup = BeautifulSoup(html, 'html5lib')
总结:在选择解析器时,如果你的HTML文档是标准的,并且性能是关键,可以选择使用内置的html.parser。如果你处理的HTML文档较大或较复杂,且性能很重要,可以考虑使用lxml。如果你处理的是HTML5文档,或者需要处理损坏的HTML,可以选择使用html5lib,但要注意它可能会比较慢。
导入需要的python库,newsUrl为本次爬取的新闻地址。
import requests as rq
from bs4 import BeautifulSoup
newsUrl = 'http://finance.sina.com.cn/wm/2023-11-11/doc-imzuhcek4892020.shtml'
新闻网页如下所示:
爬取新闻,并交由BeautifulSoup库解析HTML文本,'lxml'是指定的解析器,用于解析HTML文档。
newsWeb = rq.get(newsUrl)
newsWeb.encoding = 'utf-8'
soup = BeautifulSoup(newsWeb.text,'lxml')
with open('soup.txt', 'w',encoding='utf-8') as f:
f.write(str(soup))
通过导出soup的文本内容,可以看到,该新闻网页已经被解析好了。
通过观察可以发现新闻标题《美国评级,再亮“红灯”》可以通过soup.title获取(用正则表达式清除多余的字符)、也可以通过soup.find()方法获取、还可以通过soup.select方法获取。
re.search(r'(.*)\|',soup.title).group(1)
soup.find(attrs={"property":"og:title"})["content"]
soup.select('.main-title')[0].text
总结一下:
soup.xxx:这个方法用于获取HTML文档的
soup.find(attrs={"name":"xxx"}):这个方法会在整个BeautifulSoup解析的HTML文档中查找具有name属性值为xxx的元素。
soup.select('.xxx'):使用CSS选择器查找所有具有类名xxx的元素,此方法不仅查找具有name属性值为xxx的元素,还会查找具有类名为xxx的元素。如果不是通过类名查找,而是通过ID,那么则是soup.select('#xxx')。
可以通过以下方式:
①使用find方法找到带有class为 'date' 的 标签,最后使用.text属性获取标签内的文本内容。
②CSS选择器语法,通过soup.select('.date')选择所有class为 'date' 的元素,然后通过索引[0]取得第一个匹配的元素,最后使用.text获取该元素的文本内容。
soup.find('span', class_='date').text
soup.select('.date')[0].text
可以通过以下方式:
①使用.find('div', class_='article')找到第一个具有 'article' 类的
②使用CSS选择器语法,通过soup.select('.article')选择所有class为 'article' 的元素,然后通过索引[0]取得第一个匹配的元素,最后使用.text获取该元素的文本内容。
soup.find('div', class_='article').get_text(separator='\n', strip=True)
re.sub(r'\s+', ' ', soup.select('.article')[0].text)
通过观察小说网站的网址可以发现,翻页时,网址末尾的数字+1即可实现翻页,随后可爬取下一页的信息。本文通过遍历爬取前10页的小说信息
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_NOTEBOOK
base_url = 'https://www.hongxiu.com/category/f1_f1_f1_f1_f1_f1_0_'
page_count = 10
# 创建Excel
workbook = Workbook()
sheet = workbook.active
# 表头
sheet['A1'] = '名称'
sheet['B1'] = '作者'
sheet['C1'] = '类型'
sheet['D1'] = '是否完结'
sheet['E1'] = '人气'
sheet['F1'] = '简介'
# 从第二行开始写入数据
row = 2
# 遍历红袖添香网的每一页
for page in range(1, page_count + 1):
#链接
url = base_url + str(page)
#爬取并解析
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
#找到小说所在的HTML元素
novel_list = soup.find_all('div', class_='book-info')
#遍历小说列表,提取所需信息
for novel in novel_list:
#提取小说名称
name = novel.find('h3').a.text.strip()
#提取作者
author = novel.find('h4').a.text.strip()
#提取类型
category = novel.find('span', class_='org').text.strip()
#提取是否完结
is_complete = novel.find('span', class_='pink').text.strip()
#提取人气
popularity = novel.find('span', class_='blue').text.strip()
#提取简介
intro = novel.find('p', class_='intro').text.strip()
#将数据写入Excel
sheet['A' + str(row)] = name
sheet['B' + str(row)] = author
sheet['C' + str(row)] = category
sheet['D' + str(row)] = is_complete
sheet['E' + str(row)] = popularity
sheet['F' + str(row)] = intro
row += 1
# 保存Excel文件
file_path = 'test.xlsx'
workbook.save(file_path)
#==============统计不同类型小说的数量==============
df = pd.read_excel(file_path)
category_counts = df['类型'].value_counts()
# 创建饼图
pie = (Pie().add(
'',
[list(z) for z in zip(category_counts.index.to_list(), [int(value) for value in category_counts.values])],
radius=['40%', '70%']
).set_global_opts(
title_opts=opts.TitleOpts(title="小说类型占比"),
legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%")
).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
pie.render_notebook()
输出图像如下:
requests和BeautifulSoup都是简单易用的python库,适合初学者和静态网页项目。BeautifulSoup具有一定的灵活性,可以根据具体需求使用不同的解析器和选择器,适应各种网页结构。
但对于动态网页,BeautifulSoup可能无法获取到完整的页面内容,需要使用Selenium。其次,对于大规模爬取或对速度要求较高的情况,BeautifulSoup可能不如其他一些专门的爬虫框架(如Scrapy)高效。
对于具有反爬虫机制的网页, requests很容易被网站的反爬虫机制检测到,导致IP被封锁,所以诸位一定要慎用,相对来说,selenium模拟浏览器访问网页会更安全一些。