转自:https://blog.csdn.net/nkwshuyi/article/details/79435248
默认会 html,js,css,python3,已安装Anaconda,python3,Google Chrome,
即便你打开浏览器,手动拷贝数据下来,也叫做网页抓取(web scraping)
使用程序(或者机器人)自动替你完成网页抓取的工作,就叫爬虫。
网页的数据抓下来干什么呢?
一般是先存储起来,放到数据库或者电子表格中,以备检索或者进一步分析使用。
所以,你真正想要的功能是这样的:
找到链接,获得Web页面,抓取指定信息,存储。
这个过程有可能会往复循环,甚至是滚雪球。
你希望用自动化的方式来完成它。
下面开始操作
# 启动 Google Chrome
pipenv shell
# 启动 jupyter
jupyter notebook
from requests_html import HTMLSession
# 建立一个会话(session)
session = HTMLSession()
# 获取网页内容,html格式的
url = 'https://www.jianshu.com/p/85f4624485b9'
r = session.get(url)
# 仅显示文字部分
print(r.html.text)
# 仅显示网页内的链接(相对链接)
print(r.html.links)
# 显示绝对链接
print(r.html.absolute_links)
鼠标右键点击网页,选择“检查”,可以看到网页的源码,源码的左上有选择器,用来选择你想要的内容。
被选择的内容的源码会高亮显示,然后用鼠标右键点击,选择"copy" > “copy selector” 复制选择器
找个文本编辑器,粘贴看看复制了什么
body > div.note > div.post > div.article > div.show-content > div > p:nth-child(4) > a
下面看看这个怎么用
sel = 'body > div.note > div.post > div.article > div.show-content > div > p:nth-child(4) > a'
results = r.html.find(sel)
print(results)
下面是输出
[]
results 是个列表,只包含一项。这一项包含一个网址,就是我们要找的第一个链接(《玉树芝兰》)对应的网址。
可是文字描述“《玉树芝兰》”哪里去了?
别着急,我们让 Python 显示 results 结果数据对应的文本。
print(results[0].text)
# '玉树芝兰'
# 提取链接
results[0].absolute_links
# 显示一个集合
# {'https://www.jianshu.com/nb/130182'}
# 集合转列表
print(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
下面测试这个小程序
print(get_text_link_from_sel(sel))
# [('玉树芝兰', 'https://www.jianshu.com/nb/130182')]
其他的链接,复制出来,和上面的链接差别就在最后的 p:nth-child(4) > 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))
print(df)
内容没问题,不过我们对表头不大满意,得更换为更有意义的列名称:
df.columns = ['text', 'link']
print(df)
好了,下面就可以把抓取的内容输出到Excel中了。
Pandas内置的命令,就可以把数据框保存成csv格式,一种可以用Excel直接打开查看的格式。
df.to_csv('output.csv', encoding='gbk', index=False)
注意这里需要指定encoding(编码)为gbk,否则默认的utf-8编码在Excel中查看的时候,有可能是乱码。
我们看看最终生成的csv文件吧。
本文为你展示了用Python自动网页抓取的基础技能。希望阅读并动手实践后,你能掌握以下知识点:
或许,你觉得这篇文章过于浅白,不能满足你的要求。
文中只展示了如何从一个网页抓取信息,可你要处理的网页成千上万啊。
别着急。
本质上说,抓取一个网页,和抓取10000个网页,在流程上是一样的。
而且,从咱们的例子里,你是不是已经尝试了抓取链接?
有了链接作为基础,你就可以滚雪球,让Python爬虫“爬”到解析出来的链接上,做进一步的处理。
将来,你可能还要应对实践场景中的一些棘手问题:
需要注意的是,网络爬虫抓取数据,虽然功能强大,但学习与实践起来有一定门槛。
当你面临数据获取任务时,应该先检查一下这个清单:
如果答案是都没有,才需要你自己编写脚本,调动爬虫来抓取。
为了巩固学习的知识,请你换一个其他网页,以咱们的代码作为基础修改后,抓取其中你感兴趣的内容。
如果能把你抓取的过程记录下来,在评论区将记录链接分享给大家,就更好了。
因为刻意练习是掌握实践技能的最好方式,而教是最好的学。