python 簡單爬蟲
一、python爬蟲程式主結構
1、爬取網頁
def askUrl(url): # ask a web request. os.environ['NO_PROXY'] = 'movie.douban.com' # 解決此請求方式代理問題 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.63" } req = requests.get(url, headers=headers) print(req.status_code) # 檢視請求狀態(200為成功) html = "" try: html = req.content.decode("utf-8") print(html) except requests.exceptions.ConnectionError as e: print("url連線錯誤:", e) return html
使用python的requests庫可以輕鬆的爬取網頁,請求方式一般常用的有get方式和post方式。當響應碼code為200時,意味著我們成功地爬取到了網頁的資料。對於某些有反爬或者需要登入的網頁,可以進一步的設定代理、新增請求headers引數,常用的headers引數頭有"User-Agent”、“cookie"、"host"等,可在對應網頁開啟開發人員工具,在網路選項的請求標頭中獲取:
2、解析爬取的網頁資料
爬取到的網頁響應資料是html格式的資料,包含著網頁各個元素的資料,我們需要通過解析html,來獲取我們需要資料。現在python3常用的解析html資料的第三方庫為BeautifulSoup,也即bs4。下面是通過某構造的html資料,來說明bs4用法的例子,也是網上常見的內容。
假如某網頁的返回資料如下:
html_doc = """ <html> <head> <title>The Dormouse's story</title> <title>The test's story</title> </head> <body> <p class="title aq"> <b> The Dormouse's story </b> </p> <tr > <th> "首量時間" </th> <td> 2021-07-17 </td> <th> "量產時間" </th> <td> 2021-07-18 </td> </tr> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well. </p>
現在我只想要其中"首量時間"和"量產時間"兩個資料,那麼我可以通過下面的解析方法來獲取:
def parseData(html): dataList = [] data = [] # html字串建立BeautifulSoup物件 soup = BeautifulSoup(html, 'html.parser') sortSoup = soup.find_all('td') print(sortSoup) for sort in sortSoup: time = (sort.string).strip() data.append(time) dataList.append(data) return dataList
首先通過soup = BeautifulSoup(html, 'html.parser') 將html資料按標準的縮排格式輸出,然後通過 sortSoup = soup.find_all('td')找到我所需要的兩個時間資料,此時返回為:
<td> 2021-07-17 </td> <td> 2021-07-18 </td>
很明顯包含不屬於資料的<td>和空格、換行等,再通過time = (sort.string).strip() 對資料進處理就得到了我們真正需要的"2021-07-17"、"2021-07-18"這兩個時間資料。
對於更復雜的html資料,使用上面簡單的解析方式可能並不能滿足,需要了解更多的bs4解析格式,或者使用正則法則(re庫)去解析得到我們需要的資料。
3、儲存資料/操作資料
解析得到我們需要的資料後,我們一般會儲存資料至Excel表格或資料庫等,下面是儲存至Excel表格的例子:
def saveDataToExcel(dataList): # 儲存資料到表格 savePath = "timeData.xls" workBook = xlwt.Workbook(encoding='utf-8', style_compression=0) workSheet = workBook.add_sheet('機型各階段時間', cell_overwrite_ok=True) col = ("機型名", "首量時間", "量產時間") for i in range(0, 3): workSheet.write(0, i, col[i]) for data in dataList: for j in range(0, 3): workSheet.write(1, j, data[j]) workBook.save(savePath)
首先建立表格,並把表頭資料構建好,然後迴圈將資料寫入表格。對於資料庫也是一樣的,只不過多一個連線資料庫的初始化過程。
如果想要資料表現得更加直觀,我們可能還會用到第三方工具對資料進行展示,比如用Apache ECharts中各種豐富的表格模板來展示我們提取出的資料,我們需要進一步的操作我們的資料以使用模板。
二、爬蟲的要點
從前面爬蟲主體的介紹可以知道,其實爬蟲的步驟很清晰明瞭,第一步請求網頁,第二部解析資料、第三部儲存資料。那麼從這三個過程看出爬蟲的要點是什麼呢?我覺得至少有下面這兩點:
1、獲取到網頁正確的返回資料;
2、資料解析:包括對源資料進行提取的一個過程和資料儲存過程中的處理。
對於第1點,獲取到網頁正確相應資料是爬蟲的前提。你可能會遇到反爬的網頁、需要登入的網頁、你可能需要不止一個頁面的資料等等,這時候如何能夠得到網頁的正確響應,如何正確拼接不同頁面的網址就是你在請求網頁時需要解決的問題;
對於第2點,未經處理的資料等同於無用資料,一般我們想要爬取的網頁資料肯定不可能像前面例子中那樣簡單,這個時候如何快速準確地提取我們需要的資料就變得很重要,我們需要非常熟練地清楚bs4的各種解析方法,包括正則法則等其他一些資料解析的方法,以及使用第三方工具展示資料的處理方法,這個是爬蟲程式中佔比相當大的部分。
三、總結
爬蟲程式並不複雜,其框架簡單明瞭,如果想要在日常生活中使用爬蟲程式爬取一些你想要的資料,最有效的方式就是開啟你的python,去請求你想要的網頁的資料,當你成功獲取到響應資料後,就想方設法地解析得到你想要的資料,遇到一個問題解決一個問題,在你不斷成功獲取你想要的資料時,你爬取資料和解析資料的能力也就不斷積累起來了。