半次元COS圖爬取-寫(xiě)在前面
今天在瀏覽網(wǎng)站的時(shí)候,忽然一個(gè)莫名的鏈接指引著我跳轉(zhuǎn)到了半次元網(wǎng)站
https://bcy.net/
打開(kāi)之后,發(fā)現(xiàn)也沒(méi)有什么有意思的內(nèi)容,職業(yè)的敏感讓我瞬間聯(lián)想到了
cosplay
,這種網(wǎng)站必然會(huì)有這個(gè)的存在啊,于是乎,我準(zhǔn)備好我的大爬蟲(chóng)了。
把上面的鏈接打開(kāi)之后,被我發(fā)現(xiàn)了吧,就知道我的第八感不錯(cuò)滴。接下來(lái)就是找入口,一定要找到圖片鏈接的入口才可以做下面的操作
這個(gè)頁(yè)面不斷往下拖拽,頁(yè)面會(huì)一直加載,當(dāng)時(shí)當(dāng)你拖拽一會(huì),就停下來(lái)了,就是這個(gè)時(shí)機(jī)
發(fā)現(xiàn)入口,在我實(shí)際的操作中,其實(shí)還發(fā)現(xiàn)了很多其他的入口,這個(gè)就不一一的解釋了,趕緊上車(chē),進(jìn)入
view more
之后,發(fā)現(xiàn)了頁(yè)面依舊是一個(gè)下拉刷新的布局方式,專業(yè)術(shù)語(yǔ)
瀑布流
。
半次元COS圖爬取-python爬蟲(chóng)第一步
打開(kāi)開(kāi)發(fā)者工具,切換到
network
之后,發(fā)現(xiàn) 很多
xhr
請(qǐng)求,發(fā)現(xiàn)這個(gè),就代表這個(gè)網(wǎng)站很容易爬取了
提取待爬取的鏈接,分析規(guī)律
https://bcy.net/circle/timeline/loadtag?since=0&grid_type=timeline&tag_id=1482&sort=hot
https://bcy.net/circle/timeline/loadtag?since=26499.779&grid_type=timeline&tag_id=1482&sort=hot
https://bcy.net/circle/timeline/loadtag?since=26497.945&grid_type=timeline&tag_id=1482&sort=hot
發(fā)現(xiàn)只有一個(gè)參數(shù)在變,而且這變化好像沒(méi)有任何規(guī)律可以尋找,沒(méi)事,看數(shù)據(jù),你就可以發(fā)現(xiàn)其中的奧妙了
這個(gè)網(wǎng)站的原理很簡(jiǎn)單,就是通過(guò)不斷獲取每次數(shù)據(jù)的最后一條的
since
然后獲取接下來(lái)的數(shù)據(jù),那么我們按照它的規(guī)律實(shí)現(xiàn)代碼就可以了,不要多線程了,這種規(guī)律是沒(méi)有辦法進(jìn)行實(shí)操的。
這次的數(shù)據(jù)我把它存儲(chǔ)到
mongodb
里面,因?yàn)闆](méi)有辦法一次全部獲取到,所以可能需要下次在繼續(xù)使用
if __name__ == '__main__':
### mongodb 的一些基本操作
DATABASE_IP = '127.0.0.1'
DATABASE_PORT = 27017
DATABASE_NAME = 'sun'
start_url = "https://bcy.net/circle/timeline/loadtag?since={}&grid_type=timeline&tag_id=399&sort=recent"
client = MongoClient(DATABASE_IP, DATABASE_PORT)
db = client.sun
db.authenticate("dba", "dba")
collection = db.bcy # 準(zhǔn)備插入數(shù)據(jù)
#####################################3333
get_data(start_url,collection)
Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎
獲取網(wǎng)頁(yè)數(shù)據(jù)這個(gè)地方,由我們前面的經(jīng)驗(yàn)就變得很簡(jiǎn)單了
## 半次元COS圖爬取-獲取數(shù)據(jù)函數(shù)
def get_data(start_url,collection):
since = 0
while 1:
try:
with requests.Session() as s:
response = s.get(start_url.format(str(since)),headers=headers,timeout=3)
res_data = response.json()
if res_data["status"] == 1:
data = res_data["data"] # 獲取Data數(shù)組
time.sleep(0.5)
## 數(shù)據(jù)處理
since = data[-1]["since"] # 獲取20條數(shù)據(jù)的最后一條json數(shù)據(jù)中的since
ret = json_handle(data) # 代碼實(shí)現(xiàn)在下面
try:
print(ret)
collection.insert_many(ret) # 批量出入數(shù)據(jù)庫(kù)
print("上述數(shù)據(jù)插入成功!!!!!!!!")
except Exception as e:
print("插入失敗")
print(ret)
##
except Exception as e:
print("!",end="異常,請(qǐng)注意")
print(e,end=" ")
else:
print("循環(huán)完畢")
網(wǎng)頁(yè)解析代碼
# 對(duì)JSON數(shù)據(jù)進(jìn)行處理
def json_handle(data):
# 提取關(guān)鍵數(shù)據(jù)
list_infos = []
for item in data:
item = item["item_detail"]
try:
avatar = item["avatar"] # 用戶頭像
item_id = item["item_id"] # 圖片詳情頁(yè)面
like_count = item["like_count"] # 喜歡數(shù)目
pic_num = item["pic_num"] if "pic_num" in item else 0 # 圖片總數(shù)
reply_count =item["reply_count"]
share_count =item["share_count"]
uid = item["uid"]
plain = item["plain"]
uname = item["uname"]
list_infos.append({"avatar":avatar,
"item_id":item_id,
"like_count":like_count,
"pic_num":pic_num,
"reply_count":reply_count,
"share_count":share_count,
"uid":uid,
"plain":plain,
"uname":uname})
except Exception as e:
print(e)
continue
return list_infos
Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎
到現(xiàn)在就實(shí)現(xiàn)了,代碼跑起來(lái)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
