• 爬取页面和审查元素获取的内容不一致


    今天看书看到 图片爬虫实战之爬取京东手机图片 这一节,想着自己动手练习一下,因为以前看过视频所以思路还是比较清晰,主要是为了复习巩固刚刚学的正则表达式。

    打开京东手机页面,

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

  • 相关阅读:
    BZOJ1409 : Password
    BZOJ2862 : 分糖果
    BZOJ2093 : [Poi2010]Frog
    BZOJ2506 : calc
    BZOJ3290 : Theresa与数据结构
    BZOJ1397 : Ural 1486 Equal squares
    BZOJ2789 : [Poi2012]Letters
    BZOJ3417 : Poi2013 Tales of seafaring
    BZOJ3251 : 树上三角形
    BZOJ3262 : 陌上花开
  • 原文地址:https://www.cnblogs.com/yuantup/p/9761534.html
Copyright © 2020-2023  润新知