vb抓取网页内容(Python显示results结果数据对应的内容(图))
优采云 发布时间: 2021-12-10 14:17vb抓取网页内容(Python显示results结果数据对应的内容(图))
就像你要寄包裹给某人一样,你可以在“省-市-区-街道-社区-门牌”的结构中写一个地址,快递员也可以根据这个地址找到收件人。
同样,我们对网页上的一些特定内容感兴趣,我们可以根据这些标签的结构找出来。
这是否意味着您必须先学习 HTML 和 CSS,然后才能抓取网页内容?
不,我们可以使用工具来帮助您显着简化任务的复杂性。
此工具随 Google Chrome 浏览器一起提供。
我们在示例文章页面点击鼠标右键,在出现的菜单中选择“Check”。
这时,屏幕下方会出现一列。
我们单击此列左上角的按钮(上面标记为红色)。然后将鼠标悬停在第一个文本链接(“玉树之蓝”)上并单击一次。
此时,你会发现下栏的内容也发生了变化。这个链接对应的源码放在栏目区域的中间,并高亮显示。
确认该区域是我们要找的链接和文字说明后,我们用鼠标右键选中突出显示的区域,在弹出的菜单中选择Copy -> Copy selector。
找个文本编辑器,执行paste,就可以看到我们复制的内容了。
body > div.note > div.post > div.article > div.show-content > div > p:nth-child(4) > a
这长串标签为电脑指出:请先找到body标签,进入管辖区域后,寻找div.note标签,然后找到...终于找到a标签,这里是您正在寻找的内容。
回到我们的 Jupyter Notebook 并使用我们刚刚定义的变量 sel 的标签路径。
sel = 'body > div.note > div.post > div.article > div.show-content > div > p:nth-child(4) > a'
我们让Python从返回的内容中找到sel对应的位置,并将结果存入results变量中。
results = r.html.find(sel)
让我们看看结果如何。
results
这是结果:
[]
结果是一个仅收录一项的列表。此项收录一个网址,即我们要查找的第一个链接(“玉树知兰”)对应的网址。
但文字描述“《玉树知兰》”去哪儿了?
别着急,我们让Python显示结果数据对应的文字。
results[0].text
这是输出:
'玉树芝兰'
我们还提取了链接:
results[0].absolute_links
显示的结果是一个集合。
{'https://www.jianshu.com/nb/130182'}
我们不需要集合,只需要其中的链接字符串。所以我们先把它转换成一个列表,然后从中提取第一项,即URL链接。
list(results[0].absolute_links)[0]
这一次,我们终于得到了我们想要的结果:
'https://www.jianshu.com/nb/130182'
有了处理这第一个环节的经验,你就有了很多信心,对吧?
其他的链接无非就是找到标记的路径,然后拍猫和虎的照片。
但是,如果每次找到链接都需要手动输入这些句子,那就太麻烦了。
这里是编程技巧。一一重复执行的语句。如果工作顺利,我们会尝试将它们合并在一起并制作一个简单的功能。
对于这个函数,只要给出一个选择路径(sel),它就会把它找到的所有描述文本和链接路径返回给我们。
def get_text_link_from_sel(sel):
mylist = []
try:
results = r.html.find(sel)
for result in results:
mytext = result.text
mylink = list(result.absolute_links)[0]
mylist.append((mytext, mylink))
return mylist
except:
return None
我们来测试一下这个功能。
还是用刚才的标记路径(sel),试试看。
print(get_text_link_from_sel(sel))
输出如下:
[('玉树芝兰', 'https://www.jianshu.com/nb/130182')]
没问题吧?
好的,让我们尝试第二个链接。
我们还是用刚才的方法,使用下栏左上角的按钮,点击第二个链接。
下面显示的突出显示的内容已更改:
我们仍然使用鼠标右键单击突出显示的部分来复制选择器。
然后我们直接将获取到的标签路径写入到 Jupyter Notebook 中。
sel = 'body > div.note > div.post > div.article > div.show-content > div > p:nth-child(6) > a'
用我们刚刚编译的函数看看输出结果是什么?
print(get_text_link_from_sel(sel))
输出如下:
[('如何用Python做词云?', 'https://www.jianshu.com/p/e4b24a734ccc')]
经检查,功能没有问题。
下一步是什么?
还是要找第三个链接,模仿刚才的方法?
那你还不如手动从全文中提取信息,省去你的麻烦。
我们必须找到一种方法来自动化这个过程。
比较我们只找到两次的标记路径:
body > div.note > div.post > div.article > div.show-content > div > p:nth-child(4) > a
也:
body > div.note > div.post > div.article > div.show-content > div > p:nth-child(6) > a
你发现了什么模式?
是的,路径上的所有其他标记都相同,除了倒数第二个标记(“p”)之后冒号之后的内容。
这是我们自动化的关键。
上述两个标签路径中,因为指定了第n个子文本段(段落,即“p”的意思)来查找标签“a”,所以只返回了一个结果。
如果我们不限制“p”的具体位置信息呢?
让我们试试吧。这次保留标记路径中的所有其他信息,只修改“p”点。
sel = 'body > div.note > div.post > div.article > div.show-content > div > p > a'
再次运行我们的函数:
print(get_text_link_from_sel(sel))
这是输出:
嗯,我们要找的所有内容都在这里。
然而,我们的工作还没有结束。
我们必须将 采集 中的信息输出到 Excel 并保存。
还记得我们常用的数据框工具 Pandas 吗?是时候让它再次展现它的神奇力量了。
import pandas as pd
只需这行命令,我们就可以将刚才的列表变成一个数据框:
df = pd.DataFrame(get_text_link_from_sel(sel))
我们来看一下数据框的内容:
df
内容还可以,但是我们对标题不满意,所以我们必须用更有意义的列名替换它:
df.columns = ['text', 'link']
看一下数据框的内容:
df
好的,现在您可以将捕获的内容输出到 Excel。
Pandas 的内置命令可以将数据框转换为 csv 格式,可以直接用 Excel 打开查看。
df.to_csv('output.csv', encoding='gbk', index=False)
注意编码需要指定为gbk,否则在Excel中查看默认的utf-8编码可能会出现乱码。
我们来看看生成的 csv 文件。
很有成就感不是吗?
概括
本文将向您展示使用 Python 自动爬网的基本技巧。希望通过阅读和动手实践,您可以掌握以下知识点:
可能你觉得这个文章太简单了,满足不了你的要求。
文章只展示了如何从一个网页中抓取信息,但您必须处理数千个网页。
别担心。
本质上,抓取一个网页与抓取 10,000 个网页是一样的。
而且,根据我们的示例,您是否已经尝试过获取链接?
以链接为基础,您可以滚雪球,让 Python 爬虫“爬行”到已解析的链接以进行进一步处理。
以后在实际场景中,你可能要处理一些棘手的问题:
这些问题的解决方法,希望在以后的教程中与大家一一分享。
需要注意的是,虽然网络爬虫抓取数据的能力很强,但是学习和实践也有一定的门槛。
当您面临数据采集任务时,您应该首先查看此列表:
如果答案是否定的,则需要自己编写脚本并调动爬虫来抓取它。
为了巩固你所学的知识,请切换到另一个网页,根据我们的代码进行修改,抓取你感兴趣的内容。
如果能记录下自己爬的过程,在评论区把记录链接分享给大家就更好了。
因为刻意练习是掌握实践技能的最佳途径,而教学是最好的学习。
祝你好运!
思考
已经解释了本文的主要内容。
这里有一个问题供您思考:
我们解析和存储的链接实际上是重复的:
这不是因为我们的代码有问题,而是在《如何使用“玉树智兰”开始数据科学?"文章中,我多次引用了一些文章,所以重复的链接都被抓了