摘要:自動化爬取淘寶中的訂單這是淘寶會員登錄頁。但淘寶的反爬機制很難算出,很多都是通過的計算,所以不得不學習源碼,反到最后看的頭痛。。。
自動化爬取淘寶中的訂單
這是 淘寶會員登錄頁 。因為之前做的爬蟲都是通過框架或從登錄頁取得Cookie,再注入進去實現登陸過程的。但淘寶的反爬機制很難算出Cookie,很多Cookie都是通過JS的計算,所以不得不學習源碼,反到最后看的頭痛。。。
第一次嘗試(1)登錄
通過 Jsoup get登錄頁成功返回Cookie:
/** * 初始化淘寶登錄頁 */ Response firstLoginInitResp = Jsoup.connect("https://login.taobao.com/member/login.jhtml?redirectURL=http%3A%2F%2Ftrade.taobao.com%2Ftrade%2Fitemlist%2Flist_export_order.htm") .header("Host", "login.taobao.com") .header("Connection", "keep-alive") .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8") .header("Upgrade-Insecure-Requests", "1") .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36") .header("Accept-Encoding", "gzip, deflate, sdch") .header("Accept-Language", "zh-CN,zh;q=0.8") .execute(); MapfirstLoginInitCookies = firstLoginInitResp.cookies(); System.out.println("code: "+firstLoginInitResp.statusCode()+", msg: "+firstLoginInitResp.statusMessage()+", 第一次登陸淘寶返回的Cookie: "+firstLoginInitCookies.toString());
_tb_token_=e71873665bdae t=7770a28456dfcad8106b11406e3bc765 cookie2=17c4314a2a5b448f59aa038202b96019 v=0
返回成功后,JS動態添加了倆個Cookie:
l= isg=
最后將Cookie重新注入,并傳送消息體到登錄頁(這是為了js再次動態設置Cookie)
Response secondLoginInitResp = Jsoup.connect("https://login.taobao.com/member/login.jhtml?redirectURL=http%3A%2F%2Ftrade.taobao.com%2Ftrade%2Fitemlist%2Flist_export_order.htm%3Fpage_no%3D1") .header("Host", "login.taobao.com") .header("Connection", "keep-alive") .header("Content-Length", secondLoginInitData.length()+"") .header("Cache-Control", "max-age=0") .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8") .header("Origin", "https://login.taobao.com") .header("Upgrade-Insecure-Requests", "1") .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36") .header("Content-Type", "application/x-www-form-urlencoded") .referrer("https://login.taobao.com/member/login.jhtml?redirectURL=http%3A%2F%2Ftrade.taobao.com%2Ftrade%2Fitemlist%2Flist_export_order.htm%3Fpage_no%3D1") .header("Accept-Encoding", "gzip, deflate") .header("Accept-Language", "zh-CN,zh;q=0.8") .cookies(firstLoginInitCookies) .data(secondLoginInitMap) .execute(); MapsecondLoginInitCookies = secondLoginInitResp.cookies(); System.out.println("code: "+secondLoginInitResp.statusCode()+", msg: "+secondLoginInitResp.statusMessage()+", 第二次登陸淘寶返回的Cookie: "+secondLoginInitCookies.toString());
結果返回的Cookie為空。此處省略過多廢話。。。只好再采用其他方式。
第二次嘗試這次將采用Selenium自動化框架完成自動登錄,再獲取Cookie注入到請求中,最后完成爬取。
因為需要用瀏覽器來完成自動化登錄,所以應注意Firefox、Chrome、IE與Selenium對應的版本(本人火狐版本24 下載地址、Selenium2.40 下載地址)。
import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import org.jsoup.Connection.Response; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.openqa.selenium.By; import org.openqa.selenium.Cookie; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import common.DateUtil; import common.FileUtil; import common.Log; /** * 淘寶爬蟲 * @author Alex * @date 2017年3月22日 */ public class TaobaoCrawler extends Log{ public String login(String username, String password){ logger.info("Start firefox browser succeed..."); try { WebDriver webDriver = new FirefoxDriver(); //創建火狐驅動(谷歌IE需下載驅動程序并添加瀏覽器插件,還有注意版本對應,比較麻煩,請百度版本對應) webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); webDriver.get("https://login.taobao.com/member/login.jhtml?redirectURL=http://trade.taobao.com/trade/itemlist/list_export_order.htm?page_no=1"); WebElement passLoginEle= webDriver.findElement(By.xpath("http://a[@class="forget-pwd J_Quick2Static" and @target="_blank" and @href=""]")); //密碼登錄 logger.info("密碼登錄是否顯示可見:"+passLoginEle.isDisplayed()); passLoginEle.click(); //顯示賬號密碼表單域(模仿點擊事件,將隱藏視圖變為可見) webDriver.findElement(By.id("TPL_username_1")).clear(); webDriver.findElement(By.id("TPL_username_1")).sendKeys(username); //輸入用戶名 webDriver.findElement(By.id("TPL_password_1")).clear(); webDriver.findElement(By.id("TPL_password_1")).sendKeys(password); //輸入密碼 webDriver.findElement(By.id("J_SubmitStatic")).click(); //點擊登錄按鈕 webDriver.switchTo().defaultContent(); try { while (true) { //不停的檢測,一旦當前頁面URL不是登錄頁面URL,就說明瀏覽器已經進行了跳轉 Thread.sleep(500L); if (!webDriver.getCurrentUrl().startsWith("https://login.taobao.com/member/login.jhtml")) { break; } } } catch (InterruptedException e) { e.printStackTrace(); } //獲取cookie,上面一跳出循環我認為就登錄成功了,當然上面的判斷不太嚴格,可以再進行修改 StringBuffer cookieStr = new StringBuffer(); Setcookies = webDriver.manage().getCookies(); for (Cookie cookie : cookies) { cookieStr.append(cookie.getName() + "=" + cookie.getValue() + "; "); } logger.info("賬號 "+username+" ,用戶登錄成功"); return cookieStr.toString(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); logger.info("賬號 "+username+" ,用戶登錄失敗,可能被校驗碼攔截"); logger.error(e.getMessage()); return null; } } public String getOrderUrl(String cookie){ try { Response orderResp = Jsoup.connect("https://trade.taobao.com/trade/itemlist/list_export_order.htm?page_no=1") .header("Host", "login.taobao.com") .header("Connection", "keep-alive") .header("Cache-Control", "max-age=0") .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*;q=0.8") .header("Origin", "https://login.taobao.com") .header("Upgrade-Insecure-Requests", "1") .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36") .header("Content-Type", "application/x-www-form-urlencoded") .header("Accept-Encoding", "gzip, deflate") .header("Accept-Language", "zh-CN,zh;q=0.8") .cookie("Cookie", cookie) .execute(); logger.info("請求訂單頁返回的code: "+orderResp.statusCode()+", msg: "+orderResp.statusMessage()); Document doc = orderResp.parse(); Element orderEle = doc.getElementsByAttributeValue("title", "下載訂單報表").get(0); //獲取第一個 String orderUrl = orderEle.attr("href"); logger.info("訂單下載地址:"+orderUrl); return orderUrl; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); logger.error(e.getMessage()); return null; } } public static void main(String[] args){ TaobaoCrawler crawler = new TaobaoCrawler(); Map map = FileUtil.propToMap(); String cookie = crawler.login(map.get("username"), map.get("password")); String orderUrl = crawler.getOrderUrl(cookie); } }
普通驗證碼是可以獲取的,但是通過以拖動滑塊來驗證用戶身份,這種情況就很難解決了。希望大家有空能試下,多提供些寶貴意見。。。
先這樣吧,不太會寫文章,希望大家海涵。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66873.html
摘要:一個網站使用的特征就是源代碼里包含了入口比如如果你在一個網站上看到了,那么采集這個網站數據的時候要格外小心。直接點擊下拉框中的選項不一定可行。未審核初審通過復審通過審核不通過專門提供了類來處理下拉框。 JavaScript JavaScript 是網絡上最常用也是支持者最多的客戶端腳本語言。它可以收集 用戶的跟蹤數據,不需要重載頁面直接提交表單,在頁面嵌入多媒體文件,甚至運行網頁游戲。...
小編寫這篇文章的主要目的,就是給大家介紹關于Python的一些總結,比如使用Python爬蟲Xpath定位數據,那么,在定位數據的時候,有兩種方法,具體有什么方法介紹呢?下面就給大家詳細的解答下。 方法一:直接右鍵,將文章路徑復制下來點擊Copy full Xpath 使用selenium+lxml中的etree進行配合使用,使用etree解析html網頁 importrequests ...
摘要:總的來說有兩種反爬策略,要么驗證身份,把蟲子踩死在門口要么在網站植入各種反爬機制,讓爬蟲知難而退。本節內容就著這兩種反爬策略提出一些對策。內嵌反爬很靈活,沒有什么固定的代碼格式,要花時間去分析出來。 ??之前提到過,有些網站是防爬蟲的。其實事實是,凡是有一定規模的網站,大公司的網站,或是盈利性質比較強的網站,都是有高級的防爬措施的。總的來說有兩種反爬策略,要么驗證身份,把蟲子踩死在門口...
摘要:前端每周清單第期現狀分析與優化策略單元測試爬蟲作者王下邀月熊編輯徐川前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發者了解一周前端熱點分為新聞熱點開發教程工程實踐深度閱讀開源項目巔峰人生等欄目。 showImg(https://segmentfault.com/img/remote/1460000011008022); 前端每周清單第 29 期:Web 現狀分析與優化策略...
摘要:基本環境安裝安裝下載注意要和版本對應由于下載的是版本的,所以選擇了版本解壓此文件,并將文件移動到目錄下測試是否可用,請執行以下腳本,如返回內容,則說明安裝成功注意需要加上,禁止在沙箱中運行補充安裝支持測試腳本 基本環境:centos7,python3.x 1.安裝selenium pip3 install selenium 2.安裝chrome-browser wget https:/...
閱讀 1460·2021-11-22 14:44
閱讀 2843·2021-11-16 11:44
閱讀 3206·2021-10-13 09:40
閱讀 1980·2021-10-08 10:04
閱讀 2363·2021-09-24 10:28
閱讀 2909·2021-09-06 15:02
閱讀 2957·2019-08-30 15:52
閱讀 2392·2019-08-30 13:20