专栏首页AI研习社马蜂窝数据被扒光, 用 Python 爬取网页信息 4 分钟就能搞定

马蜂窝数据被扒光, 用 Python 爬取网页信息 4 分钟就能搞定

本文为 AI 研习社编译的技术博客,原标题 : How to Web Scrape with Python in 4 Minutes 翻译 | M.Y. Li 校对 | 就2 整理 | 菠萝妹 原文链接: https://towardsdatascience.com/how-to-web-scrape-with-python-in-4-minutes-bc49186a8460

图片来自https://www.freestock.com/free-photos/illustration-english-window-blue-sky-clouds-41409346

网页抓取是一种自动访问网站并提取大量信息的技术,这可以节省大量的时间和精力。在本文中我们将通过一个简单的示例来说明如何自动从New York MTA下载数百个文件。对于希望了解如何进行网页抓取的初学者来说,这是一个很好的练习。网页抓取可能会有点复杂,因此本教程将分解步骤进行教学。

New York MTA 数据

我们将从这个网站下载有关纽约公共交通地铁站旋转门的数据:

http://web.mta.info/developers/turnstile.html

从2010年5月至今,这些旋转门的数据被按周汇总,因此网站上存在数百个.txt文件。下面是一些数据片段,每个日期都是可供下载的.txt文件的链接。

手动右键单击每个链接并保存到本地会很费力,幸运的是我们有网页抓取!

有关网页抓取的重要说明:

1. 仔细阅读网站的条款和条件,了解如何合法使用这些数据。大多数网站禁止您将数据用于商业目的。 2. 确保您没有以过快的速度下载数据,因为这可能导致网站崩溃,您也可能被阻止访问该网络。

检查网站

我们需要做的第一件事是弄清楚如何从多级HTML标记中找到我们想要下载的文件的链接。简而言之,网站页面有大量代码,我们希望找到包含我们需要数据的相关代码片段。如果你不熟悉HTML标记,请参阅W3schools教程。为了成功进行网页抓取,了解HTML的基础知识很重要。 在网页上单击右键,并点击”检查”,这允许您查看该站点的原始代码。

点击”检查”后,您应该会看到此控制台弹出。

控制台

请注意,在控制台的左上角有一个箭头符号。

如果单击此箭头然后点击网站本身的某个区域,则控制台将高亮显示该特定项目的代码。我点击了第一个数据文件,即2018年9月22日星期六,控制台高亮了该特定文件的链接。

<a href=”data/nyct/turnstile/turnstile_180922.txt”>Saturday, September 22, 2018</a>

请注意,所有的.txt文件都在

上一行的标记之内。当你做了更多的网页抓取后,你会发现

用于超链接。

现在我们已经确定了链接的位置,让我们开始编程吧!

Python代码

我们首先导入以下库。

import requests
import urllib.request
import time
from bs4 import BeautifulSoup

接下来,我们将url设置为目标网站,并使用我们的请求库访问该站点。

url = ‘
response = requests.get(url)

如果访问成功,您应该能看到以下输出:

接下来,我们使用html嵌套数据结构。如果您有兴趣了解有关此库的更多信息,请查看BeautifulSoup文档。

soup = BeautifulSoup(response.text, “html.parser”)

我们使用方法.findAll来定位我们所有的

<a>

标记。

soup.findAll('a')

这段代码为我们找到了了所有含有

<a>

标记的代码段。我们感兴趣的信息从第36行开始。并非所有的链接都是我们想要的,但大部分是,所以我们可以轻松地从第36行分开。以下是当我们输入上述代码后BeautifulSoup返回给我们的部分信息。

所有<a>标记的子集

接下来,让我们提取我们想要的实际链接。先测试第一个链接。

one_a_tag = soup.findAll(‘a’)[36]
link = one_a_tag[‘href’]

此代码将'data/nyct/turnstile/turnstile_le_180922.txt保存到我们的变量链接中。 下载数据的完整网址实际上是 “http://web.mta.info/developers/data/nyct/turnstile/turnstile_180922.txt”,我通过点击网站上的第一个数据文件作为测试发现了这一点。我们可以使用urllib.request库将此文库将此文件路径下载到我们的计算机。 我们给request.urlretrieve提供ve提供两个参数:文件url和文件名。对于我的文件,我将它们命名为“turnstile_le_180922.txt”,“t”,“turnstile_180901”等。

download_url = ‘http://web.mta.info/developers/'+ link
urllib.request.urlretrieve(download_url,’./’+link[link.find(‘/turnstile_’)+1:])

最后但同样重要的是,我们应该包含以下一行代码,以便我们可以暂停代码运行一秒钟,这样我们就不会通过请求向网站发送垃圾邮件,这有助于我们避免被标记为垃圾邮件发送者。

time.sleep(1)

现在我们已经了解了如何下载文件,让我们尝试使用网站抓取旋转栅门数据的全套代码。

# Import libraries
import requests
import urllib.request
import time
from bs4 import BeautifulSoup

# Set the URL you want to webscrape from
url = 'http://web.mta.info/developers/turnstile.html'

# Connect to the URL
response = requests.get(url)

# Parse HTML and save to BeautifulSoup object¶
soup = BeautifulSoup(response.text, "html.parser")

# To download the whole data set, let's do a for loop through all a tags
for i in range(36,len(soup.findAll('a'))+1): #'a' tags are for links
    one_a_tag = soup.findAll('a')[i]
    link = one_a_tag['href']
    download_url = 'http://web.mta.info/developers/'+ link
    urllib.request.urlretrieve(download_url,'./'+link[link.find('/turnstile_')+1:]) 
    time.sleep(1) #pause the code for a sec

你可以在我的Github上找到我的Jupyter笔记。感谢阅读,如果您喜欢这篇文章,请尽量多多点击Clap按钮。

祝你网页抓取的开心!

本文分享自微信公众号 - AI研习社(okweiwu)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 今天是1024程序员节 请对身边可爱的程序员们好一点

    提起“1024”,很多朋友会想起不可描述的某著名网站。但其实,10月24日是属于程序员们的共同节日,以节日向改变世界、固执地坚持对于知识、技术和创新不断追求的程...

    三哥
  • 用Python爬下十几万本小说,再也不会闹书荒!

    自从看了师傅爬了顶点全站之后,我也手痒痒的,也想爬一个比较牛逼的小说网看看,于是选了宜搜这个网站,好了,马上开干,这次用的是mogodb数据库,感觉mysql太...

    小小科
  • web统计原理及实现方法汇总总结—网站统计中的数据收集

    在php、jsp、asp后端总揽一切的时代,网站统计基本是后台的事情——其实web开发,也没有前端这个职位,网站设计(现在的UI)不仅要前途还要用dreamwa...

    周陆军
  • 迷人又诡异的辛普森悖论:同一个数据集是如何证明两个完全相反的观点的?

    在辛普森悖论中,餐馆可以同时比竞争对手更好或更差,锻炼可以降低和增加疾病的风险,同样的数据集能够用于证明两个完全相反的论点。

    大数据文摘
  • 2019年苹果商店上架app费用及所需资料资质等详细教程

    作为一名iOSer,把开发出来的App上传到App Store是必要的。下面就来详细讲解一下具体流程步骤。

    jiang chen
  • 个人觉得腾讯云还是不错的

    dodott
  • 【实践】如何获得Rinkeby网络的测试以太币

    当把智能合约部署到Rinkeby Test Network时,需要获得测试以太币。其网络获取测试以太币的方法同Ropsten Test Network有些不同,...

    辉哥
  • 使用 cURL 测量网站响应时间

    内容整理自:https://blog.cloudflare.com/a-question-of-timing/,其中还有 chrome 的测量方式,有兴趣的朋友...

    dys
  • elasticsearch文档操作

    上篇文章向读者介绍了Elasticsearch中修改数据的操作,使用了Elasticsearch提供的一整套强大的REST API,本文继续来看通过这一套API...

    江南一点雨

扫码关注云+社区

领取腾讯云代金券