91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python爬蟲入門【18】: 36氪(36kr)數據抓取 scrapy

發布時間:2020-07-18 18:59:07 來源:網絡 閱讀:287 作者:學Python派森 欄目:編程語言

1. 36氪(36kr)數據----寫在前面

今天抓取一個新聞媒體,36kr的文章內容,也是為后面的數據分析做相應的準備

36kr 讓一部分人先看到未來,而你今天要做的事情確實要抓取它的過去。

網址 https://36kr.com/

Python爬蟲入門【18】: 36氪(36kr)數據抓取 scrapy

2. 36氪(36kr)數據----數據分析

36kr的頁面是一個瀑布流的效果,當你不斷的下拉頁面的時候,數據從后臺追加過來,基于此,基本可以判斷它是ajax異步的數據,只需要打開開發者工具,就能快速的定位到想要的數據,我們嘗試一下!

Python爬蟲入門【18】: 36氪(36kr)數據抓取 scrapy

捕獲鏈接如下

https://36kr.com/api/search-column/mainsite?per_page=20&page=1&_=1543840108547
https://36kr.com/api/search-column/mainsite?per_page=20&page=2&_=1543840108547
https://36kr.com/api/search-column/mainsite?per_page=20&page=3&_=1543840108547
https://36kr.com/api/search-column/mainsite?per_page=20&page=4&_=1543840108547

在多次嘗試之后,發現per_page最大可以擴展到300,但是當大于100的數據,返回的數據并不是很理想,所以,我們擬定為100即可,page就是頁碼,這個不斷循環疊加即可。

Python爬蟲入門【18】: 36氪(36kr)數據抓取 scrapy

上面的參數還有一個更加重要的值,叫做total_count 總共有多少文章數目。有這個參數,我們就能快速的拼接出來,想要的頁碼了。

3. 36氪(36kr)數據----創建scrapy項目

scrapy startproject kr36 

4. 36氪(36kr)數據----創建爬蟲入口頁面

scrapy genspider Kr36 "www.gaokaopai.com"
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這里是Python學習者的聚集地,零基礎,進階,都歡迎

5. 36氪(36kr)數據----編寫url生成器

頁面起始地址start_urls為第一頁數據,之后會調用parse函數,在函數內容,我們去獲取total_count這個參數
這個地方,需要注意 yield 返回數據為Request() 關于他的詳細說明,請參照
https://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/request-response.html

所有參數清單,參數名字起得好,基本都能代表所有的意思了。比較重要的是urlcallback

class scrapy.http.Request(url[, callback, method='GET', headers, body, cookies, meta, encoding='utf-8', priority=0, dont_filter=False, errback])
class Kr36Spider(scrapy.Spider):
    name = 'Kr36'
    allowed_domains = ['36kr.com']

    start_urls = ['https://36kr.com/api/search-column/mainsite?per_page=100&page=1&_=']
    def parse(self, response):
        data = json.loads(response.body_as_unicode())
        totle = int(data["data"]["total_count"])
        #totle = 201

        for page in range(2,int(totle/100)+2):
            print("正在爬取{}頁".format(page),end="")
            yield Request("https://36kr.com/api/search-column/mainsite?per_page=100&page={}&_=".format(str(page)), callback=self.parse_item)

6. 36氪(36kr)數據----解析數據

在解析數據過程中,發現有時候數據有缺失的情況發生,所以需要判斷一下 app_views_countmobile_views_countviews_countfavourite_num 是否出現在字典中。

注意下面代碼中的Kr36Item類,這個需要提前創建一下

Kr36Item


class Kr36Item(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    app_views_count = scrapy.Field() # APP觀看數量
    mobile_views_count = scrapy.Field() # 移動端觀看數量
    views_count = scrapy.Field() # PC觀看數量
    column_name = scrapy.Field() # 類別
    favourite_num = scrapy.Field() # 收藏數量
    title = scrapy.Field() # 標題
    published_at = scrapy.Field() # 發布時間
    is_free = scrapy.Field() # 是否免費
    username = scrapy.Field()
    def parse_item(self,response):

        data = json.loads(response.body_as_unicode())
        item = Kr36Item()
        for one_item in data["data"]["items"]:
            print(one_item)
            item["app_views_count"] = one_item["app_views_count"] if "app_views_count" in one_item else 0# APP觀看數量
            item["mobile_views_count"] = one_item["mobile_views_count"]  if "mobile_views_count" in one_item else 0 # 移動端觀看數量
            item["views_count"] = one_item["views_count"]  if "views_count" in one_item else 0  # PC觀看數量
            item["column_name"] = one_item["column_name"]  # 類別
            item["favourite_num"] = one_item["favourite_num"]  if "favourite_num" in one_item else 0  # 收藏數量
            item["title"] = one_item["title"] # 標題
            item["published_at"] = one_item["published_at"]  # 發布時間
            item["is_free"] = one_item["is_free"] if "is_free" in one_item else 0# 是否免費
            item["username"] = json.loads(one_item["user_info"])["name"]
            yield item

最后打開settings.py中的pipelines編寫數據持久化代碼

ITEM_PIPELINES = {
   'kr36.pipelines.Kr36Pipeline': 300,
}
import os
import csv

class Kr36Pipeline(object):
    def __init__(self):
        store_file = os.path.dirname(__file__)+'/spiders/36kr.csv'
        self.file = open(store_file,"a+",newline="",encoding="utf_8_sig")
        self.writer = csv.writer(self.file)
    def process_item(self, item, spider):
        try:
            self.writer.writerow((
                item["title"],
                item["app_views_count"],
                item["mobile_views_count"],
                item["views_count"],
                item["column_name"],
                item["favourite_num"],
                item["published_at"],
                item["is_free"],
                item["username"]
            ))
            print("數據存儲完畢")
        except Exception as e:
            print(e.args)

    def close_spider(self,spider):
        self.file.close()
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這里是Python學習者的聚集地,零基礎,進階,都歡迎

7. 36氪(36kr)數據----獲取數據

運行上述代碼,沒有做過多的處理,也沒有調整并發速度,也沒有做反爬措施。跑了一下,大概獲取到了69936條數據,和預估的差了300多條,問題不大,原因沒細查。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德化县| 枣强县| 青岛市| 秭归县| 伊吾县| 大理市| 陆良县| 临武县| 潜山县| 藁城市| 永寿县| 安义县| 吉木乃县| 浦北县| 山东| 兴宁市| 吉木萨尔县| 历史| 连江县| 安龙县| 洮南市| 陇南市| 榆中县| 莲花县| 曲沃县| 南昌县| 芮城县| 建昌县| 霞浦县| 繁峙县| 延庆县| 武陟县| 新建县| 务川| 中方县| 鹿邑县| 湘西| 象州县| 德令哈市| 高密市| 紫云|