一、分析背景:
1,為什么要選擇虎嗅
「關於虎嗅」虎嗅網創辦於 2012 年 5 月,是一個聚合優質創新信息與人群的新媒體平台。
2,分析內容
- 分析虎嗅網 5 萬篇文章的基本情況,包括收藏數、評論數等;
- 發掘最受歡迎和最不受歡迎的文章及作者;
- 分析文章標題形式(長度、句式)與受歡迎程度之間的關系;
- 展現近些年科技互聯網行業的熱門詞匯
3,分析工具:
python3.6
scrapy
MongoDB
Matplotlib
WordCloud
Jieba
數據抓取
使用scrapy抓取了虎嗅網的主頁文章,文章抓取時間為2012年建站至2018年12月7日共計約5 萬篇文章。抓取 了 8 個字段信息:文章標題、作者、發文時間、評論數、收藏數、摘要,文章鏈接和文章內容。
1.目標網站分析
這是要爬取的 網頁界面,可以看到是通過 AJAX 加載的。
F12打開開發者工具,可以看到 URL 請求是 POST 類型,下拉到底部查看 Form Data,表單需提交參數只有 3 項。經嘗試, 只提交 page 參數就能成功獲取頁面的信息,其他兩項參數無關緊要,所以構造分頁爬取非常簡單。
接着,切換選項卡到 Preview 和 Response 查看網頁內容,可以看到數據都位於 data 字段里。total_page 為 2119,表示一共有 2119 頁的文章內容,每一頁有 25 篇文章,總共約 5 萬篇,也就是我們要爬取的數量。
Scrapy介紹
Scrapy 是用純 Python 實現一個為了爬取網站數據、提取結構性數據而編寫的應用框架,用途非常廣泛。框架的力量,用戶只需要定制開發幾個模塊就可以輕松的實現一個爬蟲,用來抓取網頁內容以及各種圖片,非常之方便。Scrapy 使用了 Twisted['twɪstɪd](其主要對手是 Tornado)異步網絡框架來處理網絡通訊,可以加快我們的下載速度,不用自己去實現異步框架,並且包含了各種中間件接口,可以靈活的完成各種需求。
scrapy是如何幫助我們抓取數據的呢?
scrapy框架的工作流程:
1.首先Spiders(爬蟲)將需要發送請求的url(requests)經ScrapyEngine(引擎)交給Scheduler(調度器)。
2.Scheduler(排序,入隊)處理后,經ScrapyEngine,DownloaderMiddlewares(可選,主要有User_Agent, Proxy代理)交給Downloader。
3.Downloader向互聯網發送請求,並接收下載響應(response)。將響應(response)經ScrapyEngine,SpiderMiddlewares(可選)交給Spiders。
4.Spiders處理response,提取數據並將數據經ScrapyEngine交給ItemPipeline保存(可以是本地,可以是數據庫)。
5. 提取url重新經ScrapyEngine交給Scheduler進行下一個循環。直到無Url請求程序停止結束。
實現代碼
創建項目
scrapy startproject 項目名
scrapy genspider 爬蟲名 網址
這里,首先定義了一個 HuxiuV1Spider 主類,整個爬蟲項目都主要在該類下完成。 接着,可以將爬蟲基本的一些基本配置,比如:Headers、代理等設置寫在下面的 headers 屬性中。
由於 URL 是 POST 請求,所以我們還需要使用formdata={'page':str(i)}來將FormData中的表單參數添加進去,這里我們需要設置為 POST;formdata 是 POST 請求表單參數,只需要添加一個 page 參數即可。接着,通過 callback 參數定義一個 parse() 方法,用來解析 URL 成功后返回的 Response 響應。在后面的 parse() 方法中,可以使用 re,xpath提取響應中的所需內容。
這里我們利用正則表達式提取出文章標題,鏈接,作者等所需信息,這里將數據保存為list數據,便於后續存儲到mongo數據庫中。
成功得到所需數據,然后就可以保存了,可以選擇輸出為csv,MySQL,mongoDB,這里我們選擇mongoDB數據庫

1 # -*- coding: utf-8 -*- 2 # from scrapy.spider import CrawlSpider 3 from selenium import webdriver 4 import time 5 from scrapy.linkextractors import LinkExtractor 6 from scrapy.spiders import CrawlSpider, Rule 7 # import json 8 from datetime import datetime 9 from ..items import HuxiuItem 10 from scrapy.http import FormRequest 11 import scrapy 12 import json,re 13 class HuxiuV1Spider(scrapy.Spider): 14 name = 'huxiu_v1' 15 allowed_domains = ['huxiu.com'] 16 headers={ 17 'Referer': 'https://www.huxiu.com/index.php/', 18 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36' 19 } 20 #post 21 #Form data 22 # page: 2 23 def start_requests(self): 24 url='https://www.huxiu.com/v2_action/article_list' 25 requests=[] 26 for i in range(2,2119): 27 formdata={ 28 'page':str(i) 29 } 30 request=FormRequest(url,callback=self.parse,formdata=formdata,headers=self.headers) 31 requests.append(request) 32 return requests 33 def parse(self, response): 34 js=json.loads(response.body.decode()) 35 # print(js) 36 req = str(js) 37 idd = re.findall(r'data-aid="(.*?)">', req)#未處理的url(id) 38 title = re.findall(r'class="transition msubstr-row2" target="_blank">(.*?)</a></h2>', req)#標題 39 auth = re.findall(r'class="author-name">(.*?)</span>', req)#作者 40 pinglun = re.findall(r'<i class="icon icon-cmt"></i><em>(.*?)</em>', req)#評論 41 shoucang = re.findall(r'<i class="icon icon-fvr"></i><em>(.*?)</em>', req)#收藏 42 zhaiyao = re.findall(r'<div class="mob-sub">(.*?)</div>', req)#未處理的摘要 43 digect = []#摘要 44 for i in zhaiyao: 45 s = i[34:-12] 46 if 'span' in i: 47 s = i[104:-12] 48 digect.append(s) 49 # print(digect) 50 # print(title) 51 detail_url=[] 52 for i in idd: 53 burl = 'https://www.huxiu.com/article/{}.html'.format(i) 54 detail_url.append(burl) 55 # print(detail_url) 56 for i in range(len(idd)): 57 item=HuxiuItem() 58 item['title']=title[i] 59 item["auth"]=auth[i] 60 item['detail_url']=detail_url[i] 61 item['pinglun']=pinglun[i] 62 item['shoucang']=shoucang[i] 63 item['zhaiyao']=digect[i] 64 print(detail_url[i]) 65 # yield item 66 yield scrapy.Request(url=detail_url[i],meta={'meta1':item},callback=self.pasre_item) 67 def pasre_item(self,response): 68 meta1=response.meta['meta1'] 69 # print('hello') 70 time=response.xpath('//span[@class="article-time pull-left"]/text()|//span[@class="article-time"]/text()').extract() 71 content=response.xpath('//div[@class="article-content-wrap"]/p/text()|//div[@class="article-content-wrap"]/div/text()|//div[@class="article-content-wrap"]/div/span/text()').extract() 72 print(time) 73 ssss='' 74 for i in content: 75 ssss+=i 76 # num = response.xpath('//div[@class="author-article-pl"]/ul/li/a/text()') 77 # wnums='' 78 # for i in num: 79 # wnums = i[:-3] 80 # print(wnums) 81 for i in range(len(time)): 82 item = HuxiuItem() 83 item['title']=meta1['title'] 84 item['auth']=meta1['auth'] 85 item['detail_url']=meta1['detail_url'] 86 item['pinglun']=meta1['pinglun'] 87 item['shoucang']=meta1['shoucang'] 88 item['zhaiyao']=meta1['zhaiyao'] 89 item['time']=time[i] 90 # item['wnums']=num 91 item['content']=ssss 92 93 yield item

1 # -*- coding: utf-8 -*- 2 3 # Define here the models for your scraped items 4 # 5 # See documentation in: 6 # https://doc.scrapy.org/en/latest/topics/items.html 7 8 import scrapy 9 10 11 class HuxiuItem(scrapy.Item): 12 # define the fields for your item here like: 13 # name = scrapy.Field() 14 title = scrapy.Field() 15 auth = scrapy.Field() 16 detail_url = scrapy.Field() 17 pinglun = scrapy.Field() 18 shoucang = scrapy.Field() 19 zhaiyao = scrapy.Field() 20 time = scrapy.Field() 21 content=scrapy.Field() 22 # wnums=scrapy.Field()

1 # -*- coding: utf-8 -*- 2 3 # Define here the models for your scraped items 4 # 5 # See documentation in: 6 # https://doc.scrapy.org/en/latest/topics/items.html 7 8 import scrapy 9 10 11 class HuxiuItem(scrapy.Item): 12 # define the fields for your item here like: 13 # name = scrapy.Field() 14 title = scrapy.Field() 15 auth = scrapy.Field() 16 detail_url = scrapy.Field() 17 pinglun = scrapy.Field() 18 shoucang = scrapy.Field() 19 zhaiyao = scrapy.Field() 20 time = scrapy.Field() 21 content=scrapy.Field() 22 # wnums=scrapy.Field()

1 BOT_NAME = 'huxiu' 2 3 SPIDER_MODULES = ['huxiu.spiders'] 4 NEWSPIDER_MODULE = 'huxiu.spiders' 5 6 7 # Crawl responsibly by identifying yourself (and your website) on the user-agent 8 #USER_AGENT = 'huxiu (+http://www.yourdomain.com)' 9 USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36' 10 11 # Obey robots.txt rules 12 ROBOTSTXT_OBEY = False 13 14 ITEM_PIPELINES = { 15 'huxiu.pipelines.HuxiuPipeline': 300, 16 } 17 18 LOG_FILE='huxiu_v1.log' 19 LOG_ENABLED=True #默認啟用日志 20 LOG_ENCODING='UTF-8'#日志的編碼,默認為’utf-8‘ 21 LOG_LEVEL='DEBUG'#日志等級:ERROR\WARNING\INFO\DEBUG 22 23 setting
以上,就完成了數據的獲取。有了數據我們就可以着手分析,不過這之前還需簡單地進行一下數據的清洗、處理。