爬取頁面和審查元素獲取的內容不一致


今天看書看到 圖片爬蟲實戰之爬取京東手機圖片 這一節,想着自己動手練習一下,因為以前看過視頻所以思路還是比較清晰,主要是為了復習鞏固剛剛學的正則表達式。

 

 

打開京東手機頁面,

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()

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM