網絡爬蟲是一項非常搶手的技能。收集、分析和清洗數據是數據科學項目中最重要的部分。
今天介紹如何從鏈接中爬取高質量文本內容,我們使用迭代,從大約700個鏈接中進行網絡爬取。
如果想直接跳轉到代碼部分,可以在下方鏈接GitHub倉庫中找到,同時還會找到一個包含將爬取的700個鏈接的.csv數據集!
【GitHub】:https://github.com/StefanSilver3/MediumArticlesCode-byStefanSilver/tree/main/WebScraping
首先,導入所需的庫。
from bs4 import BeautifulSoupimport requestsfrom bs4.element import Commentimport urllib.request
如果還沒有安裝BeautifulSoup庫,可以直接在Python代碼中這樣做。
pip install beautifulsoup4
然后,開始編碼。這里定義兩個函數,一個用于檢查要排除的內容,另一個用于從網站上爬取內容。
第一個函數用于查找要排除的元素,代碼如下。
# 要從提取的文本中過濾的標簽def tag_visible(element): if element.parent.name in ['style', 'script', 'head', 'title', 'meta', '[document]']: return False if isinstance(element, Comment): return False return True
第二個函數將使用這個函數,以確保所有的無用內容都從最終結果中排除,代碼如下。
# 從網頁文本中過濾前一個函數中提到的所有標簽的函數def text_from_html(body): soup = BeautifulSoup(body, 'html.parser') texts = soup.findAll(string=True) visible_texts = filter(tag_visible, texts) return u" ".join(t.strip() for t in visible_texts)
接著,可以在一個新鏈接上測試這兩個函數。你可以放置任意鏈接,不需要使用下面的鏈接。
html = urllib.request.urlopen('https://www.artificialintelligence-news.com/2023/11/20/microsoft-recruits-former-openai-ceo-sam-altman-co-founder-greg-brockman/').read()print(text_from_html(html))
網絡爬取的內容將會像下面的文本一樣。
圖片
截圖1:爬取的網站——隨機鏈接
注意,一些網站會檢測到網絡爬取活動,并阻止網絡爬取嘗試。如果發生這種情況,將收到一個403錯誤,這是“禁止”的代碼。
測試了簡單的提取函數,接下來對提供的鏈接數據集的所有鏈接進行迭代提取。
首先,確保獲取了在GitHub倉庫中找到的數據集。然后,讀取數據集并將列名更改為Link,原本的列名是max(page)。
df = pd.read_csv("furniture_stores_pages.csv")df.rename(columns={"max(page)":"Link"}, inplace=1)
現在,創建一個以0為起始值的變量x,它將在列表中的每個鏈接上進行迭代。當然元素變量也可以使用。
x=0df_cnotallow=[]for element in df.iterrows(): try: url = df["Link"][x] scraped_text = urllib.request.urlopen(url).read() df_contents.append(text_from_html(scraped_text)) x=x+1 except: print("(",x,")","This website could not be scraped-> ",df["Link"][x]) x=x+1
然后,定義一個名為df_contents的列表,它將包含從每個網頁中提取的所有可以爬取的文本。
接下來,遍歷每個元素,如果可以訪問且包含相關數據,就從中提取信息。這只是對隨機鏈接進行上述測試,但測試的對象是提供的數據集中的所有鏈接。
代碼中還使用了try-except對無法提取的鏈接進行跳過。
現在,檢查新列表(df_contents)的長度,查看提取了多少鏈接。
len(df_contents)
這個函數返回268,這意味著在700多個網站中只有268個爬取成功。然后,可以使用下面的代碼訪問并打印第一個被爬取的網站。
df_contents[0]
這將打印第一個文本,示例如下所示(簡短版本):
圖片
截圖2:從數據集中爬取的網站
如果需要的話,也可以使用下面的代碼反復打印。每打印完一個元素后,都需要輸入任意字符以繼續,這樣就可以逐一檢查每個提取的網站。
count = 0for element in df_contents: print(df_contents[count]) print("/n /n---------------------------------------------------------------------------------------- /n /n") print("Press any key to continue to print df_contents [",count+1,"]") input() count= count+1
本文鏈接:http://www.www897cc.com/showinfo-26-40655-0.html文本抓取利器,Python和Beautiful Soup爬蟲助你事半功倍
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 微軟:VS Code已成為Java巨頭!
下一篇: Java高并發詳解,死鎖的成因與解決方法