本專案是一個基於Java的微信公眾號文章爬蟲,使用Web Collector 開源爬蟲框架和Spring Boot 實現,透過搜狗平台取得可以使用多種代理策略對指定公眾號文章進行定時爬取,也可以透過存取瀏覽器URL手動觸發爬取。
你可以基於本專案進行二次開發,設定Redis避免反覆爬取(本專案使用RamCrawler,沒有使用BreadthCrawler),也可以透過實作OSS進行靜態資源轉儲,以及實作文章保存介面來對爬取的內容入庫。
本項目特色:
基於Web Collector爬蟲框架和Spring Boot實現
有包括指定代理IP,不使用代理IP以及使用阿布雲代理等多種代理策略來避免爬蟲IP被屏蔽
有完善的爬蟲結果導入功能支援伺服器端使用
預留了Redis服務,OSS服務以及資料庫保存等在內的接口
支援Swagger介面文檔
maven install
調整設定檔application.yml
,具體參數請參考設定
啟動專案WxCrawlerApplication
開啟瀏覽器造訪http://localhost:11111/wxCrawler?proxyPolicy=none
觸發爬蟲任務
爬完後檔案在crawler.weixin.outputPath
指定路徑下生成,以公众号名_文章名.html
的命名方式存檔
啟動項目,造訪http://localhost:11111/swagger-ui.html
,呈現所有的對外介面如下:
也可以直接存取http://localhost:11111/help
取得介面介紹:
其中/parseWxArticleList
和/parseWxArticleDetail
介面是內部測試使用,解析fiddler從微信客戶端抓取的文章列表json以及文章詳情json。由於目前搜狗微信僅收錄微信“訂閱號碼”不收錄“服務號碼”,因此對於服務號碼類型的公眾號碼需要額外處理。另外,目前搜狗微信不收錄文章“閱讀次數”和“點讚次數”,因此也需要透過抓包的方式取得。詳情請參閱爬取服務號文章以及閱讀數和按讚數的支援。
server:
port: 11111
spring:
application:
name: wx-crawl
crawler:
weixin:
# 待爬取的微信公众号,支持爬取多个公众号,以;分隔(目前仅支持订阅号)
accounts: 雪球;缘聚小许
# outputPath 生成文章內容html文件
outputPath: D:/article_output
# 爬取访问一次后休眠时间,毫秒单位,为避免搜狗和微信封杀,建议设置至少3000以上
sleepTime: 5000
# 是否使用断点续爬,通过redis避免重复爬取
# 注意,由于会跳过已爬过的文章,因此就无法更新旧文章了
resumable: false
# 代理使用策略,包括不使用代理,使用指定代理IP以及使用阿布云代理
# 如: none | 222.182.56.50:8118,124.235.208.252:443 | abuyun
proxyPolicy: none
# 是否更新已存在的文章
updateArticle: true
proxy:
# 阿布云账号
abuyunAccount: xxxx
# 阿布云密码
abuyunPassword: xxxxx
入庫實現
文章入庫介面是com.xuzp.service.IArticleService
:
/**
* 保存文章
* @param articleVO
* @return
*/
ResultBase<String> save(ArticleTransferVO articleVO, Operation operation);
/**
* 查找文章
* @param articleVO
* @return
*/
ResultBase<ArticleTransferVO> find(ArticleTransferVO articleVO);
文章入庫實作類別是com.xuzp.service.impl.ArticleServiceImpl
, 請自行擴充。
Redis擴充
Redis介面是com.xuzp.service.IRedisService
:
/**
* @param key
* @param value
*/
void set(String key, String value);
/**
* @param key
* @return
*/
Boolean exists(String key);
/**
* @param key
* @return
*/
Object get(final String key);
Redis介面的實作類別是com.xuzp.service.impl.RedisServiceImpl
,請自行擴充。
OSS擴充
OSS介面是com.xuzp.service.IOssService
:
/**
* 把存于腾讯服务器上的包括视频,音频,图片等静态资源转储
* @param url 资源地址
* @return 新oss url
*/
ResultBase<String> resourceTranslation(String url);
實作類別位於com.xuzp.service.impl.OssServiceImpl
,請自行擴充。
調整自動爬取時間
定時任務代碼是com.xuzp.schedule.CrawlScheduledTasks
,請自行調整時間:
/**
* 定时爬虫去抓取微信公众号文章
*/
@Scheduled(cron = "0 30 10,18 * * ?")
public void weixinCrawlTask() {
crawlerStater(new LazyLoader<Crawler>(){
@Override
public WxCrawler newInstance() {
return wxCrawlerConfig.wxCrawler(null);
}
}, WxCrawlerConstant.CRAWL_DEPTH, WX_CRAWLER, "公众号爬虫");
}
對爬取服務號文章以及閱讀數和點讚數的支持
目前的爬取是基於搜狗微信平台http://weixin.sogou.com/
,因此受到以下限制:
只收錄了微信訂閱號,沒有收錄微信服務號的文章
只能爬取最近10筆記錄,無法爬取過往所有的歷史記錄
只收錄了文章基本信息,包括標題,作者,摘要,文章內容,發佈時間等,但沒有收錄文章閱讀數以及文章點贊數等信息
目前,本專案特提供了兩個額外介面透過解析Fiddler抓包資料來取得文章資訊:
/parseWxArticleList: 解析抓包获取的文章列表json
/parseWxArticleDetail: 解析获取抓包获取的文章详情json,后于 parseWxArticleList 接口执行。
後續會透過擴展分析fiddler的抓包數據,實現自動化,請等待後續版本的更新:)