一、爬取目標
大家好,我是盆子。今天這篇文章來講解一下:使用Java爬蟲爬取百度搜索結(jié)果。
首先,展示爬取的數(shù)據(jù),如下圖。
爬取結(jié)果1:
爬取結(jié)果2:
代碼爬取展示:
可以看到,上面爬取了五個字段,包括
標題,原文鏈接地址,鏈接來源,簡介信息,發(fā)布時間。
二、爬取分析
用到的技術(shù)棧,主要有這些
Puppeteer 網(wǎng)頁自動化工具
Jsoup 瀏覽器元素解析器
Mybatis-Plus 數(shù)據(jù)庫存儲
2.1 網(wǎng)頁結(jié)構(gòu)分析
打開百度搜索,搜索“手機”二字,可以看到下面這樣的搜索結(jié)果,我們需要爬的信息都在上面。
爬取網(wǎng)頁元素分析1:*
*嘗試去分析它的網(wǎng)頁結(jié)構(gòu):
爬取網(wǎng)頁元素分析2:
打開控制臺F12,可以看到這個 class =“result c-container xpath-log new-pmd” 所在的 div 標簽就包含我們要爬取的所有信息。
那就很簡單了,我們只需要去這個div里面,將需要的元素 (字段) 信息挨個的獲取即可。
同理,這個結(jié)構(gòu)也就是百度搜索結(jié)果的通用結(jié)構(gòu),其他的搜索結(jié)果中,也可以通過該 class 去定位。
2.2 爬蟲代碼分析
首先,這是我們代碼的核心依賴:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.16.2</version>
</dependency>
<dependency>
<groupId>io.github.fanyong920</groupId>
<artifactId>jvppeteer</artifactId>
<version>1.1.5</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybaits.plus.version}</version>
</dependency>
初始化瀏覽器,并且打開百度搜索頁
// 初始化瀏覽器相關(guān)
BrowserFetcher.downloadIfNotExist(null);
ArrayList<String> argList = new ArrayList<>();
LaunchOptions options = new LaunchOptionsBuilder().withArgs(argList).withHeadless(false).build();
argList.add("--no-sandbox");
argList.add("--disable-setuid-sandbox");
System.out.println("==1=");
Browser browser = Puppeteer.launch(options);
// 打開頁面,開爬
Page page = browser.newPage();
page.goTo("https://www.baidu.com/");
運行上述代碼,就會彈出一個瀏覽器(受我們代碼控制),并且打開百度搜索頁面
找出頁面元素,并且模擬人工搜索關(guān)鍵字、點擊搜索按鈕的操作
// 模擬人工搜索關(guān)鍵字
ElementHandle inputField = page.$("#kw");
inputField.type("手機");
// 模擬人工點擊搜索按鈕
ElementHandle confirmSearch = page.$("#su");
confirmSearch.click();
此時,瀏覽器頁面已經(jīng)按照你的搜索關(guān)鍵詞開始搜索了。
用代碼解析頁面
// 獲取頁面所有內(nèi)容(HTML格式)
String content = page.content();
// 解析頁面元素,方便后面定位
Document document = Jsoup.parse(content);
// 找出我們上面說的那個class所在的div標簽
Elements elements = document.getElementsByClass("result c-container xpath-log new-pmd");
// 去 class所在的div標簽中找出需要的 字段信息
for (int i = 0; i < elements.size(); i++) {
Element element = elements.get(i);
String title = element.getElementsByTag("a").text();
String keyword = StrUtil.sub(title, 0, 7);
// 將關(guān)鍵詞存儲到隊列中,后續(xù)可使用
keyWordsQueue.offer(keyword);
String href = element.getElementsByTag("a").attr("href");
// ...找出其他字段
System.out.println(dataInfo);
}
至此,一個關(guān)鍵詞的爬取就已經(jīng)完成,如果想要繼續(xù)爬取關(guān)鍵詞,我們繼續(xù)搜索其他關(guān)鍵詞,并且重復上述操作即可。
完整代碼中,還包隨機等待時長、解析其他字段、保存數(shù)據(jù)、多個關(guān)鍵字同時爬取等關(guān)鍵邏輯,詳見文末。
三、總結(jié)
在爬蟲中,無非就是模擬人的操作過程,去做相關(guān)操作,獲取數(shù)據(jù)。
通過上文介紹的方式,我們是使用一種更具有通用型的方式去爬取數(shù)據(jù)。因為Puppeteer只是代理人手工點擊的方式,而拿到數(shù)據(jù)。
上述完整代碼,可以留言私信我獲取。文章來源:http://www.zghlxwxcb.cn/news/detail-750269.html
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!文章來源地址http://www.zghlxwxcb.cn/news/detail-750269.html
到了這里,關(guān)于【教你寫爬蟲】用Java爬蟲爬取百度搜索結(jié)果!可爬10w+條!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!