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

优采云 发布时间: 2020-08-25 07:50

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

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

  打开易迅手机页面,

  ,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 = ‘(.+?[.jpg|.png])‘

pattern2 = ‘(.+?[.jpg|.png])‘

pattern2 = ‘‘

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

  

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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线