python 3.5:爬蟲--爬取人民日報1946-2003年所有新聞
阿新 • • 發佈:2019-02-14
爬取資料庫網站上的人民日報新聞(1946-2003)
總網址如下:
http://www.ziliaoku.org/rmrb?from=groupmessage&isappinstalled=0
從此網頁開始爬取,進下一層,再進入下一層,再進行爬取。
由於本人還在學習過程中,有些很多其他更方便快捷的方法,以及一些爬蟲功能還未用到,所以結果還是有兩處需改進的地方,下面會上程式碼,歡迎一起討論學習。
1.非按時間順序出來檔案(txt)
2.由於網站原始碼的特殊,還未弄清如何爬取一天中每一版的,所以最後只能爬取每天的第一版,一天中每一版的網站都是同一個,版裡每一條新聞都指向這個網站。
本次的爬取新聞是我學習爬蟲的一個步驟過程,下次將發我運用scrapy爬取的一次例項
#coding=utf-8 import requests import re # 正則表示式 import bs4 # Beautiful Soup 4 解析模組 import urllib.request # 網路訪問模組 import News #自己定義的新聞結構 import codecs #解決編碼問題的關鍵 ,使用codecs.open開啟檔案 import sys #1解決不同頁面編碼問題 import importlib importlib.reload(sys) # 從首頁獲取所有連結 def GetAllUrl(home): html = urllib.request.urlopen(home).read().decode('utf8') soup = bs4.BeautifulSoup(html, 'html.parser') pattern = 'http://www.ziliaoku.org/rmrb/[\d\S].*?' links = soup.find_all('a', href=re.compile(pattern)) for link in links: url_set.add(link['href']) def GetAllUrlL(home): html = urllib.request.urlopen(home).read().decode('utf8') soup = bs4.BeautifulSoup(html, 'html.parser') pattern = 'http://www.ziliaoku.org/rmrb/[\d\S].*?' links = soup.find_all('a', href=re.compile(pattern)) for link in links: url_set1.add(link['href']) def GetNews(url,i): response = requests.get(url) html = response.text article = News.News() try: article.title = re.findall(r'<h2 id=".*?">(.+?)</h2>', html) article.content = re.findall(r'<div class="article">([\w\W]*?)</div>', html) t = "" for j in article.title: t+=str('標題:'+j+'\n') c = "" for m in article.content: c+=str(m) article.content1 = ' ' + '\n'.join(c.split(' ')).strip() file = codecs.open('/tmp/luo/news '+str(i)+'.txt', 'w+') file.write(t+"\t"+article.content1) file.close() print('ok') except Exception as e: print('Error1:', e) def GetAllUrlK(home,i): html = urllib.request.urlopen(home).read().decode('utf8') soup = bs4.BeautifulSoup(html, 'html.parser') pattern = 'http://www.ziliaoku.org/rmrb/[\d\S].*?' link = soup.find('a', href=re.compile(pattern)) link1 = link['href'] print(link1) GetNews(link1,i) url_set = set() # url集合 url_set1 = set() # url集合 home = 'http://www.ziliaoku.org/rmrb?from=groupmessage&isappinstalled=0' GetAllUrl(home) try: for d in url_set: GetAllUrlL(d) print(d) i = 0 for b in url_set1: i = i+ 1 print(b) GetAllUrlK(b,i) except Exception as e: print('Error:', e) # home = 'http://www.ziliaoku.org/rmrb/1984-06-21' # i = 10 # GetAllUrlK(home,i)
txt檔案為新聞,格式可自己用正則去規範。