爬蟲(chóng)實(shí)戰(zhàn)——爬取大麥網(wǎng)

前兩天國(guó)慶,朋友在看中國(guó)好聲音,出于對(duì)周杰倫以及李健的喜愛(ài),朋友想去鳥(niǎo)巢看10月7號(hào)的巔峰之夜,于是...我上了大麥網(wǎng)查看票價(jià),但是出于職業(yè)病,不小心就按下了F12,就有了這個(gè)項(xiàng)目

言歸正傳,爬取大麥網(wǎng)

經(jīng)過(guò)反復(fù)點(diǎn)擊發(fā)現(xiàn),大麥網(wǎng)在經(jīng)過(guò)多次點(diǎn)擊之后,會(huì)出現(xiàn)需要登錄的情況,因此,通過(guò)這點(diǎn)分析,我們需要登錄的cookie

老套路,直接上代碼

不愿意看代碼的,可以直接跳過(guò),看最后的總結(jié)

import requests
import json
import csv


class Spider(object):
    # 構(gòu)造請(qǐng)求頭等
    def __init__(self):
        self.url = "https://search.damai.cn/searchajax.html"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
            "cookie": "_uab_collina=153898386691021526720657; _umdata=70CF403AFFD707DFEB6BA57C56CA3B13E7BD5DAF561D420C384FF4DA75A62F56B2225CEC1DD4846FCD43AD3E795C914C46F57A339EDEC74F7006D0CE8CD77F14; x5sec=7b226d65632d67756964652d7765623b32223a226639303431366238343735643836656338393965393365656533303433646662434f3669374e3046454b2f666a7476302f7244356a41453d227d; cna=b0mIEx9fXWcCAQ6CznyYZjAe; cookie2=18204ab51d2bd14a7326dab901c58057; t=37103c62b8274bb5769837840f8b71a8; _tb_token_=36ed1e7aee13e; x_hm_tuid=PN4CfOch3fJ1yW4MpI+z3hZhs9u9ODTzpfGE7AtbNvax7kg+GG7r3wFIj/ihN/iG; _hvn_login=18; csg=6be6a003; munb=4199098224; damai.cn_nickName=MeisterLee; damai.cn_user=gz4HkAnuV3BDKOniG3I4tVZ2WybxgALVJu0CZ2Xkbi57+SBwd++X2SrBbVRAeGWUGxb2+Rjuqig=; damai.cn_user_new=gz4HkAnuV3BDKOniG3I4tVZ2WybxgALVJu0CZ2Xkbi57%2BSBwd%2B%2BX2SrBbVRAeGWUGxb2%2BRjuqig%3D; h5token=9ccd095300bc4588a090b771e8418b2b_1_1; damai_cn_user=gz4HkAnuV3BDKOniG3I4tVZ2WybxgALVJu0CZ2Xkbi57%2BSBwd%2B%2BX2SrBbVRAeGWUGxb2%2BRjuqig%3D; loginkey=9ccd095300bc4588a090b771e8418b2b_1_1; user_id=116768239; isg=BNfX8KBwQJVhx8QVBH4OF8nuZksr4qxma9qAKCkEQKYNWPSaMO1Azkg-vr5isIP2",
            "referer": "https://search.damai.cn/search.htm?ctl=%20%20%20&order=1&cty="
        }
        self.data = {
            "cty": "北京",
            "ctl": "演唱會(huì)",
            "tsg": "0",
            "order": "1"
        }
        self.data_key = None
        # 構(gòu)造IP代理(按需求開(kāi)啟)
        # proxies = {
        #     "http": "http://47.93.56.0:3128",
        #     "http": "http://39.135.24.12:80",
        # }

    # 請(qǐng)求url獲取響應(yīng)
    def get(self):
        response = requests.post(url=self.url, headers=self.headers, data=self.data)
        # 測(cè)試
        # print(response.text)
        return response

    # 解析數(shù)據(jù)
    def parse(self):
        # 將字符串?dāng)?shù)據(jù)轉(zhuǎn)換成字典數(shù)據(jù)
        dict_data = json.loads(self.get().text)

        # 測(cè)試字典數(shù)據(jù)是否能解析出來(lái)
        # print(dict_data["pageData"]["resultData"])

        # 將需要的爬取的字典數(shù)據(jù)存儲(chǔ)在變量中
        need_spider_data = dict_data["pageData"]["resultData"]
        # print(need_spider_data)
        # 構(gòu)造存儲(chǔ)頭列表,第一種方法
        data_key = []
        for item in need_spider_data[0]:
            data_key.append(item)

        # 打印測(cè)試
        # print(data_key)
        self.data_key = data_key

        # # 第二種方法
        # data_keys = need_spider_data[0].keys()
        #
        # # 打印測(cè)試
        # print(data_keys)
        return need_spider_data

    # 保存為CSV數(shù)據(jù)
    def save(self):
        # 構(gòu)建屬性列表
        # list = ['actors', 'categoryname', 'cityname', 'description', 'price', 'pricehigh', 'showstatus', 'showtime', 'subcategoryname', 'venue', 'venuecity', 'verticalPic']
        list = self.data_key

        # 此處出現(xiàn)保存,報(bào)錯(cuò)為缺少字段,因此追加一個(gè)字段
        list.append('favourable')
        # 測(cè)試list
        print(list)

        # 數(shù)據(jù)
        my_data = self.parse()
        # 測(cè)試
        print(my_data)

        with open("damaiwang" + ".csv", "w", newline="", encoding='utf8') as f:
            # 傳入頭數(shù)據(jù),即第一行數(shù)據(jù)
            writer = csv.DictWriter(f, list)
            writer.writeheader()
            for row in my_data:
                writer.writerow(row)


    # # 保存為字典數(shù)據(jù)
    # def save_dict(self):
    #     with open("damaiwang", 'w', encoding='utf8') as f:
    #         f.write(str(self.parse()))




if __name__ == '__main__':
    spider = Spider()
    # spider.run()
    spider.parse()
    spider.save()

在代碼中我做了相應(yīng)的注釋?zhuān)a還可以繼續(xù)優(yōu)化,這里使用的cookie是我自己登錄之后的cookie,代碼在使用過(guò)程中,需要換成自己的cookie

遇到的問(wèn)題總結(jié)
  • 這個(gè)爬蟲(chóng)相對(duì)來(lái)說(shuō),是最基礎(chǔ)也是最簡(jiǎn)單的,但是難點(diǎn)在于,如果要對(duì)數(shù)據(jù)做數(shù)據(jù)分析,就大概率的得把數(shù)據(jù)轉(zhuǎn)化成CSV格式的文件進(jìn)行保存,雖然在公司中并不是這么操作(一般直接存進(jìn)數(shù)據(jù)庫(kù)),對(duì)于個(gè)人項(xiàng)目來(lái)說(shuō),存成本地的CSV格式的文件就必不可少了。

  • 保存成CSV格式的文件有很多辦法,首先,最愚蠢(大智若愚)的辦法就是遍歷數(shù)據(jù),把數(shù)據(jù)用逗號(hào)隔開(kāi),這種辦法雖然看起來(lái)非常愚蠢,但是,我不得不給一個(gè)中肯的評(píng)價(jià),有時(shí)候,在數(shù)據(jù)雜亂無(wú)章的時(shí)候,這是唯一的解決辦法(實(shí)話說(shuō),網(wǎng)上有很多辦法解決格式轉(zhuǎn)化問(wèn)題,但數(shù)據(jù)是千奇百怪的,我們很難預(yù)知我們爬取到的數(shù)據(jù)長(zhǎng)什么樣子),這也是我目前還在探索的一個(gè)知識(shí)點(diǎn),畢竟寫(xiě)程序最重要的還是解決問(wèn)題,代碼不能提高人工的生產(chǎn)率,要程序何用?

  • 言歸正傳,這里我調(diào)用了Python的內(nèi)置庫(kù)——CSV,感興趣的伙伴可以上網(wǎng)查看一下這個(gè)庫(kù)的其他用法,這里我個(gè)人覺(jué)得能解決一時(shí)的問(wèn)題,但終歸不是一個(gè)長(zhǎng)久之計(jì)

over~ peace~

個(gè)人博客地址:www.limiao.tech

公眾號(hào):TechBoard

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,302評(píng)論 2 89
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 13,990評(píng)論 2 59
  • 有的人喜歡把卡片當(dāng)作收藏知識(shí)的工具,而我則喜歡把卡片當(dāng)作創(chuàng)造作品的工具。 如何用卡片生成自己的知識(shí)樹(shù)?如何分享自己...
    陳素封閱讀 885評(píng)論 3 21
  • day1 今天看了原則的序言、目錄、導(dǎo)言、結(jié)語(yǔ)和附錄。本書(shū)由3部分組成:作者達(dá)利歐的經(jīng)歷、生活原則和工作原則。通過(guò)...
    蟲(chóng)子09閱讀 346評(píng)論 1 1
  • 今天是十五天,我發(fā)現(xiàn)自己越陷越深了。。
    過(guò)高易折閱讀 197評(píng)論 0 0

友情鏈接更多精彩內(nèi)容