1. 程式人生 > >爬取虎嗅網,並對爬取數據進行分析

爬取虎嗅網,並對爬取數據進行分析

ror range class index 關於 def mob 文章內容 gin

一、分析背景:

1,為什麽要選擇虎嗅

  「關於虎嗅」虎嗅網創辦於 2012 年 5 月,是一個聚合優質創新信息與人群的新媒體平臺。

2,分析內容

  1. 分析虎嗅網 5 萬篇文章的基本情況,包括收藏數、評論數等;
  2. 發掘最受歡迎和最不受歡迎的文章及作者;
  3. 分析文章標題形式(長度、句式)與受歡迎程度之間的關系;
  4. 展現近些年科技互聯網行業的熱門詞匯

3,分析工具:

      python3.6

      scrapy

      MongoDB

      Matplotlib

      WordCloud

      Jieba

數據抓取

使用scrapy抓取了虎嗅網的主頁文章,文章抓取時間為2012年建站至2018年12月7日共計約5 萬篇文章。抓取 了 7 個字段信息:文章標題、作者、發文時間、評論數、收藏數、摘要,文章鏈接和文章內容。

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 爬蟲名 網址

技術分享圖片

技術分享圖片

技術分享圖片
 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(rdata-aid="(.*?)">, req)#未處理的url(id)
38         title = re.findall(rclass="transition msubstr-row2" target="_blank">(.*?)</a></h2>, req)#標題
39         auth = re.findall(rclass="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
spider

技術分享圖片
 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()
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()
pipelines

技術分享圖片
 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
setting

以上,就完成了數據的獲取。有了數據我們就可以著手分析,不過這之前還需簡單地進行一下數據的清洗、處理。

技術分享圖片

爬取虎嗅網,並對爬取數據進行分析