Python爬蟲入門教程 29-100 手機APP數據抓取 pyspider
阿新 • • 發佈:2019-01-23
.text 數字 http 默認 dex text obi database size
1. 手機APP數據----寫在前面
繼續練習pyspider的使用,最近搜索了一些這個框架的一些使用技巧,發現文檔竟然挺難理解的,不過使用起來暫時沒有障礙,估摸著,要在寫個5篇左右關於這個框架的教程。今天教程中增加了圖片的處理,你可以重點學習一下。
2. 手機APP數據----頁面分析
咱要爬取的網站是 http://www.liqucn.com/rj/new/
這個網站我看了一下,有大概20000頁,每頁數據是9個,數據量大概在180000左右,可以抓取下來,後面做數據分析使用,也可以練習優化數據庫。
網站基本沒有反爬措施,上去爬就可以,略微控制一下並發,畢竟不要給別人服務器太大的壓力。
頁面經過分析之後,可以看到它是基於URL進行的分頁,這就簡單了,我們先通過首頁獲取總頁碼,然後批量生成所有頁碼即可
http://www.liqucn.com/rj/new/?page=1
http://www.liqucn.com/rj/new/?page=2
http://www.liqucn.com/rj/new/?page=3
http://www.liqucn.com/rj/new/?page=4
獲取總頁碼的代碼
class Handler(BaseHandler): crawl_config = { } @every(minutes=24 * 60) def on_start(self): self.crawl('http://www.liqucn.com/rj/new/?page=1', callback=self.index_page) @config(age=10 * 24 * 60 * 60) def index_page(self, response): # 獲取最後一頁的頁碼 totle = int(response.doc(".current").text()) for page in range(1,totle+1): self.crawl('http://www.liqucn.com/rj/new/?page={}'.format(page), callback=self.detail_page)
然後copy一段官方中文翻譯,過來,時刻提醒自己
代碼簡單分析: def on_start(self) 方法是入口代碼。當在web控制臺點擊run按鈕時會執行此方法。 self.crawl(url, callback=self.index_page)這個方法是調用API生成一個新的爬取任務, 這個任務被添加到待抓取隊列。 def index_page(self, response) 這個方法獲取一個Response對象。 response.doc是pyquery對象的一個擴展方法。pyquery是一個類似於jQuery的對象選擇器。 def detail_page(self, response)返回一個結果集對象。 這個結果默認會被添加到resultdb數據庫(如果啟動時沒有指定數據庫默認調用sqlite數據庫)。你也可以重寫 on_result(self,result)方法來指定保存位置。 更多知識: @every(minutes=24*60, seconds=0) 這個設置是告訴scheduler(調度器)on_start方法每天執行一次。 @config(age=10 * 24 * 60 * 60) 這個設置告訴scheduler(調度器)這個request(請求)過期時間是10天, 10天內再遇到這個請求直接忽略。這個參數也可以在self.crawl(url, age=10*24*60*60) 和 crawl_config中設置。 @config(priority=2) 這個是優先級設置。數字越大越先執行。
分頁數據已經添加到待爬取隊列中去了,下面開始分析爬取到的數據,這個在detail_page
函數實現
@config(priority=2)
def detail_page(self, response):
docs = response.doc(".tip_blist li").items()
dicts = []
for item in docs:
title = item(".tip_list>span>a").text()
pubdate = item(".tip_list>i:eq(0)").text()
info = item(".tip_list>i:eq(1)").text()
# 手機類型
category = info.split(":")[1]
size = info.split("/")
if len(size) == 2:
size = size[1]
else:
size = "0MB"
app_type = item("p").text()
mobile_type = item("h3>a").text()
# 保存數據
# 建立圖片下載渠道
img_url = item(".tip_list>a>img").attr("src")
# 獲取文件名字
filename = img_url[img_url.rindex("/")+1:]
# 添加軟件logo圖片下載地址
self.crawl(img_url,callback=self.save_img,save={"filename":filename},validate_cert=False)
dicts.append({
"title":title,
"pubdate":pubdate,
"category":category,
"size":size,
"app_type":app_type,
"mobile_type":mobile_type
})
return dicts
數據已經集中返回,我們重寫on_result
來保存數據到mongodb
中,在編寫以前,先把鏈接mongodb
的相關內容編寫完畢
import os
import pymongo
import pandas as pd
import numpy as np
import time
import json
DATABASE_IP = '127.0.0.1'
DATABASE_PORT = 27017
DATABASE_NAME = 'sun'
client = pymongo.MongoClient(DATABASE_IP,DATABASE_PORT)
db = client.sun
db.authenticate("dba", "dba")
collection = db.liqu # 準備插入數據
數據存儲
def on_result(self,result):
if result:
self.save_to_mongo(result)
def save_to_mongo(self,result):
df = pd.DataFrame(result)
#print(df)
content = json.loads(df.T.to_json()).values()
if collection.insert_many(content):
print('存儲到 mongondb 成功')
獲取到的數據,如下表所示。到此為止,咱已經完成大部分的工作了,最後把圖片下載完善一下,就收工啦!
3. 手機APP數據----圖片存儲
圖片下載,其實就是保存網絡圖片到一個地址即可
def save_img(self,response):
content = response.content
file_name = response.save["filename"]
#創建文件夾(如果不存在)
if not os.path.exists(DIR_PATH):
os.makedirs(DIR_PATH)
file_path = DIR_PATH + "/" + file_name
with open(file_path,"wb" ) as f:
f.write(content)
到此為止,任務完成,保存之後,調整爬蟲的抓取速度,點擊run,數據跑起來~~~~
Python爬蟲入門教程 29-100 手機APP數據抓取 pyspider