日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

从网页中读取数据 python_数据分析硬核技能:用 Python 爬取网页

發(fā)布時(shí)間:2024/10/14 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从网页中读取数据 python_数据分析硬核技能:用 Python 爬取网页 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我作為數(shù)據(jù)科學(xué)家的第一個(gè)任務(wù),就是做網(wǎng)頁爬取。那時(shí)候,我對使用代碼從網(wǎng)站上獲取數(shù)據(jù)這項(xiàng)技術(shù)完全一無所知,它偏偏又是最有邏輯性并且最容易獲得的數(shù)據(jù)來源。在幾次嘗試之后,網(wǎng)頁爬取對我來說就幾乎是種本能行為了。如今,它更成為了我?guī)缀趺刻於家玫降纳贁?shù)幾個(gè)技術(shù)之一。

在今天的文章中,我將會用幾個(gè)簡單的例子,向大家展示如何爬取一個(gè)網(wǎng)站——比如從?Fast Track?上獲取 2018 年 100 強(qiáng)企業(yè)的信息。用腳本將獲取信息的過程自動化,不但能節(jié)省手動整理的時(shí)間,還能將所有企業(yè)數(shù)據(jù)整理在一個(gè)結(jié)構(gòu)化的文件里,方便進(jìn)一步分析查詢。

太長不看版:如果你只是想要一個(gè)最基本的 Python 爬蟲程序的示例代碼,本文中所用到的全部代碼都放在?GitHub?(https://github.com/kaparker/tutorials/blob/master/pythonscraper/websitescrapefasttrack.py),歡迎自取。

準(zhǔn)備工作

每一次打算用 Python 搞點(diǎn)什么的時(shí)候,你問的第一個(gè)問題應(yīng)該是:“我需要用到什么庫”。

網(wǎng)頁爬取方面,有好幾個(gè)不同的庫可以用,包括:

  • Beautiful Soup

  • Requests

  • Scrapy

  • Selenium

今天我們打算用 Beautiful Soup 庫。你只需要用?pip(Python包管理工具)就能很方便地將它裝到電腦上:

安裝完畢之后,我們就可以開始啦!

檢查網(wǎng)頁

為了明確要抓取網(wǎng)頁中的什么元素,你需要先檢查一下網(wǎng)頁的結(jié)構(gòu)。

以?Tech Track 100強(qiáng)企業(yè)(https://link.zhihu.com/?target=http%3A//www.fasttrack.co.uk/league-tables/tech-track-100/league-table/)?這個(gè)頁面為例,你在表格上點(diǎn)右鍵,選擇“檢查”。在彈出的“開發(fā)者工具”中,我們就能看到頁面中的每個(gè)元素,以及其中包含的內(nèi)容。

右鍵點(diǎn)擊你想要查看的網(wǎng)頁元素,選擇“檢查”,就能看到具體的 HTML 元素內(nèi)容

既然數(shù)據(jù)都保存在表格里,那么只需要簡單的幾行代碼就能直接獲取到完整信息。如果你希望自己練習(xí)爬網(wǎng)頁內(nèi)容,這就是一個(gè)挺不錯(cuò)的范例。但請記住,實(shí)際情況往往不會這么簡單。

這個(gè)例子里,所有的100個(gè)結(jié)果都包含在同一個(gè)頁面中,還被??標(biāo)簽分隔成行。但實(shí)際抓取過程中,許多數(shù)據(jù)往往分布在多個(gè)不同的頁面上,你需要調(diào)整每頁顯示的結(jié)果總數(shù),或者遍歷所有的頁面,才能抓取到完整的數(shù)據(jù)。

在表格頁面上,你可以看到一個(gè)包含了所有100條數(shù)據(jù)的表格,右鍵點(diǎn)擊它,選擇“檢查”,你就能很容易地看到這個(gè) HTML 表格的結(jié)構(gòu)。包含內(nèi)容的表格本體是在這樣的標(biāo)簽里:

每一行都是在一個(gè)??標(biāo)簽里,也就是我們不需要太復(fù)雜的代碼,只需要一個(gè)循環(huán),就能讀取到所有的表格數(shù)據(jù),并保存到文件里。

附注:你還可以通過檢查當(dāng)前頁面是否發(fā)送了 HTTP GET 請求,并獲取這個(gè)請求的返回值,來獲取顯示在頁面上的信息。因?yàn)?HTTP GET 請求經(jīng)常能返回已經(jīng)結(jié)構(gòu)化的數(shù)據(jù),比如 JSON 或者 XML 格式的數(shù)據(jù),方便后續(xù)處理。你可以在開發(fā)者工具里點(diǎn)擊 Network 分類(有必要的話可以僅查看其中的 XHR 標(biāo)簽的內(nèi)容)。這時(shí)你可以刷新一下頁面,于是所有在頁面上載入的請求和返回的內(nèi)容都會在 Network 中列出。此外,你還可以用某種 REST 客戶端(比如?Insomnia)來發(fā)起請求,并輸出返回值。刷新頁面后,Network 標(biāo)簽頁的內(nèi)容更新了

用 Beautiful Soup 庫處理網(wǎng)頁的 HTML 內(nèi)容

在熟悉了網(wǎng)頁的結(jié)構(gòu),了解了需要抓取的內(nèi)容之后,我們終于要拿起代碼開工啦~

首先要做的是導(dǎo)入代碼中需要用到的各種模塊。上面我們已經(jīng)提到過?BeautifulSoup,這個(gè)模塊可以幫我們處理 HTML 結(jié)構(gòu)。接下來要導(dǎo)入的模塊還有?urllib,它負(fù)責(zé)連接到目標(biāo)地址,并獲取網(wǎng)頁內(nèi)容。最后,我們需要能把數(shù)據(jù)寫入 CSV 文件,保存在本地硬盤上的功能,所以我們要導(dǎo)入?csv庫。當(dāng)然這不是唯一的選擇,如果你想要把數(shù)據(jù)保存成 json 文件,那相應(yīng)的就需要導(dǎo)入?json?庫。

下一步我們需要準(zhǔn)備好需要爬取的目標(biāo)網(wǎng)址。正如上面討論過的,這個(gè)網(wǎng)頁上已經(jīng)包含了所有我們需要的內(nèi)容,所以我們只需要把完整的網(wǎng)址復(fù)制下來,賦值給變量就行了:

接下來,我們就可以用?urllib?連上這個(gè)URL,把內(nèi)容保存在?page?變量里,然后用 BeautifulSoup 來處理頁面,把處理結(jié)果存在?soup?變量里:

這時(shí)候,你可以試著把?soup?變量打印出來,看看里面已經(jīng)處理過的 html 數(shù)據(jù)長什么樣:

如果變量內(nèi)容是空的,或者返回了什么錯(cuò)誤信息,則說明可能沒有正確獲取到網(wǎng)頁數(shù)據(jù)。你也許需要用一些錯(cuò)誤捕獲代碼,配合?urllib.error?(https://docs.python.org/3/library/urllib.error.html)模塊,來發(fā)現(xiàn)可能存在的問題。

查找 HTML 元素

既然所有的內(nèi)容都在表格里(

?標(biāo)簽),我們可以在?soup?對象里搜索需要的表格,然后再用?find_all?方法,遍歷表格中的每一行數(shù)據(jù)。

如果你試著打印出所有的行,那應(yīng)該會有 101 行 —— 100 行內(nèi)容,加上一行表頭。

看看打印出來的內(nèi)容,如果沒問題的話,我們就可以用一個(gè)循環(huán)來獲取所有數(shù)據(jù)啦。

如果你打印出 soup 對象的前 2 行,你可以看到,每一行的結(jié)構(gòu)是這樣的:

可以看到,表格中總共有 8 列,分別是 Rank(排名)、Company(公司)、Location(地址)、Year End(財(cái)年結(jié)束)、Annual Sales Rise(年度銷售增長)、Latest Sales(本年度銷售額)、Staff(員工數(shù))和 Comments(備注)。

這些都是我們所需要的數(shù)據(jù)。

這樣的結(jié)構(gòu)在整個(gè)網(wǎng)頁中都保持一致(不過在其他網(wǎng)站上可能就沒這么簡單了!),所以我們可以再次使用?find_all?方法,通過搜索??元素,逐行提取出數(shù)據(jù),存儲在變量中,方便之后寫入 csv 或 json 文件。

循環(huán)遍歷所有的元素并存儲在變量中

在 Python 里,如果要處理大量數(shù)據(jù),還需要寫入文件,那列表對象是很有用的。我們可以先聲明一個(gè)空列表,填入最初的表頭(方便以后CSV文件使用),而之后的數(shù)據(jù)只需要調(diào)用列表對象的?append?方法即可。

這樣就將打印出我們剛剛加到列表對象?rows?中的第一行表頭。

你可能會注意到,我輸入的表頭中比網(wǎng)頁上的表格多寫了幾個(gè)列名,比如?Webpage(網(wǎng)頁)和?Description(描述),請仔細(xì)看看上面打印出的 soup 變量數(shù)據(jù)——第二行第二列的數(shù)據(jù)里,可不只有公司名字,還有公司的網(wǎng)址和簡單描述。所以我們需要這些額外的列來存儲這些數(shù)據(jù)。

下一步,我們遍歷所有100行數(shù)據(jù),提取內(nèi)容,并保存到列表中。

循環(huán)讀取數(shù)據(jù)的方法:

因?yàn)閿?shù)據(jù)的第一行是 html 表格的表頭,所以我們可以跳過不用讀取它。因?yàn)楸眍^用的是??標(biāo)簽,沒有用??標(biāo)簽,所以我們只要簡單地查詢?標(biāo)簽內(nèi)的數(shù)據(jù),并且拋棄空值即可。

接著,我們將 data 的內(nèi)容讀取出來,賦值到變量中:

如上面的代碼所示,我們按順序?qū)?8 個(gè)列里的內(nèi)容,存儲到 8 個(gè)變量中。當(dāng)然,有些數(shù)據(jù)的內(nèi)容還需有額外的清理,去除多余的字符,導(dǎo)出所需的數(shù)據(jù)。

數(shù)據(jù)清理

如果我們打印出?company?變量的內(nèi)容,就能發(fā)現(xiàn),它不但包含了公司名稱,還包括和描述。如果我們打印出?sales?變量的內(nèi)容,就能發(fā)現(xiàn)它還包括一些備注符號等需要清除的字符。

我們希望把?company?變量的內(nèi)容分割成公司名稱和描述兩部分。這用幾行代碼就能搞定。再看看對應(yīng)的 html 代碼,你會發(fā)現(xiàn)這個(gè)單元格里還有一個(gè)??元素,這個(gè)元素里只有公司名稱。另外,還有一個(gè)??鏈接元素,包含一個(gè)指向該公司詳情頁面的鏈接。我們一會也會用到它!

為了區(qū)分公司名稱和描述兩個(gè)字段,我們再用?find?方法把??元素里的內(nèi)容讀取出來,然后刪掉或替換?company?變量中的對應(yīng)內(nèi)容,這樣變量里就只會留下描述了。

要?jiǎng)h除?sales?變量中的多余字符,我們用一次?strip?方法即可。

最后我們要保存的是公司網(wǎng)站的鏈接。就像上面說的,第二列中有一個(gè)指向該公司詳情頁面的鏈接。每一個(gè)公司的詳情頁都有一個(gè)表格,大部分情況下,表格里都有一個(gè)公司網(wǎng)站的鏈接。

檢查公司詳情頁里,表格中的鏈接

為了抓取每個(gè)表格中的網(wǎng)址,并保存到變量里,我們需要執(zhí)行以下幾個(gè)步驟:

在最初的 fast track 網(wǎng)頁上,找到需要訪問的公司詳情頁的鏈接。

發(fā)起一個(gè)對公司詳情頁鏈接的請求

用 Beautifulsoup 處理一下獲得的 html 數(shù)據(jù)

找到需要的鏈接元素

正如上面的截圖那樣,看過幾個(gè)公司詳情頁之后,你就會發(fā)現(xiàn),公司的網(wǎng)址基本上就在表格的最后一行。所以我們可以在表格的最后一行里找??元素。

同樣,有可能出現(xiàn)最后一行沒有鏈接的情況。所以我們增加了?try... except?語句,如果沒有發(fā)現(xiàn)網(wǎng)址,則將變量設(shè)置成?None。當(dāng)我們把所有需要的數(shù)據(jù)都存在變量中的以后(還在循環(huán)體內(nèi)部),我們可以把所有變量整合成一個(gè)列表,再把這個(gè)列表?append?到上面我們初始化的 rows 對象的末尾。

上面代碼的最后,我們在結(jié)束循環(huán)體之后打印了一下 rows 的內(nèi)容,這樣你可以在把數(shù)據(jù)寫入文件前,再檢查一下。

寫入外部文件

最后,我們把上面獲取的數(shù)據(jù)寫入外部文件,方便之后的分析處理。在 Python 里,我們只需要簡單的幾行代碼,就可以把列表對象保存成文件。

最后我們來運(yùn)行一下這個(gè) python 代碼,如果一切順利,你就會發(fā)現(xiàn)一個(gè)包含了 100 行數(shù)據(jù)的 csv 文件出現(xiàn)在了目錄中,你可以很容易地用 python 讀取和處理它。

總結(jié)

這篇簡單的 Python 教程中,我們一共采取了下面幾個(gè)步驟,來爬取網(wǎng)頁內(nèi)容:

連接并獲取一個(gè)網(wǎng)頁的內(nèi)容

用 BeautifulSoup 處理獲得的 html 數(shù)據(jù)

在 soup 對象里循環(huán)搜索需要的 html 元素

進(jìn)行簡單的數(shù)據(jù)清理

把數(shù)據(jù)寫入 csv 文件中

如果有什么沒說清楚的,歡迎大家在下面留言,我會盡可能給大家解答的!

附:?本文全部代碼(https://github.com/kaparker/tutorials/blob/master/pythonscraper/websitescrapefasttrack.py)

祝你的爬蟲之旅有一個(gè)美好的開始!

原作:?Kerry Parker?編譯:歐剃 轉(zhuǎn)載請保留此信息)

編譯來源:?towardsdatascience.com

如果你也想零基礎(chǔ)學(xué)習(xí) Python,并且完成你的第一個(gè)爬蟲項(xiàng)目,那么優(yōu)達(dá)新課《28天入門Python》很適合你,你將

前 Google 工程師親授課程

Python 入門要點(diǎn)講解

12 個(gè)隨堂實(shí)戰(zhàn)演練

從 0 到 1 完成第一個(gè)爬蟲

原價(jià)499元,嘗鮮價(jià)僅需299元,席位不多,立即加入

想要學(xué)習(xí)和了解硅谷企業(yè)內(nèi)部的數(shù)據(jù)分析資料?優(yōu)達(dá)學(xué)城【數(shù)據(jù)分析師】納米學(xué)位帶你成功求職轉(zhuǎn)行,成為優(yōu)秀數(shù)據(jù)分析師,點(diǎn)擊,立即了解詳情。

總結(jié)

以上是生活随笔為你收集整理的从网页中读取数据 python_数据分析硬核技能:用 Python 爬取网页的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 啊v视频在线观看 | 亚洲特黄 | 国产在线视频99 | 成年人激情视频 | 中国一级黄色大片 | 欧美一级不卡视频 | 国产精品卡一卡二 | 亚洲av无码国产精品色午夜 | 一级视频在线免费观看 | 欧美一区二区三区免 | 一级黄色毛毛片 | 久色影视| 自拍欧美亚洲 | 中文字幕mv | 国产精品色视频 | 男插女动态图 | 就爱av| 一级黄色片大全 | 爱爱一区二区三区 | 在线成人播放 | 亚洲一区二区三区香蕉 | 国产一级一片 | 一本色道久久亚洲综合精品蜜桃 | 男人天堂网在线观看 | 国产对白自拍 | 日韩精品一区二区三区色欲av | 涩涩精品| 久久人人视频 | 好吊妞这里只有精品 | 深夜视频在线免费 | 亚洲色图另类图片 | 免费大片在线观看www | 亚洲综合在线一区 | 亚欧洲精品在线视频免费观看 | 日韩三级黄 | 女同性做爰全过程 | 欧美aaaa视频 | 看一级黄色大片 | 一级黄色片免费在线观看 | 泽村玲子在线 | 999www | 九九福利| 久久无码人妻精品一区二区三区 | 欧美高清在线一区 | 亚洲精品电影在线观看 | 欧美xxxx视频 | 欧美视频你懂的 | 亚洲精品久久夜色撩人男男小说 | 成人激情免费视频 | 韩国三级视频 | 成年人久久 | 国产免费av一区二区三区 | 在线天堂av | 91一级视频| 麻豆传媒一区二区三区 | 天天干天天舔天天操 | wwwxxx日本人 | 少妇流白浆 | 精品96久久久久久中文字幕无 | 最新国产网址 | 亚洲成人av一区二区 | 欧美成人精品网站 | 日本特黄一级 | 成品人视频ww入口 | 免费在线黄色网 | 九九色九九 | 国产精品3p视频 | 久久看看| 午夜精品毛片 | 日韩和的一区二区 | 欧美另类一区 | 小妹色播 | 精品国产黄色 | 日本美女一区二区 | 顶级尤物极品女神福利视频 | 一区二区欧美视频 | 精品一二三| 精品久久久久一区二区 | 黄色国产视频网站 | 久久国产精品免费观看 | 天天碰天天摸 | 男人插女人免费视频 | 18禁超污无遮挡无码免费游戏 | 91福利在线导航 | 色美av| 激情六月色 | 一区二区三区四区五区av | 亚洲精品无人区 | 亚洲啊啊啊啊啊 | 欧美大黄 | 精品人妻无码一区二区三 | 亚洲aⅴ乱码精品成人区 | 日韩天堂 | 久操欧美 | 不卡在线播放 | 精品视频91| 九九热国产视频 | 成人高潮片免费视频 | 一级少妇女片 |