动态网页抓取(利用逆向工程爬取一个动态网页,360壁纸网站(#/) )

优采云 发布时间: 2022-01-07 09:07

  动态网页抓取(利用逆向工程爬取一个动态网页,360壁纸网站(#/)

)

  前言

  之前写过网络爬虫,文章,都是基础知识,接下来我们将完成一个小任务——利用逆向工程爬取动态网页,360壁纸网站 (#/ ),抓取前十页图片:

  

  面临的问题

  网页使用 JavaScript 异步加载。一般来说,网页一直往下滑,但是url一直没变。这是一个异步加载,所以关键问题是如何找到真正的url。

  异步加载查找真实url

  1.第一步,打开开发者工具,点击XHR。XHR 专用于存储异步加载的网页组件。

  

  2. 刷新并向下滑动。注意XHR下面的名字,会出现一个新的XHR,点进去。

  

  

  3. 下图中的Request URL可能就是我们需要查找的真实URL,但不能是绝对的。我们打开看看有没有

  

  4.部分如下图,可以观察到原网址

  

  编程

  #导入相关库

from bs4 import BeautifulSoup

import requests

from lxml import etree

import requests

import os

  # 原始数据获取URL

raw_url = 'https://image.so.com/zjl?ch=wallpaper&sn=30&pn=300&prevsn=30'

# 根据开发者工具中的request header信息来设置headers

#headers的作用就是为了我们的爬虫能够模拟浏览器去查找,让系统以为是人为操作的下载的

headers = {

'Host':'www.image.so.com',

'X-Requested-With': 'XMLHttpRequest',

'User-Agent':

'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'

}

  先实现第一张图的简单爬取

  raw_url = 'https://image.so.com/zjl?ch=wallpaper&sn=30&pn=300&prevsn=30'

## 实现爬取单张图片

res = requests.get(raw_url, headers=headers) #发出get请求

_json = res.json() #拿到源代码的json文件,是用列表形式

_1_dic = _json.get('list')[0] #拿到第一张图片的信息

_1_url = _1_dic.get('imgurl') #到第一张图片的信息的url

res1 = requests.get(_1_url) #请求

img = res1.content #拿到图片信息

with open('picture.jpg', 'wb') as f: #利用字节的方式进行保存图片

f.write(img)

  注释已经非常清楚地解释了代码。如果有点模糊,把值打印出来看看,这样会更清楚。那么我们现在要做的就是把函数封装起来,方便使用。

  name = []

i = 0

def save_image(url):

# filename = url.lstrip('http://').replace('.', '').replace('/', '').rstrip('jpg')+'.jpg'

global i

filename = name[i]+'.jpg'

filename = 'pic_360/'+filename #修改放在指定文件夹

# 将图片地址转化为图片文件名

try:

res = requests.get(url)

if res.ok:

img = res.content

if not os.path.exists(filename): # 检查该图片是否已经下载过

with open(filename, 'wb') as f:

f.write(img)

print("图片下载完成")

i += 1

except Exception:

print('Failed to load the picture')

def get_json():

try:

res = requests.get(raw_url, headers=headers)

if res.ok: # 成功访问

return res.json() # 返回json

else:

print('not ok')

return False

except Exception as e:

print('Error here:\t', e)

def json_parser(json):

if json is not None:

news_list = json.get('list')

if not news_list:

return False

for news_item in news_list:

name.append(news_item.get('title'))

pic_url = news_item.get('imgurl')

yield pic_url # 使用*敏*感*词*yield方法

def worker():

raw_json = get_json() # 获取原始JSON数据

print(raw_json)

urls = json_parser(raw_json)

for url in urls:

save_image(url)

if __name__ == '__main__':

worker()

  整个想法与抓取单个图片没有太大区别。最大的变化是增加了异常捕获。爬虫不参与异常捕获。真的很郁闷,因为第一站可以爬,第二章也可以,可能前n不能爬,上次爬的结果没用。如果你还是看不懂功能代码,那么把它拆开看看很重要。对于函数式程序,我的建议是一样的。

  爬取结果部分展示:

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线