摘要:以上只是一個普通的爬蟲,并沒有用到什么框架,接下來將會寫框架爬取的,請繼續關注我的博客哦本人博客
python大規模爬取京東 主要工具
分析步驟scrapy
BeautifulSoup
requests
代碼講解打開京東首頁,輸入褲子將會看到頁面跳轉到了這里,這就是我們要分析的起點
我們可以看到這個頁面并不是完全的,當我們往下拉的時候將會看到圖片在不停的加載,這就是ajax,但是當我們下拉到底的時候就會看到整個頁面加載了60條褲子的信息,我們打開chrome的調試工具,查找頁面元素時可以看到每條褲子的信息都在這個標簽中,如下圖:
接著我們打開網頁源碼就會發現其實網頁源碼只有前30條的數據,后面30條的數據找不到,因此這里就會想到ajax,一種異步加載的方式,于是我們就要開始抓包了,我們打開chrome按F12,點擊上面的NetWork,然后點擊XHR,這個比較容易好找,下面開始抓包,如下圖:
從上面可以找到請求的url,發現有很長的一大段,我們試著去掉一些看看可不可以打開,簡化之后的url=https://search.jd.com/s_new.p...{0}&s=26&scrolling=y&pos=30&show_items={1}
這里的showitems是褲子的id,page是翻頁的,可以看出來我們只需要改動兩處就可以打開不同的網頁了,這里的page很好找,你會發現一個很好玩的事情,就是主網頁的page是奇數,但是異步加載的網頁中的page是偶數,因此這里只要填上偶數就可以了,但是填奇數也是可以訪問的。這里的show_items就是id了,我們可以在頁面的源碼中找到,通過查找可以看到id在li標簽的data-pid中,詳情請看下圖上面我們知道怎樣找參數了,現在就可以擼代碼了
首先我們要獲取網頁的源碼,這里我用的requests庫,安裝方法為pip install requests,代碼如下:
def get_html(self): res = requests.get(self.url, headers=self.headers) html = res.text return html #返回的源代碼
根據上面的分析可以知道,第二步就是得到異步加載的url中的參數show_items,就是li標簽中的data-pid,代碼如下:
def get_pids(self): html = self.get_html() soup = BeautifulSoup(html, "lxml") #創建BeautifulSoup對象 lis = soup.find_all("li", class_="gl-item") #查找li標簽 for li in lis: data_pid = li.get("data-pid") #得到li標簽下的data-pid if (data_pid): self.pids.add(data_pid) #這里的self.pids是一個集合,用于過濾重復的
下面就是獲取前30張圖片的url了,也就是主網頁上的圖片,其中一個問題是img標簽的屬性并不是一樣的,也就是源碼中的img中不都是src屬性,一開始已經加載出來的圖片就是src屬性,但是沒有加載出來的圖片是data-lazy-img,因此在解析頁面的時候要加上討論。代碼如下:
def get_src_imgs_data(self): html = self.get_html() soup = BeautifulSoup(html, "lxml") divs = soup.find_all("div", class_="p-img") # 圖片 # divs_prices = soup.find_all("div", class_="p-price") #價格 for div in divs: img_1 = div.find("img").get("data-lazy-img") # 得到沒有加載出來的url img_2 = div.find("img").get("src") # 得到已經加載出來的url if img_1: print img_1 self.sql.save_img(img_1) self.img_urls.add(img_1) if img_2: print img_2 self.sql.save_img(img_2) self.img_urls.add(img_2)
前三十張圖片找到了,現在開始找后三十張圖片了,當然是要請求那個異步加載的url,前面已經把需要的參數給找到了,下面就好辦了,直接貼代碼:
def get_extend_imgs_data(self): # self.search_urls=self.search_urls+",".join(self.pids) self.search_urls = self.search_urls.format(str(self.search_page), ",".join(self.pids)) #拼湊url,將獲得的單數拼成url,其中show_items中的id是用","隔開的,因此要對集合中的每一個id分割,page就是偶數,這里直接用主網頁的page加一就可以了 print self.search_urls html = requests.get(self.search_urls, headers=self.headers).text #請求 soup = BeautifulSoup(html, "lxml") div_search = soup.find_all("div", class_="p-img") #解析 for div in div_search: img_3 = div.find("img").get("data-lazy-img") #這里可以看到分開查找img屬性了 img_4 = div.find("img").get("src") if img_3: #如果是data-lazy-img print img_3 self.sql.save_img(img_3) #存儲到數據庫 self.img_urls.add(img_3) #用集合去重 if img_4: #如果是src屬性 print img_4 self.sql.save_img(img_4) self.img_urls.add(img_4)
拓展通過上面就可以爬取了,但是還是要考慮速度的問題,這里我用了多線程,直接每一頁面開啟一個線程,速度還是可以的,感覺這個速度還是可以的,幾分鐘解決問題,總共爬取了100個網頁,這里的存儲方式是mysql數據庫存儲的,要用發哦MySQLdb這個庫,詳情自己百度,當然也可以用mogodb但是還沒有學呢,想要的源碼的朋友請看GitHub源碼
寫到這里可以看到搜索首頁的網址中keyword和wq都是你輸入的詞,如果你想要爬取更多的信息,可以將這兩個詞改成你想要搜索的詞即可,直接將漢字寫上,在請求的時候會自動幫你編碼的,我也試過了,可以抓取源碼的,如果你想要不斷的抓取,可以將要搜索的詞寫上文件里,然后從文件中讀取就可以了。以上只是一個普通的爬蟲,并沒有用到什么框架,接下來將會寫scrapy框架爬取的,請繼續關注我的博客哦?。?!
本人博客文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38603.html
摘要:,源代碼爬取京東商品列表,以手機商品列表為例示例網址版本京東手機列表源代碼下載位置請看文章末尾的源。,抓取結果運行上面的代碼,就會爬取京東手機品類頁面的所有手機型號價格等信息,并保存到本地文件京東手機列表中。 showImg(https://segmentfault.com/img/bVxXHW); 1,引言 在上一篇《python爬蟲實戰:爬取Drupal論壇帖子列表》,爬取了一個用...
摘要:,實驗用的文件我們使用爬蟲實戰爬取京東商品列表一文的結果文件,爬蟲爬取的結果保存在京東手機列表文件中。,相關文檔,即時網絡爬蟲項目內容提取器的定義,爬蟲實戰爬取京東商品列表,集搜客開源代碼下載源,開源網絡爬蟲源,文檔修改歷史,首次發布 showImg(https://segmentfault.com/img/bVyf6R); 1,引言 GooSeeker早在9年前就開始了Semanti...
摘要:,實驗用的文件我們使用爬蟲實戰爬取京東商品列表一文的結果文件,爬蟲爬取的結果保存在京東手機列表文件中。,相關文檔,即時網絡爬蟲項目內容提取器的定義,爬蟲實戰爬取京東商品列表,集搜客開源代碼下載源,開源網絡爬蟲源,文檔修改歷史,首次發布 showImg(https://segmentfault.com/img/bVyf6R); 1,引言 GooSeeker早在9年前就開始了Semanti...
摘要:這里由于京東的分界面都使用了,所以我們可以用,總之他們開發能用的選擇器,我們都可以用,否則就不可以。 難道爬蟲只能用 python 做? 不,我們上天的 Node.js 也可以做! 需要準備的包 Node.js的最新版本 下載地址 Node.js官網 npm 包管理器下載 下載最新的官網版本 Node.js 會自帶 npm npm的第三方包 puppeteer 在對應...
摘要:這里由于京東的分界面都使用了,所以我們可以用,總之他們開發能用的選擇器,我們都可以用,否則就不可以。 難道爬蟲只能用 python 做? 不,我們上天的 Node.js 也可以做! 需要準備的包 Node.js的最新版本 下載地址 Node.js官網 npm 包管理器下載 下載最新的官網版本 Node.js 會自帶 npm npm的第三方包 puppeteer 在對應...
閱讀 2833·2021-11-25 09:43
閱讀 2477·2021-10-09 09:44
閱讀 2801·2021-09-22 15:49
閱讀 2568·2021-09-01 11:43
閱讀 2542·2019-08-30 14:16
閱讀 465·2019-08-29 17:24
閱讀 3020·2019-08-29 14:00
閱讀 1384·2019-08-29 13:05