抄來的一個Python爬蟲demo,備忘
阿新 • • 發佈:2019-01-06
從知乎上抄過來的demo,作者是在ios下開發的,直接拿到windows平臺上執行有報錯。所以做了修改,下面是修改後的原始碼:
# -*- coding: utf-8 -*- """ Created on Wed Apr 11 14:57:23 2018 @author: sw """ import requests from bs4 import BeautifulSoup # 首先我們寫好抓取網頁的函式 def get_html(url): try: r = requests.get(url, timeout=30) r.raise_for_status() # 這裡我們知道百度貼吧的編碼是utf-8,所以手動設定的。爬去其他的頁面時建議使用: #r.endcodding = r.apparent_endconding() r.encoding = 'utf-8' return r.text except: print('獲取網頁資料失敗') return " ERROR " def get_content(url): ''' 分析貼吧的網頁檔案,整理資訊,儲存在列表變數中 ''' # 初始化一個列表來儲存所有的帖子資訊: comments = [] # 首先,我們把需要爬取資訊的網頁下載到本地 html = get_html(url) # 我們來做一鍋湯 soup = BeautifulSoup(html, 'lxml') # 按照之前的分析,我們找到所有具有‘ j_thread_list clearfix’屬性的li標籤。返回一個列表型別。 liTags = soup.find_all('li', attrs={'class': ' j_thread_list clearfix'}) # 通過迴圈找到每個帖子裡的我們需要的資訊: for li in liTags: # 初始化一個字典來儲存文章資訊 comment = {} # 這裡使用一個try except 防止爬蟲找不到資訊從而停止執行 try: # 開始篩選資訊,並儲存到字典中 comment['title'] = li.find( 'a', attrs={'class': 'j_th_tit '}).text.strip() comment['link'] = "http://tieba.baidu.com/" + \ li.find('a', attrs={'class': 'j_th_tit '})['href'] comment['name'] = li.find( 'span', attrs={'class': 'tb_icon_author '}).text.strip() comment['time'] = li.find( 'span', attrs={'class': 'pull-right is_show_create_time'}).text.strip() comment['replyNum'] = li.find( 'span', attrs={'class': 'threadlist_rep_num center_text'}).text.strip() comments.append(comment) except: print('出了點小問題') return comments def Out2File(dict): ''' 將爬取到的檔案寫入到本地 儲存到當前目錄的 TTBT.txt檔案中。 ''' with open('TTBT.txt', 'a+', encoding='utf-8') as f: for comment in dict: f.write('標題: {} \t 連結:{} \t 發帖人:{} \t 發帖時間:{} \t 回覆數量: {} \n'.format( comment['title'], comment['link'], comment['name'], comment['time'], comment['replyNum'])) print('當前頁面爬取完成') def main(base_url, deep): url_list = [] # 將所有需要爬去的url存入列表 for i in range(0, deep): url_list.append(base_url + '&pn=' + str(50 * i)) print('所有的網頁已經下載到本地! 開始篩選資訊。。。。') #迴圈寫入所有的資料 for url in url_list: content = get_content(url) Out2File(content) print('所有的資訊都已經儲存完畢!') base_url = 'http://tieba.baidu.com/f?kw=%E7%94%9F%E6%B4%BB%E5%A4%A7%E7%88%86%E7%82%B8' # 設定需要爬取的頁碼數量 deep = 3 if __name__ == '__main__': main(base_url, deep)