您好,登錄后才能下訂單哦!
今天要爬取一個網站叫做酷安,是一個應用商店,大家可以嘗試從手機APP爬取,不過爬取APP的博客,我打算在50篇博客之后在寫,所以現在就放一放啦~~~
酷安網站打開首頁之后是一個廣告頁面,點擊頭部的應用即可
分頁地址找到,這樣就可以構建全部頁面信息
我們想要保存的數據找到,用來后續的數據分析
上述信息都是我們需要的信息,接下來,只需要爬取即可,本篇文章使用的還是scrapy
,所有的代碼都會在文章中出現,閱讀全文之后,你就擁有完整的代碼啦
import scrapy
from apps.items import AppsItem # 導入item類
import re # 導入正則表達式類
class AppsSpider(scrapy.Spider):
name = 'Apps'
allowed_domains = ['www.coolapk.com']
start_urls = ['https://www.coolapk.com/apk?p=1']
custom_settings = {
"DEFAULT_REQUEST_HEADERS" :{
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent':'Mozilla/5.0 你的UA'
}
}
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這里是Python學習者的聚集地,零基礎,進階,都歡迎
custom_settings 第一次出現,目的是為了修改默認
setting.py
文件中的配置
def parse(self, response):
list_items = response.css(".app_left_list>a")
for item in list_items:
url = item.css("::attr('href')").extract_first()
url = response.urljoin(url)
yield scrapy.Request(url,callback=self.parse_url)
next_page = response.css('.pagination li:nth-child(8) a::attr(href)').extract_first()
url = response.urljoin(next_page)
yield scrapy.Request(url, callback=self.parse)
- response.css 可以解析網頁,具體的語法,你可以參照上述代碼,重點閱讀 ::attr('href') 和 ::text
- response.urljoin 用來合并URL
- next_page 表示翻頁
parse_url函數
用來解析內頁,本函數內容又出現了3個輔助函數,分別是self.getinfo(response)
,self.gettags(response)
,self.getappinfo(response)
還有response.css().re
支持正則表達式匹配,可以匹配文字內部內容
def parse_url(self,response):
item = AppsItem()
item["title"] = response.css(".detail_app_title::text").extract_first()
info = self.getinfo(response)
item['volume'] = info[0]
item['downloads'] = info[1]
item['follow'] = info[2]
item['comment'] = info[3]
item["tags"] = self.gettags(response)
item['rank_num'] = response.css('.rank_num::text').extract_first()
item['rank_num_users'] = response.css('.apk_rank_p1::text').re("共(.*?)個評分")[0]
item["update_time"],item["rom"],item["developer"] = self.getappinfo(response)
yield item
三個輔助方法如下
def getinfo(self,response):
info = response.css(".apk_topba_message::text").re("\s+(.*?)\s+/\s+(.*?)下載\s+/\s+(.*?)人關注\s+/\s+(.*?)個評論.*?")
return info
def gettags(self,response):
tags = response.css(".apk_left_span2")
tags = [item.css('::text').extract_first() for item in tags]
return tags
def getappinfo(self,response):
#app_info = response.css(".apk_left_title_info::text").re("[\s\S]+更新時間:(.*?)")
body_text = response.body_as_unicode()
update = re.findall(r"更新時間:(.*)?[<]",body_text)[0]
rom = re.findall(r"支持ROM:(.*)?[<]",body_text)[0]
developer = re.findall(r"開發者名稱:(.*)?[<]", body_text)[0]
return update,rom,developer
數據傳輸的item在這個地方就不提供給你了,需要從我的代碼中去推斷一下即可,哈哈
import pymongo
class AppsPipeline(object):
def __init__(self,mongo_url,mongo_db):
self.mongo_url = mongo_url
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls,crawler):
return cls(
mongo_url=crawler.settings.get("MONGO_URL"),
mongo_db=crawler.settings.get("MONGO_DB")
)
def open_spider(self,spider):
try:
self.client = pymongo.MongoClient(self.mongo_url)
self.db = self.client[self.mongo_db]
except Exception as e:
print(e)
def process_item(self, item, spider):
name = item.__class__.__name__
self.db[name].insert(dict(item))
return item
def close_spider(self,spider):
self.client.close()
- open_spider 開啟爬蟲時,打開Mongodb
- process_item 存儲每一條數據
- close_spider 關閉爬蟲
- 重點查看本方法 from_crawler 是一個類方法,在初始化的時候,從setting.py中讀取配置
SPIDER_MODULES = ['apps.spiders']
NEWSPIDER_MODULE = 'apps.spiders'
MONGO_URL = '127.0.0.1'
MONGO_DB = 'KuAn'
調整一下爬取速度和并發數
DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
CONCURRENT_REQUESTS_PER_DOMAIN = 8
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這里是Python學習者的聚集地,零基礎,進階,都歡迎
代碼走起,經過一系列的努力,得到數據啦!!!
抽空寫個酷安的數據分析,有需要源碼的,自己從頭到尾的跟著寫一遍就OK了
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。