1. 程式人生 > >python 3.5:爬蟲--爬取人民日報1946-2003年所有新聞

python 3.5:爬蟲--爬取人民日報1946-2003年所有新聞

爬取資料庫網站上的人民日報新聞(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檔案為新聞,格式可自己用正則去規範。