python爬取百度貼吧指定內容
阿新 • • 發佈:2018-11-03
環境:python3.6
1:抓取百度貼吧—linux吧內容 基礎版 抓取一頁指定內容並寫入檔案
萌新剛學習Python爬蟲,做個練習
貼吧連結: http://tieba.baidu.com/f?kw=linux&ie=utf-8&pn=0
解析原始碼使用的是BeautifulSoup
關於BeautifulSoup: 可以直接檢視官方文件:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
檔案儲存使用json的方式
當然你可以儲存成txt檔案
廢話不多說 直接上程式碼
''' 抓取百度貼吧---linux吧內容 基礎版 抓取一頁指定內容並寫入檔案 爬蟲線路: requests - pyquery Python版本: 3.6 ''' import requests import json from bs4 import BeautifulSoup # 用於傳送請求,獲得網頁原始碼以供解析 def start_requests(url): r = requests.get(url) return r.content # 解析內容 def parse(text): soup = BeautifulSoup(text, 'lxml') infos = soup.find_all('li', attrs={'class': 'j_thread_list'}) # 建立一個列表儲存所有結果 result_list = [] for info in infos[1:]: # 建立一個字典將所有資訊存入字典中 mydict = {} mydict['title'] = info.find('a', class_='j_th_tit').text.strip() # 帖子標題 mydict['link'] = "http://tieba.baidu.com/" + info.find('a', class_='j_th_tit')['href'] # 帖子連結 mydict['author'] = info.find('a', class_='frs-author-name').text.strip() # 帖子作者 mydict['time'] = info.find('span', class_='pull-right').text # 發表時間 result_list.append(mydict) return result_list # 將資料寫入json檔案 def write_json(result): s = json.dumps(result, indent=4, ensure_ascii=False) with open('tieba.json', 'w', encoding='utf-8') as f: f.write(s) def main(): # 貼吧連結 url = 'http://tieba.baidu.com/f?kw=linux&ie=utf-8&pn=0' text = start_requests(url) result = parse(text) write_json(result) # 一般做法 if __name__ == '__main__': main()
檔案內容:
2:抓取百度貼吧—linux吧內容 升級版 抓取指定頁內容並寫入檔案 多頁抓取之構造url
''' 抓取百度貼吧---linux吧內容 升級版 抓取指定頁內容並寫入檔案 多頁抓取之構造url 爬蟲線路: requests - pyquery Python版本: 3.6 ''' import requests import json from bs4 import BeautifulSoup # 用於傳送請求,獲得網頁原始碼以供解析 def start_requests(url): r = requests.get(url) print(111) return r.content # 解析內容 def parse(text): soup = BeautifulSoup(text, 'lxml') infos = soup.find_all('li', attrs={'class': 'j_thread_list'}) for info in infos[1:]: mydict = {} mydict['title'] = info.find('a', class_='j_th_tit').text.strip() mydict['link'] = "http://tieba.baidu.com/" + info.find('a', class_='j_th_tit')['href'] mydict['author'] = info.find('a', class_='frs-author-name').text.strip() mydict['time'] = info.find('span', class_='pull-right').text result_list.append(mydict) # 將資料寫入json檔案 def write_json(result): s = json.dumps(result, indent=4, ensure_ascii=False) with open('all_tieBa.json', 'w', encoding='utf-8') as f: f.write(s) def main(): for i in range(10): url = 'http://tieba.baidu.com/f?kw=linux&ie=utf-8&pn={}'.format(i * 50) text = start_requests(url) parse(text) write_json(result_list) print('寫入完成') # 一般做法 if __name__ == '__main__': result_list = [] main()
3:抓取百度貼吧—linux吧內容 升級版 抓取所有頁內容並寫入檔案 多頁抓取之翻頁
這裡要抓取的內容已經很多了,速度會很慢,萌新還不會通過其他技術來加速下載速度
''' 抓取百度貼吧---linux吧內容 升級版 抓取所有頁內容並寫入檔案 多頁抓取之翻頁 爬蟲線路: requests - pyquery Python版本: 3.6 ''' import requests import json from bs4 import BeautifulSoup # 用於傳送請求,獲得網頁原始碼以供解析 def start_requests(url): r = requests.get(url) return r.content # 解析內容 def parse(text): """ 翻頁原理是爬取一頁的資訊的同時,把下一頁的url也爬取到,再對抓取到的這個url進行爬取。這種方法適用於有“下一頁” 標籤的網站,而且一般是網頁url無法構造的時候才用這種方法。 用這種方法要注意對有無下一頁進行判斷 """ soup = BeautifulSoup(text, 'lxml') infos = soup.find_all('li', attrs={'class': 'j_thread_list'}) for info in infos[1:]: mydict = {} mydict['title'] = info.find('a', class_='j_th_tit').text.strip() mydict['link'] = "http://tieba.baidu.com/" + info.find('a', class_='j_th_tit')['href'] mydict['author'] = info.find('a', class_='frs-author-name').text.strip() mydict['time'] = info.find('span', class_='pull-right').text result_list.append(mydict) # 此處獲取下一頁的連結物件 next_page = soup.find('a', class_='next') if next_page: next_url = 'http:'+next_page['href'] print(next_url) text = start_requests(next_url) parse(text) # 將資料寫入json檔案 def write_json(result): s = json.dumps(result, indent=4, ensure_ascii=False) with open('tieba3.json', 'w', encoding='utf-8') as f: f.write(s) def main(): text = start_requests(base_url) parse(text) write_json(result_list) print('寫入完成') # 一般做法 if __name__ == '__main__': base_url = 'http://tieba.baidu.com/f?ie=utf-8&kw=linux&fr=search&red_tag=s0376598528' result_list = [] main()
執行程式碼:
總結到此為止 -->over