前言

之前写过介绍过网络爬虫的文章,都是一些基础知识,所以在接下来我们完成一个小任务——利用逆向工程爬取一个动态网页,360壁纸网站(https://image.so.com/z?ch=wallpaper#/),爬取前十页图片:

面临问题

网页是采用JavaScript做的异步加载,通俗来说就是网页一直往下滑都有,但是url从来没有变过,这就是一个异步加载,所以关键问题就是怎么找真正的url。

异步加载寻找真正的url

1.第一步,打开开发者工具,点到XHR,XHR就是专门存放异步加载的网页组件的。

2.进行刷新,并且往下滑。注意观察XHR下的name,会出现新的XHR,点进去。


3.如下图出现的Request URL可能就是我们需要找的真实URL,但是不能绝对,我们打开看看是不是。

4.部分展示如下,可以观察原始URL

编写程序

#导入相关库
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 ifilename = name[i]+'.jpg'filename = 'pic_360/'+filename  #修改放在指定文件夹# 将图片地址转化为图片文件名try:res = requests.get(url)if res.ok:img = res.contentif not os.path.exists(filename): # 检查该图片是否已经下载过with open(filename, 'wb') as f:f.write(img)print("图片下载完成")i += 1except Exception:print('Failed to load the picture')def get_json():try:res = requests.get(raw_url, headers=headers)if res.ok:  # 成功访问return res.json()  # 返回jsonelse:print('not ok')return Falseexcept 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 Falsefor 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不能爬,结果前面爬的都没用。如果还不能理解函数式这段代码,重要就是拆开看看,对于函数式程序我的建议都是如此。
爬取结果部分展示:

python网络爬虫实战——利用逆向工程爬取动态网页相关推荐

  1. Python网络爬虫:利用正则表达式爬取豆瓣电影top250排行前10页电影信息

    在学习了几个常用的爬取包方法后,转入爬取实战. 爬取豆瓣电影早已是练习爬取的常用方式了,网上各种代码也已经很多了,我可能现在还在做这个都太土了,不过没事,毕竟我也才刚入门-- 这次我还是利用正则表达式 ...

  2. Python爬虫脚本,利用Beautifulfly爬取动态网页网页(源码)

    ''' Created on 2019年12月23日@author: Zhangzhiwei ''' import datetime import threading import cx_Oracle ...

  3. Python网络爬虫实战14:爬取酷狗音乐中top500的歌曲

    1.  网页源码 2.  代码实例 # coding:utf-8 # 第一步:导入相关库 import requests # 用于请求网页获取网页数据 from bs4 import Beautifu ...

  4. Python网络爬虫实战练习:爬取豆瓣图书信息

    一.注意事项 1.文件名尽量使用英文,避免出现编码问题 2.含中文的文件写入,注意标注编码,如: with open(r"C:\Users\10335\Desktop\response.tx ...

  5. Python网络爬虫实战12:爬取豆瓣电影中热门电影数据

    代码实例 # coding:utf8 import json import requests from bs4 import BeautifulSoup import openpyxlwb = ope ...

  6. Python网络爬虫实战10:爬取中关村在线首页“今日焦点”的头条新闻列表

    目录 1.  网页源码 2.  代码实例 3.  运行结果 1.  网页源码 2.  代码实例 # coding:utf8 from bs4 import BeautifulSoup import r ...

  7. python网络爬虫学习笔记(6)动态网页抓取(一)知识

    文章目录 网络爬虫学习笔记(2) 1 资料 2 笔记 2-1 动态抓取概述 2-2 通过浏览器审查元素解析真实网页地址 2-3 网页URL地址的规律 2-4 json库 2-5 通过Selenium模 ...

  8. python网络爬虫学习笔记(7)动态网页抓取(二)实践

    文章目录 1 资料 2 笔记 2-1 准备 2-1-1. 网址 2-2-2 文本位置 2-2 代码 2-2-1 原型 2-2-2 ver0.1 1 资料 <Python网络爬虫从入门到实践> ...

  9. Python爬虫实战 | 利用多线程爬取 LOL 高清壁纸

    来源:公众号[杰哥的IT之旅] 作者:阿拉斯加 ID:Jake_Internet 如需获取本文完整代码及 LOL 壁纸,请为本文右下角点赞并添加杰哥微信:Hc220088 获取. 一.背景介绍 随着移 ...

最新文章

  1. oracle 察看用户是否被锁,解锁以及改密码
  2. 开源协议概谈[转载]
  3. 其实,我只想安静的写写代码...
  4. 一篇不错的v4l2 (实用)
  5. 半深入理解CSS3 object-position/object-fit属性
  6. 非平稳序列的随机性分析(SAS)
  7. python计算圆环的面积_圆环的面积计算公式
  8. ssget 用法详解
  9. 美颜SDK的出现给直播和短视频平台带来了哪些影响?
  10. jersey 过滤_Jersey的Filter详解
  11. 【老罗笔记】关于成就的那些事
  12. 『尼罗河魅影之谜』的故事模式与推理内核
  13. linux rsh通信实现_RSH的网络通信细节
  14. 传奇开群服/公益服用什么服务器最好?
  15. Open Replicator
  16. 负数补码表示范围以及规格化数
  17. 攻防世界-leaking-(详细操作)做题过程
  18. 本科课程【数字图像处理】实验2 - 图像增强
  19. 概率论中几种常见的分布形式(二项分布,均匀分布和指数分布)
  20. 安装redis及redis集群及解决连接不上redist问题

热门文章

  1. discuz列表页添加分页
  2. 软件卸载不得不说的几件事
  3. Mac虚拟机安装win7攻略 必须点赞
  4. 程序猿咆哮体--纯娱乐,勿认真
  5. C++输入cin,cin.get(),cin.getline()详细比较及例子
  6. Python中用pandas和openpyxl向Excel填入数据,不覆盖源数据和格式
  7. MFC对话框背景图片的设置
  8. <Dive into Python>大补贴(2)
  9. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
  10. python数据分析和机器学习入门,我有一些书单来推荐