这题你会吗:纽约地铁哪一站、在什么时候客流最大?
网页抓取
网页抓取就是自动地从一个网站上获得大量信息的过程,可以节省大量的时间和精力。它听起来似乎有点吓人,但其实很容易学会。这篇文章里我们用一个简单的例子来让你4分钟看懂网页抓取——如何自动下载几百份纽约地铁数据。对于初学者来说,这也许是一篇最容易看懂的Python爬虫科普文了!
纽约地铁旋转门数据
你可能会觉得奇怪,为什么我们要爬取纽约地铁旋转门的数据?
假如我问你,如何算出纽约市什么时间点、什么地区的人流量最多,你会从哪里找数据?
聪明的你马上就想到了吧——地铁进站时人人都要刷地铁卡,那旋转门数据(turnstile data)当然就是一个很酷的数据源啦!而且MTA(纽约交通管理局)是公开这些数据的,所有人都可以去下面这个网址下载数据!
http://web.mta.info/developers/turnstile.html
那么问题来了,旋转门数据从2010年5月到现在每周都有一个单独的.txt文件,所以目前网站上有几百个.txt文件。你看下面这个截图,每一个日期就是一个数据文件的链接。如果我需要所有的历史数据,难道要让我去一条一条地下载!?
当然不用这么傻了!因为我们有Python爬虫!
网页抓取注意事项
首先你要读一下网站的条款,理解如何合法使用数据。大多数网站不允许你将数据用于商业用途。
为了不玩坏别人的网站,也为了避免你自己被网站屏蔽,你要确保不要以太快的速度下载数据。
勘查网站
我们要做的第一件事就是在多层HTML标签中锁定可以下载文档的链接在哪里。简单地说,一个网页上有很多的代码,我们要做的就是找到那些指向数据的关键代码。如果你不熟悉HTML标签,本周六的《Python爬虫直播课》会详细介绍这些网页抓取必备知识点。理解HTML的基础对于网页抓取来说是非常重要的。在网站上,右击选择“检查Inspect”,这让你可以看到网页的源代码。
一旦你点击了inspect,你就会看到一个控制面板:
注意在这个控制面板的左上方有一个箭头标志:
点击这个箭头,然后选择网页上任意一个区域,这块区域所对应的网页源代码就会在控制面板里被自动高亮出来。
我选择了第一个数据文件——“2018年9月22日周六”,弹窗就高亮出了这个文件的下载链接。
<a href=”data/nyct/turnstile/turnstile_180922.txt”>Saturday, September 22, 2018</a>
注意所有的.txt文档都在<a>这个标签里。随着你对网页爬取越来越熟悉,你会发现<a>就是用来标记超链接的。
现在既然我们找到了链接的位置,那就让我们开始写代码吧!
Python代码
我们从导入以下这些功能包开始。
import requests
import urllib.request
import time
from bs4 import BeautifulSoup
requests,urllib.request, time, BeautifulSoup都是功能包,我们之后会用到。
接着,我们把url设定成MTA的网址(就是我们最前面说的那个下载数据的网页),并且用我们的requests数据包来进入这个网页。
url = ‘http://web.mta.info/developers/turnstile.html'
response = requests.get(url)
如果成功进入,你就能看到以下输出:
然后我们用BeautifulSoup来分解这个html,这样我们就能处理一个更干净整洁的数据结构了。如果你想彻底掌握BeautifulSoup这个神奇的功能包,就来参加本周六的《Python爬虫直播课》吧!
soup = BeautifulSoup(response.text, “html.parser”)
然后我们用.findAll这个方法来锁定所有的<a>标签(还记得我们刚刚说的吗,<a>是标记超链接的,我们的数据就是要通过超链接才能下载啊!)。
soup.findAll('a')
运行了上面的代码后,就能看到BeautifulSoup返回给我们下面这些结果(我只截了一部分)。这个代码会给我们所有带<a>标签的html代码行。在返回的结果里面,我们关心的信息从第36行开始——'data/nyct/turnstile/turnstile_180922.txt',从这一行往后都是每周数据的超链接。虽然返回的结果里还有些无关信息,但绝大部分都是我们想要的信息。
接下来,就让我们来抓取我们想要的链接。首先让我们测试第一条连接。
one_a_tag = soup.findAll(‘a’)[36]
link = one_a_tag[‘href’]
这条代码做的是,将第36行的'data/nyct/turnstile/turnstile_180922.txt'赋值给变量link。不过完整的下载数据的url其实是
‘http://web.mta.info/developers/data/nyct/turnstile/turnstile_180922.txt’ 。所以我们需要在python代码里把这个头部给加进去。
我们可以用urllib.request数据包来把这个完整的文件路径下载到我们的电脑里。我们给request.urlretrieve提供两个参数:文件url和文件名。我把文件命名为:“turnstile_180922.txt”, “turnstile_180901”, 依此类推。
download_url = ‘http://web.mta.info/developers/'+ link
urllib.request.urlretrieve(download_url,’./’+link[link.find(‘/turnstile_’)+1:])
最后,我们要加一点小动作。加一条代码让Python每抓一条链接就停顿1秒,避免我们给网站发送太多的请求。
time.sleep(1)
目前为止,我们学会了怎样下载一个文件,那接着就让我们试试用一个for循环来下载整套文件吧!
下面就是用来爬取纽约地铁旋转门数据的完整代码,你来试试看吧!
怎么样,你学会了吗?
Python爬虫是不是没有想象中那么难?但是,如果这个简单的任务就让你觉得自己已经完全掌握网页抓取的话,那你也太小瞧强大的Python了!并不是所有网站都像MTA这样可以轻易爬取,有不少重要的网站是要通过API才能爬取数据的。此外,爬取后的数据要如何进行整理,成为可以做分析的数据文件呢?如果你已经对Python爬虫产生了兴趣,那就来报名我们本周六即将进行的Python爬虫课吧!
《Python爬虫实操直播课》
以爬取Twitter、Reddit、微信、其他公共页面为例,学会如何用Python进行网页爬取,高速捕获网络世界的缤纷数据
直播课程 & 实操作业让你学会用Python进行社媒聆听,并学会对爬取到的海量社交媒体数据进行商业分析
6大案例实战,4个家庭作业,1个Final Project,课上课下同时用功,夯实巩固所学,扎实掌握知识
将课程所学、作业所学迁移到工作场景,当老板想要让你找一些External data的时候,你可以像变魔术一样把数据变出来,并作出完美分析。实用、与工作贴切是我们每一门数据分析工具课的必备特点
课程结束后,完成作业的同学将会获得课程结业证书!
课程大纲:
课程老师:
Effie老师,在Code&Theory担任高级数据编程分析师,有着营销和商业背景的她,深知日常工作中数据挖掘网页爬取的实际应用场景,她摒弃市面上其他Python课程的偏数理、偏理论的作风,从实用主义出发,用案例教学来让大家真正学会Python爬虫!
Henry老师,在Pienso担任机器学习工程师。具有5年数据科学背景,熟悉各类数据分析工具和算法,技术过硬的他总能深入浅出地解决同学们的疑难杂症!
课程价格:$249美元 (人民币:1686元)(6-8小时课时直播交互课堂+录播回放)
名额有限,赶紧联系小助手MissApe报名吧!
关于MarTechApe
MarTechApe是一个来自纽约、专注MarTech领域的知识分享|技能学习|求职服务的终身学习平台。我们提供最专业的Marketing Technology课程。