1. Web服务器网站

进一步把前面的Web网站的mysql.html, python.html, java.html丰富其中 的内容,并加上图形:

mysql.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>mysql</title>
</head>
<body><h3>MySQL数据库</h3><div>MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗 下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是 最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软 件。</div><div><img src="mysql.jpg"  /></div><a href="books.html">Home</a>
</body>
</html>

java.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>java</title>
</head>
<body><h3>Java程序设计</h3><div>Java是一门面向对象编程语言,不仅吸收了C++语言的各种优 点,还摒弃了C++里难以理解的多继承、指针等概念,因此 Java语言具有功能强大和简单易用两个特征。Java语言作为静 态面向对象编程语言的代表,极好地实现了面向对象理论,允 许程序员以优雅的思维方式进行复杂的编程.</div><div><img src="java.jpg"></div><a href="books.html">Home</a>
</body>
</html>

python.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>python</title>
</head>
<body><h3>Python程序设计</h3><div>Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一 种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。</div><div><img src="python.jpg"></div><a href="books.html">Home</a>
</body>
</html>

2. 爬取网站的复杂数据

服务器server.py程序还是前面3.2的,如下:

import flask
import osapp = flask.Flask(__name__)def getFile(fileName):data = b""if os.path.exists(fileName):fobj = open(fileName, "rb")data = fobj.read()fobj.close()return data@app.route("/")
def index():return getFile("books.html")@app.route("/<section>")
def process(section):data = ""if section != "":data = getFile(section)return dataif __name__ == "__main__":app.run()

爬取网站中的mysql, python, java的简介与图像。我们看到简介在网页的第一个<div>中,图像在<img>中,而且只有这3个网页有这样的特征,

设计客户端client.py程序如下:

from bs4 import BeautifulSoup
import urllib.requestdef spider(url):global urlsif url not in urls:urls.append(url)try:data = urllib.request.urlopen(url)data = data.read().decode()soup = BeautifulSoup(data, "lxml")print(soup.find("h3").text)divs = soup.select("div")imgs = soup.select("img")# 判断这个url页面是否有<div>与<img>,如果有就获取第一个<div>的文字,下载第一个<img>的图像if len(divs) > 0 and len(imgs) > 0:print(divs[0].text)url = start_url + "/" + imgs[0]["src"]urllib.request.urlretrieve(url, "downloaded-" + imgs[0]["src"])print("download-", imgs[0]["src"])links = soup.select("a")for link in links:href = link["href"]url = start_url + "/" + hrefspider(url)except Exception as err:print(err)start_url = "http://127.0.0.1:5000"
urls = []
spider(start_url)
print("The End")

运行结果如下:

程序执行完毕后还看到下载了3个文件:

"downloaded-mysql.jpg"、 "downloadedpython.jpg"、"downloaded-java.jpg"

3. 爬取程序的改进

(1)服务器程序

由于我们的web网站时本地的,因此下载图像非常快,而实际应用中 Web网站是远程的一个服务器,由于网络原因可能下载会比较慢。为了 模拟这个过程,

改进后的服务器serverUpdate.py程序如下:

import flask
import os
import random
import timeapp = flask.Flask(__name__)def getFile(fileName):data = b""if os.path.exists(fileName):fobj = open(fileName, "rb")data = fobj.read()fobj.close()# 随机等待1-10秒time.sleep(random.randint(1, 10))return data@app.route("/")
def index():return getFile("books.html")@app.route("/<section>")
def process(section):data = ""if section != "":data = getFile(section)return dataif __name__ == "__main__":app.run()

该程序在每次返回一个网页或者图像的函数getFile中都随机等待了1- 10秒,这个过程十分类似网络条件较差的情景,即访问任何一个网页或 者图像都有1-10秒的延迟。

(2)客户端程序

从目前的程序来看这个程序在下载一个图像时是等待的,如果这个图像很大,那么下载时间很长,程序就必须一直等待,其它网页就无法继续访问,即卡死在一个网页的图像下载处。为了避免这个问题,一般可以对程序做以下改进:

  • 设置urllib.request下载图像的时间,如果超过一定时间还没有完 成下载就放弃;
  • 设置下载过程是一个与主线程不同的子线程,子线程完成下载 任务,不影响主线程继续访问别的网页。

改进后的客户端clientUpdate.py程序如下:

from bs4 import BeautifulSoup
import urllib.request
import threadingdef download(url, fileName):try:# 设置下载时间最长100秒data = urllib.request.urlopen(url, timeout=100)data = data.read()fobj = open("download" + fileName, "wb")fobj.write(data)fobj.close()print("download", fileName)except Exception as err:print(err)def spider(url):global urlsif url not in urls:urls.append(url)try:data = urllib.request.urlopen(url)data = data.read().decode()soup = BeautifulSoup(data, "lxml")print(soup.find("h3").text)links = soup.select("a")divs = soup.select("div")imgs = soup.select("img")# 判断这个url页面是否有<div>与<img>,如果有就获取第一个<div>的文字,下载第一个<img>的图像if len(divs) > 0 and len(imgs) > 0:print(divs[0].text)url = start_url + "/" + imgs[0]["src"]# 启动一个下载线程下载图像T = threading.Thread(target=download, args=(url, imgs[0]["src"]))T.setDaemon(False)T.start()threads.append(T)for link in links:href = link["href"]url = start_url + "/" + hrefspider(url)except Exception as err:print(err)start_url = "http://127.0.0.1:5000"
urls = []
threads = []
spider(start_url)
# 等待所有线程执行完毕
for t in threads:t.join()
print("The End")

执行结果如下:

从结果看到访问java.htm网页后没有及时完成java.jpg的下载,java.jpg是在访问 network.htm网页后才完成下载的,这就是多线程的过程。

【爬虫】3.4 爬取网站复杂数据相关推荐

  1. Python爬虫实战之爬取网站全部图片(一)

    Python爬虫实战之爬取网站全部图片(二) Python爬虫实战之通过ajax获得图片地址实现全站图片下载(三) 一.获得图片地址 和 图片名称 1.进入网址之后 按F12  打开开发人员工具点击e ...

  2. Python爬取网站图片数据

    Python爬取网站图片数据 找到需要爬取的网站地址 模拟网站http请求 根据调试模式获取的了解读取到真实的地址url,读取请求头数据和参数信息,模拟http请求调用 import requests ...

  3. python爬虫课设-爬取3000条数据并做数据可视化

    很久以前接的单子,分享一下(挺水的,将就着看吧) 文章目录 作业要求 数据爬取 爬取结果 数据处理 数据可视化 大作业文档 作业要求 <Python与数据分析>期末大作业要求(2020-2 ...

  4. 爬虫入门01 -- 爬取在线课程数据

    文章目录 一.介绍 二.遇到的问题 三.代码 一.介绍 该例为使用python进行爬虫,主要是再网易云课堂中搜索"python"后将搜索到的课程内容拿下来并且保存到本地excel文 ...

  5. python爬取豆瓣影评_【python爬虫实战】爬取豆瓣影评数据

    概述: 爬取豆瓣影评数据步骤: 1.获取网页请求 2.解析获取的网页 3.提速数据 4.保存文件 源代码: # 1.导入需要的库 import urllib.request from bs4 impo ...

  6. Python爬虫实战之爬取网站全部图片(二)

    通过python 来爬取网站内所有的图片到本地 第三篇是动态获取参数构造图片地址实现下载图片  传送门:https://blog.csdn.net/qq_33958297/article/detail ...

  7. app.vue里使用data_Python爬虫使用正则爬取网站,正则都不会就别玩爬虫了!

    本文章的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,滥用技术产生的风险与本人无关.本文章是自己学习的一些记录.欢迎各位大佬点评! 源码在GitHub上面,且相关介绍更 ...

  8. python怎么爬取一个网页图片_python爬虫怎么实现爬取网站图片?

    对于网页结构而言,图片也就是一个文件及文件目录+名字的放在html中的src标签里.找到这个src标签对应的内容,就可以图片爬取下来. ps:有些网站的图片可能不是放在src标签里的,可能放在data ...

  9. python爬虫使用正则爬取网站

    本文章的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,滥用技术产生的风险与本人无关. 本文章是自己学习的一些记录.欢迎各位大佬点评! 在这里放上我爬取的数据的网页,我将 ...

最新文章

  1. JavaSE--jdom解析之bom
  2. 【图论专题】负环与01分数规划
  3. RF-LIO:面向高动态场景的紧耦合LiDAR惯导融合里程计(IROS 2021)
  4. 一切都是问题,一切都着落在自身
  5. Android项目架构设计深入浅出
  6. vbs代码炫酷效果_Python|实现黑客帝国代码雨效果
  7. 【2016年第1期】CCF大专委2016年大数据发展趋势预测—— 解读和行动建议
  8. linux 内核模型,The Linux Kernel Device Model - Overview -- Linux 内核设备模型概述
  9. Android AsyncTask Download
  10. 转载】Unity3D美术方面贴图蓄力帖(值得珍藏学习)
  11. FlashFXP 连接成功无法显示目录
  12. 19、21、22、24英寸液晶屏幕实际尺寸4:3、16:9、16:10详表
  13. 微信公众号开发功能大全
  14. 翻过大山越过海洋看到了什么
  15. 嵌入式系统简介、应用及发展
  16. Matlab - 获取和保存文件路径选择对话框
  17. 使用opencv将jpg转png
  18. 记一次U盘热插拔导致的问题
  19. 做外贸算运费的时候需不需要多算一些
  20. 名编辑电子杂志大师教程 | 如何自定义PDF的导入页数?

热门文章

  1. Android系列之自定义视频播放器
  2. 04741计算机网络原理2018年版-第二章 网络应用 知识要点
  3. 蓝牙技术的发展与历程
  4. windows程序托盘图标以及消息提示--基本知识(NOTIFYICONDATA)
  5. 游戏思考24:游戏寻路算法思考和Unity场景相关代码开发原则及导入地图数据(10/09)
  6. Quartz:配置,资源使用和SchedulerFactory-10
  7. 基于 K-means 算法的校园微博热点话题发现系统
  8. 从功能测试到年薪30W的自动化测试完整心理历程--绝对让你不虚此行!
  9. java webservice 调用超时_调用webservice接口超时
  10. MacBook 终端 修改 bash 和 zsh