爬取頁面和審查元素獲取的內容不一致
今天看書看到 圖片爬蟲實戰之爬取京東手機圖片 這一節,想著自己動手練習一下,因為以前看過視頻所以思路還是比較清晰,主要是為了復習鞏固剛剛學的正則表達式。
打開京東手機頁面,
https://list.jd.com/list.html?cat=9987,653,655&page=1&sort=sort_rank_asc&trans=1&JL=6_0_0#J_main
審查元素發現手機圖片有兩種格式:
1.每一頁的前十是這樣的
2.第十一個開始是這樣的
仔細看了看區別就是多了一個 data-lazy-img 和 title
心想簡單啊我寫兩個正則表達式匹配一下不就行了,於是:
為了求穩,先測試了一下能否正確獲取我需要的地址:結果只有10個地址。心想是不是"."不能匹配換行符的原因啊,於是
各種百度查資料保證"."可以匹配換行符。。。emmmm,還是不行
於是我就看書上是咋寫的 ,書上寫的是:
我一看不對啊,這和說好的不一樣啊啊
我用他的試了試,確實找到了50張圖片的地址(一頁共有60個手機信息,前十個是可以正常爬取地址的)
下載下來的圖片:
為了驗證我的正則表達式哪裏出錯了,我把下載下來的地址復制到瀏覽器F12打開的界面中去查找:
這和他給的正則表達式不一樣把!!!怎麽匹配上的
我還嘗試了將下圖中title中的內容復制到源代碼中查找,也沒有!
這個時候我發現不對勁了,因為我re能匹配到東西,所以我請求的網頁中是有這個內容的,但是網頁源代碼中沒有,說明
我請求到的網頁代碼和瀏覽器審查元素顯示的代碼不一致
找到問題之後,一通百度,啥有用的都沒看到。
突然想到以前在一本爬蟲書上看到過有一章叫做——動態網站抓取(這本書只看了基礎知識介紹就沒看了,因為它使用的是python2的版本,我看書之前喜歡先看大綱和目錄,有個大概的印象)
翻出來一看,知道了。
所謂查看網頁源代碼,就是別人服務器發送到瀏覽器的原封不動的代碼。這是爬蟲獲得的代碼
你那些在源碼中找不到的代碼(元素),那是在瀏覽器執行js動態生成的,這些能在審查元素中看到
通過審查元素就 看到就是瀏覽器處理過的最終的html代碼。
解決辦法:一種是直接從JavaScript中采集加載的數據,用json模塊處理;
另一種方式是直接采集瀏覽器中已經加載好的數據,借助工具--PhantomJS
最後,這個問題圓滿解決了
附上代碼和運行結果截圖:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/10/8 15:11 # @Author : yuantup # @Site : # @File : jdshouji_image.py # @Software: PyCharm import urllib.request import re import os def open_url(url): head = {‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/5‘ ‘37.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36‘} req = urllib.request.Request(url, headers=head) response = urllib.request.urlopen(req) # print(response.getcode()) html = response.read() return html def get_img_addr(html): html_str = html.decode(‘utf-8‘) # print(html_str) img_addrs =[] pattern1 = ‘<img width="220" height="220" data-img="1" src="(.+?[.jpg|.png])"‘ pattern2 = ‘<img width="220" height="220" data-img="1" data-lazy-img="done" title=.+? src="(.+?[.jpg|.png])"‘ pattern2 = ‘<img width="220" height="220" data-img="1" data-lazy-img="(.+?[.jpg|.png])"‘ img_addrs1 = re.compile(pattern1).findall(html_str) # print(img_addrs) img_addrs2 = re.compile(pattern2).findall(html_str) # print(len(img_addrs)) img_addrs.extend(img_addrs1) img_addrs.extend(img_addrs2) print(img_addrs) return img_addrs def save_img(img_addrs): i = 0 for each in img_addrs: i = i+1 img_name = each.split("/")[-1] with open(img_name, ‘wb‘) as f: correct_url = ‘http:‘ + each img = open_url(correct_url) f.write(img) return i def main(): path = ‘E:\spiser_sons\shouji_img‘ a = os.getcwd() print(a) if os.path.exists(path): os.chdir(path) print(os.getcwd()) else: os.mkdir(path) # os.chdir(path) for i in range(1, 11): url = ‘https://list.jd.com/list.html?cat=9987,653,655&page=‘ + str(i) html = open_url(url) img_addrs = get_img_addr(html) print(url) save_img(img_addrs) if __name__ == ‘__main__‘: main()
爬取頁面和審查元素獲取的內容不一致