基於Scrapy框架的Python新聞爬蟲


概述

該項目是基於Scrapy框架的Python新聞爬蟲,能夠爬取網易,搜狐,鳳凰和澎湃網站上的新聞,將標題,內容,評論,時間等內容整理並保存到本地

詳細

一、開發背景

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

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

二、爬蟲效果

1、標題

image.png

2、內容

image.png

3、評論

image.png

4、日期,熱度和ID

image.png

5、程序運行圖

image.png

三、具體開發

1、任務需求

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

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

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

 

2、功能設計

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

2. 定時運行網絡爬蟲,實現每日更新數據

 

3、系統架構

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

Scrapy

綠線是數據流向,

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

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

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

(4)最后將所有數據輸出並保存為文件

4、實際項目

(1)項目結構

image.png

可以看到,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/'
    ]
    #正則表達式表示可以繼續訪問的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

根據正則表達式匹配頁面內容中的日期信息:

'''通用日期處理函數'''
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
# 這里改成爬蟲項目的絕對路徑,防止出現路徑搜索的bug
sys.path.append('E:\Python\以前的項目\\NewsSpider-master\scrapyspider')

# 爬蟲名稱
BOT_NAME = 'scrapyspider'

# 設置是否服從網站的爬蟲規則
ROBOTSTXT_OBEY = True

# 同時並發請求數,越大則爬取越快同時負載也大
CONCURRENT_REQUESTS = 32

#禁止cookies,防止被ban
COOKIES_ENABLED = False

# 輸出的編碼格式,由於Excel默認是ANSI編碼,所以這里保持一致
# 如果有其他編碼需求如utf-8等可自行更改
FEED_EXPORT_ENCODING = 'ANSI'

# 增加爬取延遲,降低被爬網站服務器壓力
DOWNLOAD_DELAY = 0.01

# 爬取的新聞條數上限
CLOSESPIDER_ITEMCOUNT = 500

# 下載超時設定,超過10秒沒響應則放棄當前URL
DOWNLOAD_TIMEOUT = 100
ITEM_PIPELINES = {
    'scrapyspider.pipelines.ScrapyspiderPipeline': 300,# pipeline中的類名
}

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

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

image.png

爬取后會保存為.csv文件,使用Excel打開即可查看:

image.png

image.png

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

image.png

四、其他補充

暫時沒有

注:本文著作權歸作者,由demo大師發表,拒絕轉載,轉載需要作者授權

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM