Python爬虫初级(七)—— 丁香园评论留言板爬取

2023-11-04 08:50

本文主要是介绍Python爬虫初级(七)—— 丁香园评论留言板爬取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎关注公众号K的笔记阅读博主更多优质学习内容
K的笔记公众号

上一篇内容:Python爬虫初级(六)—— 正则表达式库入门

观察待爬取页面,判断爬取可行性

我们首先查看待爬取页面:http://www.dxy.cn/bbs/thread/626626#626626,具体形式为下图:
丁香园待爬取页面我们查看源代码信息:
页面源代码可以发现留言板块的内容在页面源代码全部直接显示了出来,那么我们可以尝试直接进行爬取,我们采取的思路首先是 requests 库 + bs4 库,这两者的具体用法在前面的文章均已涉及。

检测爬取链接,初步尝试爬取

首先我们可以在IDLE上检查爬取链接是否正常,直接展示代码:

>>> import requests
>>> import re
>>> from bs4 import BeautifulSoup
>>> url = "http://www.dxy.cn/bbs/thread/626626#626626"
>>> headers = {"user-agent":"Mozilla/5.0"}
>>> res = requests.get(url, headers=headers, stream=True)
>>> res.status_code
200
>>> text = res.text
>>> soup = BeautifulSoup(text)
>>> text[1000:1300]
'og:description" content="我遇到一个“怪”病人,向大家请教。她,42岁。反复惊吓后晕厥30余年。每次受响声惊吓后发生跌倒,短暂意识丧失。无逆行性遗忘,无抽搐,无口吐白沫,无大小便失禁。多次跌倒致外伤。婴儿时有惊厥史。入院查体无殊。ECG、24小时动态心电图无殊;头颅MRI示小软化灶;脑电图无殊。入院后有数次类似发作。请问该患者该做何诊断,还需做什么检查,治疗方案怎样?"/>\n        <meta property="og:author" content="楼医生"/>\n        <meta property="og:release_date" content'

我们想要抓取链接,先在上面的源代码中对标题层级结构进行分析:
标题代码

然后直接写出相关代码:

>>> title = soup("div", id="postview")[0].tr.th.h1.contents[0]
['\n                    晕厥待查——请教各位同仁                 ']
>>> title = title.replace(" ", "")
>>> title = title.replace("\n", "")
>>>> title
'晕厥待查——请教各位同仁'

下面同理可以查看其他信息,下面我们为了便于操作直接采用 CSS 类名查找:

>>> context = soup.select("[class~=postbody]")
# 返回所有内容信息 

返回的信息内容如下:
爬取返回内容对内容进行清理:

>>> cont = context[1].contents[0]
>>> cont = cont.replace(" ", "")
>>> cont = cont.replace("\n", "")
>>> cont
'从发作的症状上比较符合血管迷走神经性晕厥,直立倾斜试验能协助诊断。在行直立倾斜实验前应该做常规的体格检查、ECG、UCG、holter和X-ray胸片除外器质性心脏病。'

测试代码写完后,我们写出完整代码:

import requests
from bs4 import BeautifulSoupdef getHTML(url):try:headers = {"user-agent":"Mozilla/5.0"}res = requests.get(url, headers=headers, stream=True)res.raise_for_statusres.encoding = res.apparent_encodingreturn res.textexcept:return ""def ParseFromPage(html):commentList = []soup = BeautifulSoup(html)title = soup("div", id="postview")[0].tr.th.h1.contents[0]title = title.replace(" ", "")title = title.replace("\n", "")context = soup.select("[class~=postbody]")for i in range(len(context)):cont = context[i].contents[0]cont = cont.replace(" ", "")commentList.append(cont)return title, commentListdef main():base_url = "http://www.dxy.cn/bbs/thread/626626#626626"html = getHTML(base_url)title, cList = ParseFromPage(html)print(title, cList)main()

拓展一

我们爬取完单一页面后,我们可以考虑,是否可以爬取更多的页面。我们的思考出发点是丁香园每个页面的链接下面都会存在一个引向其他同类型页面的链接,比如:
链接抓取我们可以看到,下面的 “骨折手术后一周突发心跳骤停,抢救无效死亡,什么原因?”这段话不就是我们要找的链接,点开后也确实如我们所料,页面结构的解析和本页面的解析一样,我们完全可以复用这段代码,只需要改变一下 url 即可。下面我们尝试通过 re 库获取此 url 链接:

>>> import re
>>> href = re.findall(r'&#149; <a href="(.*?)" target', text)
>>> href
['http://job.dxy.cn/bbs/topic/43200651', 'http://www.dxy.cn/bbs/topic/43177945', 'http://Radiology.dxy.cn/bbs/topic/43179123', 'http://www.dxy.cn/bbs/topic/43172871']

这里我们看到有四个链接,但并不是每个链接都是我们需要的,通过观察后我们发现,只有以 “http://www.dxy.cn/bbs/topic” 开头的链接才是我们需要的,我们可以将查找链接的方式改为:

>>> re.findall(r'<a href="(http://www.dxy.cn/bbs/topic/.*?) target="_blank"',text)
['http://www.dxy.cn/bbs/topic/43177945"', 'http://www.dxy.cn/bbs/topic/43172871"']

我们看到返回了两个正确结果,为了不增大网站压力,我们修改主函数,仅仅爬取十条链接的内容,并存储到 dxy.txt 文件中,主函数代码如下:

def main():base_url = "http://www.dxy.cn/bbs/thread/626626#626626"for i in range(10):html = getHTML(base_url)title, cList = ParseFromPage(html)with open("dxy.txt", "a", encoding="utf-8") as f:f.write(title)f.write("\n")for i in range(len(cList)):f.write(cList[i])f.write("\n")f.write("\n")try:url_list = re.findall(r'<a href="(http://www.dxy.cn/bbs/topic/.*?) target="_blank"',html)base_url = url_list[0]except:continue

此代码应能正确爬取链接,代码规范有待网友指正。

拓展二

我们还可以使用 lxml 爬取内容,事实上此代码会更加简洁, lxml 的具体用法将在下期内容展开,以下直接简单使用之:

from lxml import html, etree
>>> tree1 = html.tostring(tree.xpath('//td[@class="postbody"]')[1])
>>> txt = HTMLParser().unescape(tree1.decode('utf-8'))
>>> txt.replace(" ","")
'<tdclass="postbody">\n\n从发作的症状上比较符合血管迷走神经性晕厥,直立倾斜试验能协助诊断。在行直立倾斜实验前应该做常规的体格检查、ECG、UCG、holter和X-ray胸片除外器质性心脏病。<br><br>贴一篇“口服氨酰心安和依那普利治疗血管迷走性晕厥的疗效观察”<br>作者:林文华任自文丁燕生<br><br><ahref="http://www.ccheart.com.cn/ccheart_site/Templates/jieru/200011/1-1.htm"target="_blank"class="ilink"rel="nofollow">http://www.ccheart.com.cn/ccheart_site/Templates/jieru/200011/1-1.htm</a>\n\t</td>\n'                           '

其他信息的抽取以及代码的结构化同上即可。

下一篇内容:Python爬虫初级(八)—— lxml 详解及代理IP爬取

这篇关于Python爬虫初级(七)—— 丁香园评论留言板爬取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/344612

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点