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

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

打开京东手机页面,

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

原文地址:https://www.cnblogs.com/yuantup/p/9761534.html

时间: 2024-11-07 08:28:44

爬取页面和审查元素获取的内容不一致的相关文章

[实战演练]python3使用requests模块爬取页面内容

本文摘要: 1.安装pip 2.安装requests模块 3.安装beautifulsoup4 4.requests模块浅析 + 发送请求 + 传递URL参数 + 响应内容 + 获取网页编码 + 获取响应状态码 5.案例演示 后记 1.安装pip 我的个人桌面系统用的linuxmint,系统默认没有安装pip,考虑到后面安装requests模块使用pip,所以我这里第一步先安装pip. $ sudo apt install python-pip 安装成功,查看PIP版本: $ pip -V 2.

Python 2.7_Second_try_爬取阳光电影网_获取电影下载地址并写入文件 20161207

1.昨天文章http://www.cnblogs.com/Mr-Cxy/p/6139705.html 是获取电影网站主菜单 然后获取每个菜单下的电影url  2.今天是对电影url 进行再次解析获取下载地址 并写入文件  调用函数和类多线程还没实现 一步步来吧 3.问题:我想实现的是先对菜单进行创建文件目录 然后每个目录下以获取的电影名称.txt 作为文件 文件内是下载连接,但是创建一级菜单文件夹没问题 用OS模块就可以创建 在写入电影名称.txt时候出问题 报错 我以为是编码问题 f.open

用WebCollector 2.x爬取新浪微博(无需手动获取cookie)

用WebCollector 2.x 配合另一个项目WeiboHelper,就可以直接爬取新浪微博的数据(无需手动获取cookie) 1.导入WebCollector 2.x和WeiboHelper的所有jar包 两个项目的地址:http://git.oschina.net/webcollector/WebCollector http://git.oschina.net/webcollector/WeiboHelper 2.示例代码: package cn.edu.hfut.dmic.webcol

【Python爬虫】之爬取页面内容、图片以及用selenium爬取

下面不做过多文字描述: 首先.安装必要的库 # 安装BeautifulSoup pip install beautifulsoup4 # 安装requests pip install requests 其次.上代码!!! ①重定向网站爬虫h4文字 import requests from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.common.by import By from

Jsoup 爬取页面的数据和 理解HTTP消息头

推荐一本书:黑客攻防技术宝典.Web实战篇  :       顺便留下一个疑问:是否能通过jsoup大量并发访问web或者小型域名服务器,使其瘫痪?其实用jsoup熟悉的朋友可以用它解析url来干一件很无耻的事(源码保密).呵呵,接下来简单的介绍下JSOUP. jsoup 是一款基于Java 的HTML解析器,可直接解析某个URL地址.HTML文本字符串.HTML文件.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据. 官网下载地址:http:/

多线程爬取页面图片

详细见代码,在代码段有相应注释: from multiprocessing import Pool import requests import re import random class dImg(): def __init__(self): self.count = 0 pass def run(self): self.userSearch = input('请输入你想要下载的图片:') self.userNum = int(input('你想要下载多少页面图片:')) self.down

python 使用selenium和requests爬取页面数据

目的:获取某网站某用户下市场大于1000秒的视频信息 1.本想通过接口获得结果,但是使用post发送信息到接口,提示服务端错误. 2.通过requests获取页面结果,使用html解析工具,发现麻烦而且得不到想要的结果 3.直接通过selenium获取控件的属性信息,如图片.视频地址,再对时间进行筛选.将信息保存到以id命名的文件夹下 # -*- coding:utf-8 -*- from selenium import webdriver import sys,os,requests,shut

Beautifulsoup 爬取页面试题

假设有一个页面,页面中有n道选择题,每道选择题有若干个选项.题干部分用h6 标签标记.选项部分用的是td 下的div 标签.如下图所示: 整个页面是将如下的HTML 段落循环n次. <div style="" class="qItemType qItemDetail1" value="10000#1" id="quest2436"> <div> <div class="breadcrum

如何解决python xpath爬取页面得到空列表(语法都对的情况下)

引言: 很多网页呈现给我们的静态页面,但是实际上是由服务器端的动态页面生成的.再加上网站设有反爬虫机制,所以抓取到的页面不一定和源码相同. 所以!!从源码里copy xpath,不一定能取到数据! 实例: 非常的简单,从百度首页上,抓取“新闻”这两个字. import requests from lxml import etree url="http://www.baidu.com" ua={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win6