【问题标题】:How to do web scraping in Python?如何在 Python 中进行网页抓取?
【发布时间】:2020-08-25 15:01:30
【问题描述】:

我想抓取特定的财务网络。但在我的一生中,我都是这样做的。我不懂 HTML,所以对我来说很难。我想学习,因为我需要一个例子来开始网络抓取很多表格。 该网络是智利的一个机构,名为“Comisión para el Mercado financiero”。网址为:“http://www.cmfchile.cl/institucional/inc/valores_cuota/valor_serie.php?v1=C1KB5&v2=LPKA0ISQAKEHITB64IBM&v3=4ABCIV864AJ35MN64IBM&v4=V864A4ABCI&v5=J35MNS8IYM&v6=4ABCIV864A4ABCIV864A&v7=V864AISQAK&v8=V864A64IBM&v9=37G70LN68AGLD87IEAIXGLD87OL18863409LN68AOL188JKT99QHFLBMLXL410163LN68A&v10=21QYE48BCX99KWAEF88BWM6YB&v11=63409LN68AGLD8737GH0J35MN&v12=63409LN68AGLD8737GH04ABCI

谁能告诉我该怎么做?我知道我可以使用 BeautifulSoup 和 requests 模块,但仅此而已。如果有一本关于 Python 网络抓取的书,将会非常有帮助。

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    正如您正确提到的那样,这是“Web Scraping”,python 有同样的惊人模块。在我们进一步进行之前,了解技术细节对我们来说很重要。

    最常用的模块之一是 -> BeautifulSoup

    所以,要从任何网页获取信息,

    • 您需要先了解网页的结构。
    • 此外,在某些情况下,考虑到我们出于其他原因进一步使用网页中的此信息,这可能不完全合法。
    • 更大的挑战是,网页是否支持抓取?这对进一步进行更为重要。
      • 如何找到它?这可以通过查看网页的来源来弄清楚。
      • 如果您要抓取的文本/信息在源代码或其中一个 href 中可见,那么应该可以使用 Beautifulsoup 抓取它。

    解决方案-

    • 在找到解决方案之前,您必须了解 HTML 结构以及识别网页上任何元素的方式
    • 有很多方法,比如

      • 使用网页上任何元素的“id”
      • 直接使用类或标记名
      • 使用元素的 xpath
      • 或者也可以是上述任何或所有的组合
    • 一旦你达到这一点,现在你必须清楚我们将继续前进的方式

    #make a request to the webpage, and grab the html respone
    page = requests.get("your url here").content
    
    #pass it on to beautifulsoup 
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(page.content, 'html.parser')
    
    #Depending on how you want to find, you can use  findbyclass, findbytag, and #other methods 
    soup.findAll('your tag')
    

    【讨论】:

      【解决方案2】:
      import requests
      import pandas as pd
      
      headers = {
          'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0'
      }
      
      
      def main(url):
          r = requests.get(url, headers=headers)
          df = pd.read_html(r.content)[0]
          print(df)
      
      
      main("http://www.cmfchile.cl/institucional/inc/valores_cuota/valor_serie.php?v1=C1KB5&v2=LPKA0ISQAKEHITB64IBM&v3=4ABCIV864AJ35MN64IBM&v4=V864A4ABCI&v5=J35MNS8IYM&v6=4ABCIV864A4ABCIV864A&v7=V864AISQAK&v8=V864A64IBM&v9=37G70LN68AGLD87IEAIXGLD87OL18863409LN68AOL188JKT99QHFLBMLXL410163LN68A&v10=21QYE48BCX99KWAEF88BWM6YB&v11=63409LN68AGLD8737GH0J35MN&v12=63409LN68AGLD8737GH04ABCI")
      

      【讨论】:

        【解决方案3】:

        完整的工作代码。您必须等待很长时间(大约 10 分钟或更短时间)才能获得结果。所以请在完成后回复

        由于您的链接包含动态数据,因此加载数据需要时间。美丽的汤有一些超时,因为它说没有响应。最好在此处使用 selenium,因为它会等待页面完全加载。

        在尝试了数百种获取数据的方法后,这是最终的解决方案。

        from selenium import webdriver
        rows = []
        driver= webdriver.Chrome('P:/selenium/driver/chromedriver.exe')
        driver.get('YOUR LINK HERE')
        data = driver.find_elements_by_xpath('//*[@id="main"]/div/div[2]/table/tbody/tr')
        for i in range(len(data)):
            if(i==1): # Because 1st row contains irrelevant data
                pass
            else:
                rows.append(data[i].text.split(" "))
        print(rows)
        

        【讨论】:

        • 你好谢哈尔。我对你的回答更了解。感谢那。但是table 会产生一个空对象。你知道为什么?谢谢!
        • @scalamardo 检查下面的答案。
        • @scalamardo 检查更新的答案。它工作正常。如果您遇到任何其他问题,请告诉我。您的数据包含 817 行。要检查它是否有效,请将“for i in range(len(data)):”更改为“for i in range(len(data)-800):”。这将打印一个想法的前 17 行。您可以删除它并等待很长时间才能获得整个结果。
        猜你喜欢
        • 2015-04-23
        • 1970-01-01
        • 2011-10-21
        • 1970-01-01
        • 2018-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多