如何用Python爬数据?(一)网页抓取

转自: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)

下面是输出

[<Element 'a' href='https://www.jianshu.com/nb/130182' target='_blank'>]

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自动网页抓取的基础技能。希望阅读并动手实践后,你能掌握以下知识点:

  • 网页抓取与网络爬虫之间的联系与区别;
  • 如何用 pipenv 快速构建指定的 Python 开发环境,自动安装好依赖软件包;
  • 如何用 Google Chrome 的内置检查功能,快速定位感兴趣内容的标记路径;
  • 如何用 requests-html 包来解析网页,查询获得需要的内容元素;
  • 如何用 Pandas 数据框工具整理数据,并且输出到 Excel。

或许,你觉得这篇文章过于浅白,不能满足你的要求。
文中只展示了如何从一个网页抓取信息,可你要处理的网页成千上万啊。
别着急。
本质上说,抓取一个网页,和抓取10000个网页,在流程上是一样的。
而且,从咱们的例子里,你是不是已经尝试了抓取链接?
有了链接作为基础,你就可以滚雪球,让Python爬虫“爬”到解析出来的链接上,做进一步的处理。
将来,你可能还要应对实践场景中的一些棘手问题:

  • 如何把抓取的功能扩展到某一范内内的所有网页?
  • 如何爬取Javascript动态网页?
  • 假设你爬取的网站对每个IP的访问频率做出限定,怎么办?

需要注意的是,网络爬虫抓取数据,虽然功能强大,但学习与实践起来有一定门槛。
当你面临数据获取任务时,应该先检查一下这个清单:

  • 有没有别人已经整理好的数据集合可以直接下载?
  • 网站有没有对你需要的数据提供API访问与获取方式?
  • 有没有人针对你的需求,编好了定制爬虫,供你直接调用?

如果答案是都没有,才需要你自己编写脚本,调动爬虫来抓取。
为了巩固学习的知识,请你换一个其他网页,以咱们的代码作为基础修改后,抓取其中你感兴趣的内容。
如果能把你抓取的过程记录下来,在评论区将记录链接分享给大家,就更好了。
因为刻意练习是掌握实践技能的最好方式,而教是最好的学。

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值