查看: 2251|回复: 0

如何在4分钟内搞定用Python爬取网页信息

[复制链接]
  • TA的每日心情

    2018-11-20 13:41
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2018-10-25 17:15:04 | 显示全部楼层 |阅读模式
    分享到:
    1.png

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

    New York MTA 数据
    我们将从这个网站下载有关纽约公共交通地铁站旋转门的数据:
    http://web.mta.info/developers/turnstile.html

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


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

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


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

    在网页上单击右键,并点击”检查”,这允许您查看该站点的原始代码。


    3.png

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

    控制台

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

    5.png

    如果单击此箭头然后点击网站本身的某个区域,则控制台将高亮显示该特定项目的代码。我点击了第一个数据文件,即2018年9月22日星期六,控制台高亮了该特定文件的链接。
    1. <a href=”data/nyct/turnstile/turnstile_180922.txt”>Saturday, September 22, 2018</a>
    复制代码


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

    上一行的标记之内。当你做了更多的网页抓取后,你会发现
    <a>
    用于超链接。

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


    Python代码
    我们首先导入以下库。

    1. import requests
    2. import urllib.request
    3. import time
    4. from bs4 import BeautifulSoup
    复制代码


    接下来,我们将url设置为目标网站,并使用我们的请求库访问该站点。
    1. url = ‘
    2. response = requests.get(url)
    复制代码


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

    接下来,我们使用BeautifulSoup解析html,以便我们得到更清晰的BeautifulSoup嵌套数据结构。如果您有兴趣了解有关此库的更多信息,请查看BeautifulSoup文档
    1. soup = BeautifulSoup(response.text, “html.parser”)
    复制代码


    我们使用方法.findAll来定位我们所有的
    <a>
    标记。

    1. soup.findAll('a')
    复制代码
    这段代码为我们找到了了所有含有
    <a>
    标记的代码段。我们感兴趣的信息从第36行开始。并非所有的链接都是我们想要的,但大部分是,所以我们可以轻松地从第36行分开。以下是当我们输入上述代码后BeautifulSoup返回给我们的部分信息。

    7.png

    所有<a>标记的子集

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

    1. one_a_tag = soup.findAll(‘a’)[36]
    2. link = one_a_tag[‘href’]
    复制代码


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


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


    现在我们已经了解了如何下载文件,让我们尝试使用for循环下载整个数据文件集。下面的代码包含了从NY MTA网站抓取旋转栅门数据的全套代码。
    1. # Import libraries
    2. import requests
    3. import urllib.request
    4. import time
    5. from bs4 import BeautifulSoup

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

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

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

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


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













    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-27 04:02 , Processed in 0.114763 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.