爬蟲讓我再次在女同學面前長臉了~(現實版真實案例)
1. 文章背景:
鑑於這幾天掉髮情況,想著週末是多休息的啦,睡午覺的時候被微信滴滴來信給吵醒了,拿來一看,是那個女同學哦,簡單看了一下,她主要表達的意思就是:“你能不能幫我
x x x x x x x ?(省略幾百個字)”,身為一個男同學,你能說你不能嘛? m(o_ _)m
2. 前言:
簡單介紹一下
“需求” ,她希望我幫忙在 “下載一批次的試題以及答案,如
3. 爬蟲
瞭解到要實現的東西之後,就可以對網頁進行解剖了,下面是具體步驟。
1.瀏覽器抓包
2.瞭解傳遞的引數
在瀏覽器抓包中我們看不到實際傳遞了哪些引數(unable to decode value),因此這裡可以使用 Fiddler 進行抓包或者使用下面的一種方式,任意一種都行,看你喜歡了…
然後使用文字框貼上剛才複製的內容:
curl '\ -H 'Connection: keep-alive' \ -H 'Cache-Control: max-age=0' \ -H 'Upgrade-Insecure-Requests: 1' \ -H 'Origin: \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36' \ -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' \ -H 'Sec-Fetch-Site: same-origin' \ -H 'Sec-Fetch-Mode: navigate' \ -H 'Sec-Fetch-User: ?1' \ -H 'Sec-Fetch-Dest: document' \ -H 'Referer: \ -H 'Accept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6' \ --data-raw 'KeyWord=%C2%ED%BF%CB%CB%BC%D6%F7%D2%E5&monthHidden=%C8%AB%B2%BF&month=&yearHidden=%C8%AB%B2%BF&year=' \ --compressed12345678910111213141516
留意一下倒數第二行
KeyWord=%C2%ED%BF%CB%CB%BC%D6%F7%D2%E5
結合瀏覽器抓包06瞭解到Keyword,這裡其實就是上面搜尋傳遞的內容啦!!!
3.如何傳遞分頁
來到這裡我們就能獲取一頁的列表資料了,那麼獲取第二頁傳遞什麼引數呢?點選
下一頁
然後觀察抓包情況
如上,url
發生了一點點變化了,
新增了一個引數page,也就是說page=2代表第2頁
翻頁也不成問題了,那就看看如何獲取內部的下載連結吧~
4.查詢下載連結
隨便點選一個連結進如試題詳情頁如下:
https://www.zikao365.com/shiti/download-427-16827.html
原本我打算高高興興的點選
“立即下載” 的,結果發現需要登入
真的是好事多磨啊~~
擺在眼前只有三條路
- 找女同學要一個賬號,點選一下看看什麼情況
- 自己註冊一個賬號,但是太麻煩了
- 嘗試繞開登入驗證,直接下載(很明顯我選擇第三種)
因為一般 超連結 點選了都是直接跳轉的,如果沒有直接跳轉,那就說明禁用了 href 屬性,並且重寫onclick事件,帶著這種前提意識開啟 F12 > Elements 觀察原始碼
OK~~ 來到這裡對自考365的整體列表資料以及詳情資料的下載檔案都有了一個整體的瞭解,那就可以著手編碼啦!!
程式碼實現較簡單 我這裡就全部貼出來
public static void main(String[] args) throws Exception { HttpClient httpClient = HttpClient.buildHttpClient(); String urlTemplate = "{page}&KeyWord=${KeyWord}"; String url = null; for (int i = 1; i < 6; i++) { // 第一頁開始 url = urlTemplate.replace("${page}", i + ""); url = url.replace("${KeyWord}", "%C2%ED%BF%CB%CB%BC%D6%F7%D2%E5"); // 這裡我竟然直接使用 GET 也是可以的 ( 我當時是忘記了抓包是 POST ,直接寫了GET, 可以,那就更加方便了) Request request = httpClient.buildRequest(url).GET(); Response<String> response = request.execute(BodyHandlers.ofString(Charset.forName("gbk"))); log.debug("response: [{}]", response.getBody()); // 把html解析為一個Document Document document = Jsoup.parse(response.getBody()); // 獲取每一頁的試題超連結 Elements a = document.select(".bot.clearfix li > a"); List<String> hrefs = a.stream().map(v -> v.attr("href")).collect(Collectors.toList()); for (String href : hrefs) { // 這裡相當於點選進入具體的試題超連結 response = httpClient.buildRequest(href).execute(BodyHandlers.ofString(Charset.forName("gbk"))); String html = response.getBody(); // 解析每一個試題內部的document document = Jsoup.parse(html); // 獲取當前試題的標題 String title = document.selectFirst(".main div > h1").text(); // 手動字串切割獲取檔案的path String[] scripts = StringUtils.substringsBetween(html, "<script", "</script>"); String path = Arrays.stream(scripts).filter(v -> v.contains("addClick") && v.contains("path")).findFirst().get(); path = path.substring(path.indexOf("path") + 4); path = path.replaceAll("'", "\"");// 這裡是為了統一 ' 轉為 " , 避免個別頁面使用的是' 如: var path = ' path = path.substring(path.indexOf("\"") + 1); path = path.substring(0, path.indexOf("\"")); // 獲取檔案的字尾 String suffix = path.substring(path.lastIndexOf(".")); log.info("title:[{}], path: [{}], suffix: [{}]", title, path, suffix); // 執行下載檔案到本地目錄 // 也可以使用 commons.io 的工具類下載, 如: FileUtils.copyURLToFile(new URL(path), Paths.get("C:\\Users\\houyu\\Desktop\\馬克思主義", title + suffix).toFile()); httpClient.buildRequest(path).execute(BodyHandlers.ofFile(Paths.get("C:\\Users\\houyu\\Desktop\\馬克思主義", title + suffix))); } }}1234567891011121314151617181920212223242526272829303132333435363738394041
說明:這裡列舉一下使用到幾個類庫或者工具類
-
HttpClient: 基於HttpURLConnection封裝超級好用的HttpClient (就一個java檔案,內含豐富的好用的api)
-
commons-lang3:比較常用的工具包
-
jsoup:一個 java 版的 css selector,用起來就像吃甜品一樣。
4. 下載
日誌:
下載之後的檔案如下,共108個:
5. 最後
當我把這108個檔案發給哪位那個女同學的時候…
你想學呀
我叫你呀,從此就可以有正當理由聊了呀,你是否遇到你這樣子的女同學呢 ?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2724062/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python 讓我再次在女同學面前長臉了!(真實案例)Python
- 基礎爬蟲案例實戰爬蟲
- Java實現網路爬蟲 案例程式碼Java爬蟲
- 微博爬蟲 java實現爬蟲Java
- Python零基礎爬蟲教學(實戰案例手把手Python爬蟲教學)Python爬蟲
- 爬蟲案例爬蟲
- scrapy-redis實現爬蟲分散式爬取分析與實現Redis爬蟲分散式
- python爬蟲實戰教程-Python爬蟲開發實戰教程(微課版)Python爬蟲
- 面前最全《崔慶才python3網路爬蟲開發實戰》Python爬蟲
- 《網路爬蟲開發實戰案例》筆記爬蟲筆記
- Python爬蟲實戰案例-爬取幣世界標紅快訊Python爬蟲
- 我的爬蟲入門書 —— 《Python3網路爬蟲開發實戰(第二版)》爬蟲Python
- ajax+php實現爬蟲功能PHP爬蟲
- 爬蟲實戰爬蟲
- Python實現微博爬蟲,爬取新浪微博Python爬蟲
- 爬蟲——爬取貴陽房價(Python實現)爬蟲Python
- 網路爬蟲——爬蟲實戰(一)爬蟲
- 爬蟲案例(六)爬蟲
- 在Pyppeteer中實現反爬蟲策略和資料保護爬蟲
- 爬蟲實戰開發學習(一)爬蟲
- python的爬蟲功能如何實現Python爬蟲
- nodejs + koa2 實現爬蟲NodeJS爬蟲
- Python爬蟲是如何實現的?Python爬蟲
- 運用node實現簡單爬蟲爬蟲
- 使用slenium+chromedriver實現無敵爬蟲Chrome爬蟲
- 多執行緒爬蟲實現(上)執行緒爬蟲
- 使用Go語言實現爬蟲功能Go爬蟲
- 我爬取了爬蟲崗位薪資,分析後發現爬蟲真香爬蟲
- 【Python學習】爬蟲爬蟲爬蟲爬蟲~Python爬蟲
- Python爬蟲的兩套解析方法和四種爬蟲實現Python爬蟲
- 關於爬蟲平臺的架構實現和框架的選型(二)--scrapy的內部實現以及實時爬蟲的實現爬蟲架構框架
- 爬蟲實戰scrapy爬蟲
- SQL調優真實案例SQL
- 大規模非同步新聞爬蟲: 用asyncio實現非同步爬蟲非同步爬蟲
- Python爬蟲教程-06-爬蟲實現百度翻譯(requests)Python爬蟲
- 爬蟲實現:根據IP地址反查域名爬蟲
- python實現selenium網路爬蟲Python爬蟲
- Disruptor 實踐:整合到現有的爬蟲框架爬蟲框架