java获取b站动态列表地址_爬虫入门(三)爬取b站搜索页视频分析(动态页面,DBUtils存储)...
這一次終于到了分析b站視頻了。開始體會到寫博客非常占用學技術的時間,但是還是希望能總結,沉淀下來。
工具:使用Webmaigc框架,DBUtils,C3P0連接池。
分析過程:b站的搜索頁面是這樣的。如果瀏覽器右鍵查看源代碼,你會發現是動態頁面,也就是從后臺通過ajax等在某個路徑加載獲得數據
于是初入爬蟲的我,打算貪方便試一下selenium模擬瀏覽器行為,結果效果不太好。當時是b站的搜索頁面經常顯示的是 出錯啦,后來我就苦苦思索,我通過b站的頁面在F12開發者工具里,從請求路徑里找到了b站視頻的搜索url,https://search.bilibili.com/api/search,當時還是很激動的!
從這個路徑進去,發現b站視頻的數據實際上是一個大Json,通過看webmagic文檔知道了它提供了JsonPath的拿取方法。于是就按JsonPath拿數據,原本是用xpath在html里拿數據。
先貼一下我的processor核心代碼:
1 public class BilibiliSearchProcessor implementsPageProcessor{2 private Site site = Site.me().setUserAgent("Mozilla/5.0 (Windows NT 10.0; …e/59.0.3071.109 Safari/537.36")3 .setRetryTimes(3)4 .setTimeOut(30000)5 .setSleepTime(1800)6 .setCycleRetryTimes(3)7 .setUseGzip(true)8 .addHeader("Host","search.bilibili.com")9 .addHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")10 .addHeader("Accept-Language","zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2")11 .addHeader("Accept-Encoding","gzip, deflate, br")12 ;13 private static final String man = "Pierre Bensusan";14 private static final String defineUrl = "https://search.bilibili.com/api/search?search_type=video&keyword="+man+"&from_source=banner_search&order=totalrank&duration=0&tids=0";15 //"井草圣二","伍伍慧","押尾光太郎","岸部真明","松井佑貴","小松原俊","鄭成河","depapepe","Pierre Bensusan","TOMMY EMMANUEL","Daniel Padim","andy mckee"};
16 public voidprocess(Page page) {17 int numPage = Integer.parseInt(page.getJson().jsonPath("$.numPages").get());18 for (int i=0;i
22 List ups = page.getJson().jsonPath("$..author").all();23 page.putField("author", ups);24 //標題
25 List titles = page.getJson().jsonPath("$..title").all();26 page.putField("title", titles);27 //鏈接
28 List srcLinks = page.getJson().jsonPath("$..arcurl").all();29 page.putField("srcLinks", srcLinks);30 //時長
31 List durations = page.getJson().jsonPath("$..duration").all();32 page.putField("duration", durations);33 //觀看數
34 List watchNums = page.getJson().jsonPath("$..play").all();35 page.putField("watchNum", watchNums);36 //上傳時間 2017-08-09 150222263337 //2016-09-28 147505314238 //2018-05-18 1526650568
39 List uploadTimes = page.getJson().jsonPath("$..pubdate").all();40 page.putField("uploadTime", uploadTimes);41 //review
42 List reviews = page.getJson().jsonPath("$..review").all();43 //video_review
44 List video_reviews = page.getJson().jsonPath("$..video_review").all();45 //favorite
46 List favorites = page.getJson().jsonPath("$..favorites").all();47 //視頻說明
48 List description = page.getJson().jsonPath("$..description").all();49 page.putField("description", description);50 for (int i=0;i
57 publicSite getSite() {58 returnsite;59 }60
61 public static voidmain(String[] args) {62 Spider.create(newBilibiliSearchProcessor())63 //.addUrl(urls)
64 .addUrl(defineUrl)65 .addPipeline(newConsolePipeline())66 .thread(5)67 .run();68 }69 }
有幾個當時遇到的要點講一下:
第一是site的header一定要加!!沒有為什么,一定要加,因為要模擬更真實的瀏覽器訪問!
第二是site的爬取頻率,b站還是有限制的,.setSleepTime(1800)這樣就可以了,不會太快。
第三是b站視頻爬的pubdate也就是上傳時間,實際上是秒為單位,但是平時java里轉換用的是毫秒,當晚我沒想明白這個數字該怎么轉換成date格式,第二天早上突然就發現了,真是感恩。
另外,json里拿到title實際上帶有關鍵詞的高亮,于是寫了個cutHtml的方法去replace.
第四是header的host要加對,我當時用selenium有時成功有時失敗,我后來改成直接拿Json的時候突然發現我Host之前寫的地址好像不對勁,不是search.bilibili.com,現在才漸漸明白估計也是參數錯了.
第五是能分析動態分析頁面,盡量分析,因為用selenium速度還是不快的,而且會造成java程序結束,chrome進程卻沒有退出的情況(開發者估計也還沒優化!)
1 public classSimpleUtil {2 //短日期格式
3 public static String DATE_FORMAT = "yyyy-MM-dd";4
5 /**
6 * 將長整型數字轉換為日期格式的字符串7 *8 *@paramtime9 *@return
10 */
11 public static String convert2String(longtime) {12 if (time > 0l) {13 SimpleDateFormat sf = newSimpleDateFormat(DATE_FORMAT);14 Date date = newDate(time);15 returnsf.format(date);16 }17 return "";18 }19
20 public staticString cutHtml(String str){21 return str.replaceAll("?[^>]+>", "");22 }23 }
Dao就不貼了,直接用DBUtils,QueryRunner執行sql語句save一個數據對象.
有什么疑問可以發我郵箱zhhiyp@qq.com
總結
以上是生活随笔為你收集整理的java获取b站动态列表地址_爬虫入门(三)爬取b站搜索页视频分析(动态页面,DBUtils存储)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html多个单元格合并单元格内容,exc
- 下一篇: arrays合并两个数组_每天一道力扣题