基於Scrapy架構的Python新聞爬蟲

來源:互聯網
上載者:User

標籤:replace   extractor   目的   lex   compile   網站服務   [1]   任務   glob   

概述該項目是基於Scrapy架構的Python新聞爬蟲,能夠爬取網易,搜狐,鳳凰和澎湃網站上的新聞,將標題,內容,評論,時間等內容整理並儲存到本地詳細代碼下載:http://www.demodashi.com/demo/13933.html一、開發背景

Python作為資料處理方面的一把好手,近年來的熱度不斷增長。網路爬蟲可以說是Python最具代表性的應用之一,那麼通過網路爬蟲來學習Python以及網路和資料處理的相關內容可以說是再合適不過了。

Scrapy是由Python語言開發的一個快速、高層次的螢幕抓取和web抓取架構,用於抓取web網站並從頁面中提取結構化的資料。相比於傳統的爬蟲來說,基於scrapy架構的爬蟲更加結構化,同時也更加高效,能完成更加複雜的爬取任務。

二、爬蟲效果

1、標題

2、內容

3、評論

4、日期,熱度和ID

5、程式運行圖

三、具體開發

1、任務需求

1. 爬取網易,搜狐,鳳凰和澎湃新聞網站的文章及評論

2. 新聞網頁數目不少於10萬頁

3. 每個新聞網頁及其評論能在1天內更新

 

2、功能設計

1. 設計一個網路爬蟲,能夠爬取指定網站的全部頁面,並提取其中的文章及評論內容

2. 定時運行網路爬蟲,實現每日更新資料

 

3、系統架構

首先簡單介紹下scrapy架構,這是一個爬蟲架構

綠線是資料流向,

(1)首先從初始URL 開始,Scheduler 會將其交給 Downloader 進行下載,

(2)下載之後會交給 Spider 進行分析,這裡的spider就是爬蟲的核心功能代碼

(3)Spider分析出來的結果有兩種:一種是需要進一步抓取的連結,它們會通過middleware傳回 Scheduler ;另一種是需要儲存的資料,送入Item Pipeline ,進行處理和儲存

(4)最後將所有資料輸出並儲存為檔案

4、實際項目

(1)項目結構

可以看到,NewsSpider-master是完整專案檔夾,下面存放有對應各個網站的爬蟲啟動指令碼debug_xx.py,scrapyspider檔案夾存放scrapy架構所需的相關檔案,spiders檔案夾存放實際的爬蟲代碼

(2)爬蟲引擎

以網易新聞的爬蟲news_163.py為例,簡要說明部分核心代碼:

①定義一個爬蟲類:
class news163_Spider(CrawlSpider):    # 網易新聞爬蟲名稱    name = "163news"    # 偽裝成瀏覽器    headers = {        ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36‘,    }    #網易全網    allowed_domains = [        "163.com"    ]    #新聞版    start_urls = [        ‘http://news.163.com/‘    ]    #Regex表示可以繼續訪問的url規則,http://news.163.com/\d\d\d\d\d(/([\w\._+-])*)*$    rules = [        Rule(LinkExtractor(        allow=(            (‘http://news\.163\.com/.*$‘)        ),        deny = (‘http://.*.163.com/photo.*$‘)        ),        callback="parse_item",        follow=True)    ]
②網頁內容分析模組

根據不同內容的Xpath路徑從頁面中提取內容,由於網站在不同時間的頁面結構不同,因此按照不同頁面版式劃分成幾個if判斷句塊;

def parse_item(self, response):    # response是當前url的響應    article = Selector(response)    article_url = response.url    global count    # 分析網頁類型    # 比較新的網易新聞 http://news.163.com/05-17/    if get_category(article) == 1:        articleXpath = ‘//*[@id="epContentLeft"]‘        if article.xpath(articleXpath):            titleXpath = ‘//*[@id="epContentLeft"]/h1/text()‘            dateXpath = ‘//*[@id="epContentLeft"]/div[1]/text()‘            contentXpath = ‘//*[@id="endText"]‘            news_infoXpath =‘//*[@id="post_comment_area"]/script[3]/text()‘            # 標題            if article.xpath(titleXpath):                news_item = newsItem()                news_item[‘url‘] = article_url                get_title(article, titleXpath, news_item)                # 日期                if article.xpath(dateXpath):                    get_date(article, dateXpath, news_item)                # 內容                if article.xpath(contentXpath):                    get_content(article, contentXpath, news_item)                    count = count + 1                    news_item[‘id‘] = count                # 評論                try:                    comment_url = get_comment_url(article, news_infoXpath)                    # 評論處理                    comments = get_comment(comment_url, news_item)[1]                    news_item[‘comments‘] = comments                except:                    news_item[‘comments‘] = ‘ ‘                    news_item[‘heat‘] = 0                yield news_item

根據Regex匹配頁面內容中的日期資訊:

‘‘‘通用日期處理函數‘‘‘def get_date(article, dateXpath, news_item):    # 時間    try:        article_date = article.xpath(dateXpath).extract()[0]        pattern = re.compile("(\d.*\d)")  # 正則匹配新聞時間        article_datetime = pattern.findall(article_date)[0]        #article_datetime = datetime.datetime.strptime(article_datetime, "%Y-%m-%d %H:%M:%S")        news_item[‘date‘] = article_datetime    except:        news_item[‘date‘] = ‘2010-10-01 17:00:00‘

其他函數:

‘‘‘網站分類函數‘‘‘def get_category(article):‘‘‘字元過濾函數‘‘‘def str_replace(content):‘‘‘通用本文處理函數‘‘‘def get_content(article, contentXpath, news_item):‘‘‘評論資訊提取函數‘‘‘def get_comment_url(article, news_infoXpath):‘‘‘評論處理函數‘‘‘def get_comment(comment_url, news_item):

(3)運行爬蟲並格式化儲存

①在settings.py中進行配置

import sys# 這裡改成爬蟲項目的絕對路徑,防止出現路徑搜尋的bugsys.path.append(‘E:\Python\以前的項目\\NewsSpider-master\scrapyspider‘)# 爬蟲名稱BOT_NAME = ‘scrapyspider‘# 設定是否服從網站的爬蟲規則ROBOTSTXT_OBEY = True# 同時並發請求數,越大則爬取越快同時負載也大CONCURRENT_REQUESTS = 32#禁止cookies,防止被banCOOKIES_ENABLED = False# 輸出的編碼格式,由於Excel預設是ANSI編碼,所以這裡保持一致# 如果有其他編碼需求如utf-8等可自行更改FEED_EXPORT_ENCODING = ‘ANSI‘# 增加爬取延遲,降低被耙梳站伺服器壓力DOWNLOAD_DELAY = 0.01# 爬取的新聞條數上限CLOSESPIDER_ITEMCOUNT = 500# 下載逾時設定,超過10秒沒響應則放棄當前URLDOWNLOAD_TIMEOUT = 100ITEM_PIPELINES = {    ‘scrapyspider.pipelines.ScrapyspiderPipeline‘: 300,# pipeline中的類名}

②運行爬蟲並儲存新聞內容

爬取下來的新聞內容及評論需要格式化儲存,如果在IDE中運行debug指令碼,則效果如下:

爬取後會儲存為.csv檔案,使用Excel開啟即可查看:

③如果需要將評論單獨提取出來,可以使用csv_process.py,效果如下:

四、其他補充

暫時沒有

代碼下載:http://www.demodashi.com/demo/13933.html註:本文著作權歸作者,由demo大師發表,拒絕轉載,轉載需要作者授權

 

基於Scrapy架構的Python新聞爬蟲

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.