Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 91热成人精品国产免费,www亚洲色图,欧美专区在线

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          手把手教你用Python進(jìn)行Web抓取(附代碼)

          者:Kerry Parker

          翻譯:田曉寧

          校對(duì):丁楠雅

          本文約2900字,建議閱讀10分鐘。

          本教程以在Fast Track上收集百?gòu)?qiáng)公司的數(shù)據(jù)為例,教你抓取網(wǎng)頁(yè)信息。



          作為一名數(shù)據(jù)科學(xué)家,我在工作中所做的第一件事就是網(wǎng)絡(luò)數(shù)據(jù)采集。使用代碼從網(wǎng)站收集數(shù)據(jù),當(dāng)時(shí)對(duì)我來(lái)說(shuō)是一個(gè)完全陌生的概念,但它是最合理、最容易獲取的數(shù)據(jù)來(lái)源之一。經(jīng)過幾次嘗試,網(wǎng)絡(luò)抓取已經(jīng)成為我的第二天性,也是我?guī)缀趺刻焓褂玫募寄苤弧?/p>

          在本教程中,我將介紹一個(gè)簡(jiǎn)單的例子,說(shuō)明如何抓取一個(gè)網(wǎng)站,我將從Fast Track上收集2018年百?gòu)?qiáng)公司的數(shù)據(jù):

          Fast Track:http://www.fasttrack.co.uk/

          使用網(wǎng)絡(luò)爬蟲將此過程自動(dòng)化,避免了手工收集數(shù)據(jù),節(jié)省了時(shí)間,還可以讓所有數(shù)據(jù)都放在一個(gè)結(jié)構(gòu)化文件中。

          用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲的快速示例,您可以在GitHub上找到本教程中所介紹的完整代碼。

          GitHub鏈接:https://github.com/kaparker/tutorials/blob/master/pythonscraper/websitescrapefasttrack.py

          以下是本文使用Python進(jìn)行網(wǎng)頁(yè)抓取的簡(jiǎn)短教程概述:

          • 連接到網(wǎng)頁(yè)
          • 使用BeautifulSoup解析html
          • 循環(huán)通過soup對(duì)象找到元素
          • 執(zhí)行一些簡(jiǎn)單的數(shù)據(jù)清理
          • 將數(shù)據(jù)寫入csv

          準(zhǔn)備開始

          在開始使用任何Python應(yīng)用程序之前,要問的第一個(gè)問題是:我需要哪些庫(kù)?

          對(duì)于web抓取,有一些不同的庫(kù)需要考慮,包括:

          • Beautiful Soup
          • Requests
          • Scrapy
          • Selenium

          在本例中我們使用Beautiful Soup。你可以使用Python包管理器 pip 安裝Beautiful Soup:

          pip install BeautifulSoup4

          安裝好這些庫(kù)之后,讓我們開始吧!

          檢查網(wǎng)頁(yè)

          要知道在Python代碼中需要定位哪些元素,首先需要檢查網(wǎng)頁(yè)。

          要從Tech Track Top 100 companies收集數(shù)據(jù),可以通過右鍵單擊感興趣的元素來(lái)檢查頁(yè)面,然后選擇檢查。這將打開HTML代碼,我們可以在其中看到每個(gè)字段包含在其中的元素。

          Tech Track Top 100 companies鏈接:http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/




          右鍵單擊感興趣的元素并選擇“Inspect”,顯示html元素。

          由于數(shù)據(jù)存儲(chǔ)在一個(gè)表中,因此只需幾行代碼就可以直接獲取數(shù)據(jù)。如果您想練習(xí)抓取網(wǎng)站,這是一個(gè)很好的例子,也是一個(gè)好的開始,但請(qǐng)記住,它并不總是那么簡(jiǎn)單!

          所有100個(gè)結(jié)果都包含在<tr> 元素的行中,并且這些在一頁(yè)上都可見。情況并非總是如此,當(dāng)結(jié)果跨越多個(gè)頁(yè)面時(shí),您可能需要更改網(wǎng)頁(yè)上顯示的結(jié)果數(shù)量,或者遍歷所有頁(yè)面以收集所有信息。

          League Table網(wǎng)頁(yè)上顯示了包含100個(gè)結(jié)果的表。檢查頁(yè)面時(shí),很容易在html中看到一個(gè)模式。結(jié)果包含在表格中的行中:

          <table class="tableSorter">

          重復(fù)的行<tr> 將通過在Python中使用循環(huán)來(lái)查找數(shù)據(jù)并寫入文件來(lái)保持我們的代碼最小化!

          附注:可以做的另一項(xiàng)檢查是網(wǎng)站上是否發(fā)出了HTTP GET請(qǐng)求,該請(qǐng)求可能已經(jīng)將結(jié)果作為結(jié)構(gòu)化響應(yīng)(如JSON或XML格式)返回。您可以在檢查工具的網(wǎng)絡(luò)選項(xiàng)卡中進(jìn)行檢查,通常在XHR選項(xiàng)卡中進(jìn)行檢查。刷新頁(yè)面后,它將在加載時(shí)顯示請(qǐng)求,如果響應(yīng)包含格式化結(jié)構(gòu),則使用REST客戶端(如Insomnia)返回輸出通常更容易。



          刷新網(wǎng)頁(yè)后,頁(yè)面檢查工具的網(wǎng)絡(luò)選項(xiàng)卡

          使用Beautiful Soup解析網(wǎng)頁(yè)html

          現(xiàn)在您已經(jīng)查看了html的結(jié)構(gòu)并熟悉了將要抓取的內(nèi)容,是時(shí)候開始使用Python了!

          第一步是導(dǎo)入將用于網(wǎng)絡(luò)爬蟲的庫(kù)。我們已經(jīng)討論過上面的BeautifulSoup,它有助于我們處理html。我們導(dǎo)入的下一個(gè)庫(kù)是urllib,它連接到網(wǎng)頁(yè)。最后,我們將輸出寫入csv,因此我們還需要導(dǎo)入csv 庫(kù)。作為替代方案,可以在此處使用json庫(kù)。

          # import librariesfrom bs4 import BeautifulSoupimport urllib.requestimport csv

          下一步是定義您正在抓取的網(wǎng)址。如上一節(jié)所述,此網(wǎng)頁(yè)在一個(gè)頁(yè)面上顯示所有結(jié)果,因此此處給出了地址欄中的完整url:

          # specify the urlurlpage = 'http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/'

          然后我們建立與網(wǎng)頁(yè)的連接,我們可以使用BeautifulSoup解析html,將對(duì)象存儲(chǔ)在變量'soup'中:

          # query the website and return the html to the variable 'page'page = urllib.request.urlopen(urlpage)# parse the html using beautiful soup and store in variable 'soup'soup = BeautifulSoup(page, 'html.parser')

          我們可以在這個(gè)階段打印soup變量,它應(yīng)該返回我們請(qǐng)求網(wǎng)頁(yè)的完整解析的html。

          print(soup)

          如果存在錯(cuò)誤或變量為空,則請(qǐng)求可能不成功。可以使用urllib.error模塊在此時(shí)實(shí)現(xiàn)錯(cuò)誤處理。

          搜索html元素

          由于所有結(jié)果都包含在表中,我們可以使用find 方法搜索表的soup對(duì)象。然后我們可以使用find_all 方法查找表中的每一行。

          如果我們打印行數(shù),我們應(yīng)該得到101的結(jié)果,100行加上標(biāo)題。

          # find results within tabletable = soup.find('table', attrs={'class': 'tableSorter'})results = table.find_all('tr')print('Number of results', len(results))

          因此,我們可以對(duì)結(jié)果進(jìn)行循環(huán)以收集數(shù)據(jù)。

          打印soup對(duì)象的前兩行,我們可以看到每行的結(jié)構(gòu)是:

          <tr><th>Rank</th><th>Company</th><th class="">Location</th><th>Year end</th><th class="" style="text-align:right;">Annual sales rise over 3 years</th><th class="" style="text-align:right;">Latest sales £000s</th><th class="" style="text-align:right;">Staff</th><th class="">Comment</th><!-- <th>FYE</th>--></tr><tr><td>1</td><td><a ><span>Wonderbly</span></a>Personalised children's books</td><td>East London</td><td>Apr-17</td><td style="text-align:right;">294.27%</td><td style="text-align:right;">*25,860</td><td style="text-align:right;">80</td><td>Has sold nearly 3m customisable children’s books in 200 countries</td><!-- <td>Apr-17</td>--></tr>

          表格中有8欄:Rank,Company,Location,Year End,Annual Sales Rise,Latest Sales, Staff and Comments,所有這些都是我們可以保存的感興趣的數(shù)據(jù)。

          網(wǎng)頁(yè)的所有行的結(jié)構(gòu)都是一致的(對(duì)于所有網(wǎng)站來(lái)說(shuō)可能并非總是如此!)。因此,我們可以再次使用find_all 方法將每一列分配給一個(gè)變量,那么我們可以通過搜索<td> 元素來(lái)寫入csv或JSON。

          循環(huán)遍歷元素并保存變量

          在Python中,將結(jié)果附加到一個(gè)列表中是很有用的,然后將數(shù)據(jù)寫到一個(gè)文件中。我們應(yīng)該在循環(huán)之前聲明列表并設(shè)置csv的頭文件,如下所示:

          # create and write headers to a list rows = []rows.append(['Rank', 'Company Name', 'Webpage', 'Description', 'Location', 'Year end', 'Annual sales rise over 3 years', 'Sales £000s', 'Staff', 'Comments'])print(rows)

          這將打印出我們添加到包含標(biāo)題的列表的第一行。

          你可能會(huì)注意到表格中有一些額外的字段Webpage和Description不是列名,但是如果你仔細(xì)看看我們打印上面的soup變量時(shí)的html,那么第二行不僅僅包含公司名稱。我們可以使用一些進(jìn)一步的提取來(lái)獲取這些額外信息。

          下一步是循環(huán)結(jié)果,處理數(shù)據(jù)并附加到可以寫入csv的rows。

          在循環(huán)中查找結(jié)果:

          # loop over resultsfor result in results: # find all columns per result data = result.find_all('td') # check that columns have data if len(data) == 0: continue

          由于表中的第一行僅包含標(biāo)題,因此我們可以跳過此結(jié)果,如上所示。它也不包含任何<td>元素,因此在搜索元素時(shí),不會(huì)返回任何內(nèi)容。然后,我們可以通過要求數(shù)據(jù)的長(zhǎng)度為非零來(lái)檢查是否只處理包含數(shù)據(jù)的結(jié)果。

          然后我們可以開始處理數(shù)據(jù)并保存到變量中。

          # write columns to variables rank = data[0].getText() company = data[1].getText() location = data[2].getText() yearend = data[3].getText() salesrise = data[4].getText() sales = data[5].getText() staff = data[6].getText() comments = data[7].getText()

          以上只是從每個(gè)列獲取文本并保存到變量。但是,其中一些數(shù)據(jù)需要進(jìn)一步清理以刪除不需要的字符或提取更多信息。

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

          如果我們打印出變量company,該文本不僅包含公司名稱,還包含描述。我們?nèi)缓蟠蛴ales,它包含不需要的字符,如腳注符號(hào),最好刪除。

          print('Company is', company) # Company is WonderblyPersonalised children's books print('Sales', sales) # Sales *25,860

          我們希望將company 分為公司名稱和描述,我們可以用幾行代碼實(shí)現(xiàn)。再看一下html,對(duì)于這個(gè)列,有一個(gè) <span> 元素只包含公司名稱。此列中還有一個(gè)鏈接指向網(wǎng)站上的另一個(gè)頁(yè)面,其中包含有關(guān)該公司的更多詳細(xì)信息。我們將在稍后使用它!

          <td><a ><span>Wonderbly</span></a>Personalised children's books</td>

          要將company 分成兩個(gè)字段,我們可以使用find方法保存<span>元素,然后使用strip 或replace 從company 變量中刪除公司名稱,這樣它只留下描述。

          要從sales中刪除不需要的字符,我們可以再次使用strip和replace 方法!

          # extract description from the name companyname = data[1].find('span', attrs={'class':'company-name'}).getText() description = company.replace(companyname, '') # remove unwanted characters sales = sales.strip('*').strip('?').replace(',','')

          我們要保存的最后一個(gè)變量是公司網(wǎng)站。如上所述,第二列包含指向另一個(gè)頁(yè)面的鏈接,該頁(yè)面具有每個(gè)公司的概述。 每個(gè)公司頁(yè)面都有自己的表格,大部分時(shí)間都包含公司網(wǎng)站。



          檢查公司頁(yè)面上的url元素

          要從每個(gè)表中抓取url并將其保存為變量,我們需要使用與上面相同的步驟:

          • 在fast track網(wǎng)站上找到具有公司頁(yè)面網(wǎng)址的元素
          • 向每個(gè)公司頁(yè)面網(wǎng)址發(fā)出請(qǐng)求
          • 使用Beautifulsoup解析html
          • 找到感興趣的元素

          查看一些公司頁(yè)面,如上面的屏幕截圖所示,網(wǎng)址位于表格的最后一行,因此我們可以在最后一行內(nèi)搜索<a>元素。

          # go to link and extract company website url = data[1].find('a').get('href') page = urllib.request.urlopen(url) # parse the html soup = BeautifulSoup(page, 'html.parser') # find the last result in the table and get the link try: tableRow = soup.find('table').find_all('tr')[-1] webpage = tableRow.find('a').get('href') except: webpage = None

          也有可能出現(xiàn)公司網(wǎng)站未顯示的情況,因此我們可以使用try except條件,以防萬(wàn)一找不到網(wǎng)址。

          一旦我們將所有數(shù)據(jù)保存到變量中,我們可以在循環(huán)中將每個(gè)結(jié)果添加到列表rows。

          # write each result to rows rows.append([rank, company, webpage, description, location, yearend, salesrise, sales, staff, comments])print(rows)

          然后可以試著在循環(huán)外打印變量,在將其寫入文件之前檢查它是否符合您的預(yù)期!

          寫入輸出文件

          如果想保存此數(shù)據(jù)以進(jìn)行分析,可以用Python從我們列表中非常簡(jiǎn)單地實(shí)現(xiàn)。

          # Create csv and write rows to output filewith open('techtrack100.csv','w', newline='') as f_output: csv_output = csv.writer(f_output) csv_output.writerows(rows)

          運(yùn)行Python腳本時(shí),將生成包含100行結(jié)果的輸出文件,您可以更詳細(xì)地查看這些結(jié)果!

          尾語(yǔ)

          這是我的第一個(gè)教程,如果您有任何問題或意見或者不清楚的地方,請(qǐng)告訴我!

          • Web Development
          • https://towardsdatascience.com/tagged/web-development?source=post
          • Python
          • https://towardsdatascience.com/tagged/python?source=post
          • Web Scraping
          • https://towardsdatascience.com/tagged/web-scraping?source=post
          • Data Science
          • https://towardsdatascience.com/tagged/data-science?source=post
          • Programming
          • https://towardsdatascience.com/tagged/programming?source=post

          原文標(biāo)題:

          Data Science Skills: Web scraping using python

          原文鏈接:

          https://towardsdatascience.com/data-science-skills-web-scraping-using-python-d1a85ef607ed

          譯者簡(jiǎn)介

          田曉寧,質(zhì)量管理專家,國(guó)際認(rèn)證精益六西格瑪黑帶,19年從業(yè)經(jīng)驗(yàn);軟件工程專家,擁有CMMI ATM證書,曾主導(dǎo)公司通過CMMI 5級(jí)評(píng)估;精通ISO9000和ISO27000體系,長(zhǎng)期擔(dān)任公司質(zhì)量和信息安全主任審核員,每年審核超過50個(gè)項(xiàng)目或部門;擁有PMP證書,擔(dān)任公司項(xiàng)目管理內(nèi)訓(xùn)師,具有項(xiàng)目管理和系統(tǒng)開發(fā)實(shí)戰(zhàn)經(jīng)驗(yàn)。

          — 完 —

          關(guān)注清華-青島數(shù)據(jù)科學(xué)研究院官方微信公眾平臺(tái)“THU數(shù)據(jù)派”及姊妹號(hào)“數(shù)據(jù)派THU”獲取更多講座福利及優(yōu)質(zhì)內(nèi)容。

          教程以在Fast Track上收集百?gòu)?qiáng)公司的數(shù)據(jù)為例,教你抓取網(wǎng)頁(yè)信息。作者:Kerry Parker

          作為一名數(shù)據(jù)科學(xué)家,我在工作中所做的第一件事就是網(wǎng)絡(luò)數(shù)據(jù)采集。使用代碼從網(wǎng)站收集數(shù)據(jù),當(dāng)時(shí)對(duì)我來(lái)說(shuō)是一個(gè)完全陌生的概念,但它是最合理、最容易獲取的數(shù)據(jù)來(lái)源之一。經(jīng)過幾次嘗試,網(wǎng)絡(luò)抓取已經(jīng)成為我的第二天性,也是我?guī)缀趺刻焓褂玫募寄苤弧?/p>

          在本教程中,我將介紹一個(gè)簡(jiǎn)單的例子,說(shuō)明如何抓取一個(gè)網(wǎng)站,我將從Fast Track上收集2018年百?gòu)?qiáng)公司的數(shù)據(jù):

          Fast Track:http://www.fasttrack.co.uk/

          使用網(wǎng)絡(luò)爬蟲將此過程自動(dòng)化,避免了手工收集數(shù)據(jù),節(jié)省了時(shí)間,還可以讓所有數(shù)據(jù)都放在一個(gè)結(jié)構(gòu)化文件中。

          用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲的快速示例,您可以在GitHub上找到本教程中所介紹的完整代碼。

          GitHub鏈接:

          https://github.com/kaparker/tutorials/blob/master/pythonscraper/websitescrapefasttrack.py

          以下是本文使用Python進(jìn)行網(wǎng)頁(yè)抓取的簡(jiǎn)短教程概述:

          連接到網(wǎng)頁(yè)

          使用BeautifulSoup解析html

          循環(huán)通過soup對(duì)象找到元素

          執(zhí)行一些簡(jiǎn)單的數(shù)據(jù)清理

          將數(shù)據(jù)寫入csv


          準(zhǔn)備開始

          在開始使用任何Python應(yīng)用程序之前,要問的第一個(gè)問題是:我需要哪些庫(kù)?

          對(duì)于web抓取,有一些不同的庫(kù)需要考慮,包括:

          Beautiful Soup

          Requests

          Scrapy

          Selenium

          在本例中我們使用Beautiful Soup。你可以使用Python包管理器 pip 安裝Beautiful Soup:

          pip install BeautifulSoup4

          安裝好這些庫(kù)之后,讓我們開始吧!

          檢查網(wǎng)頁(yè)

          要知道在Python代碼中需要定位哪些元素,首先需要檢查網(wǎng)頁(yè)。

          要從Tech Track Top 100 companies收集數(shù)據(jù),可以通過右鍵單擊感興趣的元素來(lái)檢查頁(yè)面,然后選擇檢查。這將打開HTML代碼,我們可以在其中看到每個(gè)字段包含在其中的元素。

          Tech Track Top 100 companies鏈接:

          http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/

          右鍵單擊感興趣的元素并選擇“Inspect”,顯示html元素。

          由于數(shù)據(jù)存儲(chǔ)在一個(gè)表中,因此只需幾行代碼就可以直接獲取數(shù)據(jù)。如果您想練習(xí)抓取網(wǎng)站,這是一個(gè)很好的例子,也是一個(gè)好的開始,但請(qǐng)記住,它并不總是那么簡(jiǎn)單!

          所有100個(gè)結(jié)果都包含在<tr> 元素的行中,并且這些在一頁(yè)上都可見。情況并非總是如此,當(dāng)結(jié)果跨越多個(gè)頁(yè)面時(shí),您可能需要更改網(wǎng)頁(yè)上顯示的結(jié)果數(shù)量,或者遍歷所有頁(yè)面以收集所有信息。

          League Table網(wǎng)頁(yè)上顯示了包含100個(gè)結(jié)果的表。檢查頁(yè)面時(shí),很容易在html中看到一個(gè)模式。結(jié)果包含在表格中的行中:

          <table class="tableSorter">

          重復(fù)的行<tr> 將通過在Python中使用循環(huán)來(lái)查找數(shù)據(jù)并寫入文件來(lái)保持我們的代碼最小化!

          附注:可以做的另一項(xiàng)檢查是網(wǎng)站上是否發(fā)出了HTTP GET請(qǐng)求,該請(qǐng)求可能已經(jīng)將結(jié)果作為結(jié)構(gòu)化響應(yīng)(如JSON或XML格式)返回。您可以在檢查工具的網(wǎng)絡(luò)選項(xiàng)卡中進(jìn)行檢查,通常在XHR選項(xiàng)卡中進(jìn)行檢查。刷新頁(yè)面后,它將在加載時(shí)顯示請(qǐng)求,如果響應(yīng)包含格式化結(jié)構(gòu),則使用REST客戶端(如Insomnia)返回輸出通常更容易。



          刷新網(wǎng)頁(yè)后,頁(yè)面檢查工具的網(wǎng)絡(luò)選項(xiàng)卡

          使用Beautiful Soup解析網(wǎng)頁(yè)html

          現(xiàn)在您已經(jīng)查看了html的結(jié)構(gòu)并熟悉了將要抓取的內(nèi)容,是時(shí)候開始使用Python了!

          第一步是導(dǎo)入將用于網(wǎng)絡(luò)爬蟲的庫(kù)。我們已經(jīng)討論過上面的BeautifulSoup,它有助于我們處理html。我們導(dǎo)入的下一個(gè)庫(kù)是urllib,它連接到網(wǎng)頁(yè)。最后,我們將輸出寫入csv,因此我們還需要導(dǎo)入csv 庫(kù)。作為替代方案,可以在此處使用json庫(kù)。

          # import libraries

          from bs4 import BeautifulSoup

          import urllib.request

          import csv

          下一步是定義您正在抓取的網(wǎng)址。如上一節(jié)所述,此網(wǎng)頁(yè)在一個(gè)頁(yè)面上顯示所有結(jié)果,因此此處給出了地址欄中的完整url:

          # specify the url

          urlpage = 'http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/'

          然后我們建立與網(wǎng)頁(yè)的連接,我們可以使用BeautifulSoup解析html,將對(duì)象存儲(chǔ)在變量'soup'中:

          # query the website and return the html to the variable 'page'

          page = urllib.request.urlopen(urlpage)

          # parse the html using beautiful soup and store in variable 'soup'

          soup = BeautifulSoup(page, 'html.parser')

          我們可以在這個(gè)階段打印soup變量,它應(yīng)該返回我們請(qǐng)求網(wǎng)頁(yè)的完整解析的html。

          print(soup)

          如果存在錯(cuò)誤或變量為空,則請(qǐng)求可能不成功。可以使用urllib.error模塊在此時(shí)實(shí)現(xiàn)錯(cuò)誤處理。


          搜索html元素

          由于所有結(jié)果都包含在表中,我們可以使用find 方法搜索表的soup對(duì)象。然后我們可以使用find_all 方法查找表中的每一行。

          如果我們打印行數(shù),我們應(yīng)該得到101的結(jié)果,100行加上標(biāo)題。

          # find results within table

          table = soup.find('table', attrs={'class': 'tableSorter'})

          results = table.find_all('tr')

          print('Number of results', len(results))

          因此,我們可以對(duì)結(jié)果進(jìn)行循環(huán)以收集數(shù)據(jù)。

          打印soup對(duì)象的前兩行,我們可以看到每行的結(jié)構(gòu)是:

          <tr>

          <th>Rank</th>

          <th>Company</th>

          <th class="">Location</th>

          <th>Year end</th>

          <th class="" style="text-align:right;">Annual sales rise over 3 years</th>

          <th class="" style="text-align:right;">Latest sales £000s</th>

          <th class="" style="text-align:right;">Staff</th>

          <th class="">Comment</th>

          <!-- <th>FYE</th>-->

          </tr>

          <tr>

          <td>1</td>

          <td><a ><span>Wonderbly</span></a>Personalised children's books</td>

          <td>East London</td>

          <td>Apr-17</td>

          <td style="text-align:right;">294.27%</td>

          <td style="text-align:right;">*25,860</td>

          <td style="text-align:right;">80</td>

          <td>Has sold nearly 3m customisable children’s books in 200 countries</td>

          <!-- <td>Apr-17</td>-->

          </tr>

          表格中有8欄:Rank,Company,Location,Year End,Annual Sales Rise,Latest Sales, Staff and Comments,所有這些都是我們可以保存的感興趣的數(shù)據(jù)。

          網(wǎng)頁(yè)的所有行的結(jié)構(gòu)都是一致的(對(duì)于所有網(wǎng)站來(lái)說(shuō)可能并非總是如此!)。因此,我們可以再次使用find_all 方法將每一列分配給一個(gè)變量,那么我們可以通過搜索<td> 元素來(lái)寫入csv或JSON。


          循環(huán)遍歷元素并保存變量

          在Python中,將結(jié)果附加到一個(gè)列表中是很有用的,然后將數(shù)據(jù)寫到一個(gè)文件中。我們應(yīng)該在循環(huán)之前聲明列表并設(shè)置csv的頭文件,如下所示:

          # create and write headers to a list

          rows = []

          rows.append(['Rank', 'Company Name', 'Webpage', 'Description', 'Location', 'Year end', 'Annual sales rise over 3 years', 'Sales £000s', 'Staff', 'Comments'])

          print(rows)

          這將打印出我們添加到包含標(biāo)題的列表的第一行。

          你可能會(huì)注意到表格中有一些額外的字段Webpage和Description不是列名,但是如果你仔細(xì)看看我們打印上面的soup變量時(shí)的html,那么第二行不僅僅包含公司名稱。我們可以使用一些進(jìn)一步的提取來(lái)獲取這些額外信息。

          下一步是循環(huán)結(jié)果,處理數(shù)據(jù)并附加到可以寫入csv的rows。

          在循環(huán)中查找結(jié)果:

          # loop over results

          for result in results:

          # find all columns per result

          data = result.find_all('td')

          # check that columns have data

          if len(data) == 0:

          continue

          由于表中的第一行僅包含標(biāo)題,因此我們可以跳過此結(jié)果,如上所示。它也不包含任何<td>元素,因此在搜索元素時(shí),不會(huì)返回任何內(nèi)容。然后,我們可以通過要求數(shù)據(jù)的長(zhǎng)度為非零來(lái)檢查是否只處理包含數(shù)據(jù)的結(jié)果。

          然后我們可以開始處理數(shù)據(jù)并保存到變量中。

          # write columns to variables

          rank = data[0].getText()

          company = data[1].getText()

          location = data[2].getText()

          yearend = data[3].getText()

          salesrise = data[4].getText()

          sales = data[5].getText()

          staff = data[6].getText()

          comments = data[7].getText()

          以上只是從每個(gè)列獲取文本并保存到變量。但是,其中一些數(shù)據(jù)需要進(jìn)一步清理以刪除不需要的字符或提取更多信息。

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

          如果我們打印出變量company,該文本不僅包含公司名稱,還包含描述。我們?nèi)缓蟠蛴ales,它包含不需要的字符,如腳注符號(hào),最好刪除。

          print('Company is', company)

          # Company is WonderblyPersonalised children's books

          print('Sales', sales)

          # Sales *25,860

          我們希望將company 分為公司名稱和描述,我們可以用幾行代碼實(shí)現(xiàn)。再看一下html,對(duì)于這個(gè)列,有一個(gè) <span> 元素只包含公司名稱。此列中還有一個(gè)鏈接指向網(wǎng)站上的另一個(gè)頁(yè)面,其中包含有關(guān)該公司的更多詳細(xì)信息。我們將在稍后使用它!

          <td><a ><span>Wonderbly</span></a>Personalised children's books</td>

          要將company 分成兩個(gè)字段,我們可以使用find方法保存<span>元素,然后使用strip 或replace 從company 變量中刪除公司名稱,這樣它只留下描述。

          要從sales中刪除不需要的字符,我們可以再次使用strip和replace 方法!

          # extract description from the name

          companyname = data[1].find('span', attrs={'class':'company-name'}).getText()

          description = company.replace(companyname, '')

          # remove unwanted characters

          sales = sales.strip('*').strip('?').replace(',','')

          我們要保存的最后一個(gè)變量是公司網(wǎng)站。如上所述,第二列包含指向另一個(gè)頁(yè)面的鏈接,該頁(yè)面具有每個(gè)公司的概述。 每個(gè)公司頁(yè)面都有自己的表格,大部分時(shí)間都包含公司網(wǎng)站。



          檢查公司頁(yè)面上的url元素

          要從每個(gè)表中抓取url并將其保存為變量,我們需要使用與上面相同的步驟:

          在fast track網(wǎng)站上找到具有公司頁(yè)面網(wǎng)址的元素

          向每個(gè)公司頁(yè)面網(wǎng)址發(fā)出請(qǐng)求

          使用Beautifulsoup解析html

          找到感興趣的元素

          查看一些公司頁(yè)面,如上面的屏幕截圖所示,網(wǎng)址位于表格的最后一行,因此我們可以在最后一行內(nèi)搜索<a>元素。

          # go to link and extract company website

          url = data[1].find('a').get('href')

          page = urllib.request.urlopen(url)

          # parse the html

          soup = BeautifulSoup(page, 'html.parser')

          # find the last result in the table and get the link

          try:

          tableRow = soup.find('table').find_all('tr')[-1]

          webpage = tableRow.find('a').get('href')

          except:

          webpage = None

          也有可能出現(xiàn)公司網(wǎng)站未顯示的情況,因此我們可以使用try except條件,以防萬(wàn)一找不到網(wǎng)址。

          一旦我們將所有數(shù)據(jù)保存到變量中,我們可以在循環(huán)中將每個(gè)結(jié)果添加到列表rows。

          # write each result to rows

          rows.append([rank, company, webpage, description, location, yearend, salesrise, sales, staff, comments])

          print(rows)

          然后可以試著在循環(huán)外打印變量,在將其寫入文件之前檢查它是否符合您的預(yù)期!


          寫入輸出文件

          如果想保存此數(shù)據(jù)以進(jìn)行分析,可以用Python從我們列表中非常簡(jiǎn)單地實(shí)現(xiàn)。

          # Create csv and write rows to output file

          with open('techtrack100.csv','w', newline='') as f_output:

          csv_output = csv.writer(f_output)

          csv_output.writerows(rows)

          運(yùn)行Python腳本時(shí),將生成包含100行結(jié)果的輸出文件,您可以更詳細(xì)地查看這些結(jié)果!


          這是我的第一個(gè)教程,如果您有任何問題或意見或者不清楚的地方,請(qǐng)告訴我!成都加米谷大數(shù)據(jù)培訓(xùn)機(jī)構(gòu),12月大數(shù)據(jù)開發(fā)提高班預(yù)報(bào)名中...

          Web Development

          https://towardsdatascience.com/tagged/web-development?source=post

          Python

          https://towardsdatascience.com/tagged/python?source=post

          Web Scraping

          https://towardsdatascience.com/tagged/web-scraping?source=post

          Data Science

          https://towardsdatascience.com/tagged/data-science?source=post

          Programming

          https://towardsdatascience.com/tagged/programming?source=post

          原文標(biāo)題:Data Science Skills: Web scraping using python

          原文鏈接:https://towardsdatascience.com/data-science-skills-web-scraping-using-python-d1a85ef607ed

          裝goquery

          GoQuery是Go語(yǔ)言的一個(gè)HTML解析器,類似于Python中的BeautifulSoup。它使用Go的強(qiáng)類型和高效性能來(lái)處理HTML,CSS和JavaScript。使用GoQuery可以輕松地從HTML文檔中提取數(shù)據(jù),例如標(biāo)題,鏈接,表單和表格等。GoQuery還提供了強(qiáng)大的CSS選擇器,可以讓您輕松地從文檔中選擇元素。

          go get github.com/PuerkitoBio/goquery

          Go代碼中導(dǎo)入GoQuery:

          import "github.com/PuerkitoBio/goquery"
          package main
          import (
              "fmt"
              "net/http"
              "github.com/PuerkitoBio/goquery"
          )
          func main() {
            //使用http.Get方法來(lái)獲取網(wǎng)頁(yè)內(nèi)容  使用我以前經(jīng)常逛的phpstudy官網(wǎng)
              resp, err := http.Get("https://www.xp.cn/using.html")
              if err != nil {
                  fmt.Println(err)
                  return
              }
              defer resp.Body.Close()
            
            
              // 讀取網(wǎng)頁(yè)內(nèi)容
              // body, err := ioutil.ReadAll(resp.Body)
              // if err != nil {
              //  log.Fatal(err)
              // }
              // 將響應(yīng)轉(zhuǎn)換為UTF-8編碼   (如果網(wǎng)站是gbk編碼的)
              // reader := transform.NewReader(bytes.NewReader(body), simplifiedchinese.GBK.NewDecoder())
              // utf8Body, err := ioutil.ReadAll(reader)
              // if err != nil {
              //  log.Fatal(err)
              // }
              // 解析網(wǎng)頁(yè)內(nèi)容
              // doc, err := goquery.NewDocumentFromReader(bytes.NewReader(utf8Body))
              // if err != nil {
              //  log.Fatal(err)
              // }
            
            
            
              // 解析網(wǎng)頁(yè)內(nèi)容
              doc, err := goquery.NewDocumentFromReader(resp.Body)
              if err != nil {
                  fmt.Println(err)
                  return
              }
              // 提取內(nèi)容
              doc.Find(".pb-20").Each(func(i int, s *goquery.Selection) {
                  title := s.Find("li div a").Text()
                  fmt.Printf("%s\n", title)
              })
          }

          使用goquery包提供的NewDocumentFromReader方法來(lái)解析網(wǎng)頁(yè)內(nèi)容。然后,使用Find方法來(lái)查找網(wǎng)頁(yè)中的標(biāo)題,并輸出它們。


          主站蜘蛛池模板: 国产小仙女视频一区二区三区| 日韩av无码一区二区三区| 日本精品少妇一区二区三区| 午夜视频一区二区| 精品少妇一区二区三区在线| 人妻少妇一区二区三区| 中文字幕一区二区三区人妻少妇| 一区二区三区杨幂在线观看| 久久国产精品亚洲一区二区| 在线免费视频一区| 久久精品道一区二区三区| 亚洲av乱码一区二区三区按摩| 精品国产一区二区三区无码| 国产综合视频在线观看一区| 亚洲AV综合色一区二区三区| 欧洲精品一区二区三区| 国产综合一区二区| 国产精品免费视频一区| 香蕉免费一区二区三区| 全国精品一区二区在线观看| 日韩一区二区三区射精| 久久久精品人妻一区二区三区| 韩国一区二区三区| 国产精品538一区二区在线| 丝袜美腿一区二区三区| 亚洲另类无码一区二区三区| 中文字幕AV一区二区三区 | 不卡无码人妻一区三区音频| 狠狠综合久久av一区二区| 精品国产亚洲一区二区三区在线观看| 亚洲一区精彩视频| 国产午夜精品一区二区三区极品| 亚洲日韩一区精品射精| 成人区精品一区二区不卡亚洲| 无码精品不卡一区二区三区| 在线不卡一区二区三区日韩| 视频在线观看一区二区| 熟女少妇精品一区二区| 亚洲一区二区久久| 蜜臀AV无码一区二区三区| 麻豆一区二区三区蜜桃免费|