1. 程式人生 > >爬取頁面和審查元素獲取的內容不一致

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

打開 nbsp 手機信息 發送 http arm 動態網站 結果 手機

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

打開京東手機頁面,

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

技術分享圖片

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