前兩天國(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