【爬虫】3.4 爬取网站复杂数据

这篇具有很好参考价值的文章主要介绍了【爬虫】3.4 爬取网站复杂数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 os

app = 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 data


if __name__ == "__main__":
    app.run()

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

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

from bs4 import BeautifulSoup
import urllib.request


def spider(url):
    global urls
    if 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 + "/" + href
                spider(url)
        except Exception as err:
            print(err)


start_url = "http://127.0.0.1:5000"
urls = []
spider(start_url)
print("The End")

运行结果如下:

【爬虫】3.4 爬取网站复杂数据

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

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

3. 爬取程序的改进

(1)服务器程序

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

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

import flask
import os
import random
import time

app = 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 data


if __name__ == "__main__":
    app.run()

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

(2)客户端程序

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

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

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

from bs4 import BeautifulSoup
import urllib.request
import threading


def 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 urls
    if 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 + "/" + href
                spider(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")

执行结果如下:

【爬虫】3.4 爬取网站复杂数据

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


下一篇文章:3.5 实践项目——爬取网站的图像文件文章来源地址https://www.toymoban.com/news/detail-478898.html

到了这里,关于【爬虫】3.4 爬取网站复杂数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python爬虫:如何使用Python爬取网站数据

    更新:2023-08-13 15:30 想要获取网站的数据?使用Python爬虫是一个绝佳的选择。Python爬虫是通过自动化程序来提取互联网上的信息。本文章将会详细介绍Python爬虫的相关技术。 在使用Python爬虫之前,我们需要理解网络协议和请求。HTTP是网络传输的重要协议,它是在Web浏览器和

    2024年02月13日
    浏览(49)
  • Python爬虫:实现爬取、下载网站数据的几种方法

    使用脚本进行下载的需求很常见,可以是常规文件、web页面、Amazon S3和其他资源。Python 提供了很多模块从 web 下载文件。下面介绍 requests 模块是模仿网页请求的形式从一个URL下载文件 示例代码: 安装 wget 库 示例代码 有些 URL 会被重定向到另一个 URL,后者是真正的下载链接

    2024年02月05日
    浏览(73)
  • server win搭建apache网站服务器+php网站+MY SQL数据库调用电子阅览室

    1、使用开源的免费数据库Mysql; 2、自己建网站的发布; 3、使用php代码建网站; 4、使用windows server作为服务器; 5、使用apache作为网站服务器。 apache下载地址一:Apache VS17 binaries and modules download apache下载地址二:Apche下载 1、https://httpd.apache.org 2、点Files for Microsoft Windows 3、点

    2024年04月10日
    浏览(63)
  • 网站架构演变、LNP+Mariadb数据库分离、Web服务器集群、Keepalived高可用

    目录 day02 深入理解程序的数据存储 验证 配置NFS服务器 配置代理服务器 配置名称解析 程序将文字数据保存到数据库中 程序将非文字数据(如图片、视频、压缩包等)保存到相应的文件目录中 验证 发一篇文章,文章内容包含文字和图片 在数据库中查看文字数据。在最新的一

    2024年02月20日
    浏览(46)
  • 服务器主机:复杂理论的视角与SEO策略

    本文分享自天翼云开发者社区《服务器主机:复杂理论的视角与SEO策略》,作者:不知不觉 在数字世界的演变中,服务器主机在信息存储和数据处理方面发挥着核心作用。本文将带你重新认识服务器主机的价值,并通过复杂理论解释其重要性和必要性,同时结合SEO布局来

    2024年02月08日
    浏览(42)
  • 使用Python搭建代理服务器- 爬虫代理服务器详细指南

    搭建一个Python爬虫代理服务器可以让你更方便地管理和使用代理IP。下面是一个详细的教程来帮助你搭建一个简单的Python爬虫代理服务器: 1. 首先,确保你已经安装了Python。你可以在官方网站(https://www.python.org/)下载并安装最新版本的Python。 2. 安装所需的Python库。打开终端或

    2024年02月15日
    浏览(44)
  • 爬虫机试题-爬取新闻网站

    之前投简历时遇到了这样的一个笔试。本以为会是数据结构算法之类的没想到直接发了一个word直接提需求,感觉挺有意思就写了这篇文章,感兴趣的朋友可以看看。 通过分析页面结构我们得以知道,这个页面本身没有新闻信息,是由js代码执行后才将信息插入到html中的,因

    2024年04月25日
    浏览(37)
  • 【爬虫】python爬虫爬取网站页面(基础讲解)

    👉博__主👈:米码收割机 👉技__能👈:C++/Python语言 👉公众号👈:测试开发自动化【获取源码+商业合作】 👉荣__誉👈:阿里云博客专家博主、51CTO技术博主 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 1. 导入必要的库 requests 库用于发送HTTP请

    2024年02月08日
    浏览(45)
  • 服务器网站搭建(一)

    一台服务器,我买的腾讯云新加坡的。根据需求选择配置。 重置密码: 自己设置的密码要记住: 登录: 安装宝塔(centos系统),参考官网: 执行命令: 如下,遇到选择就输入y回车: 最后输出如下,请复制保存到一个文档,下次登录直接复制账号密码即可: 回到服务器,打

    2024年02月08日
    浏览(53)
  • Web网站服务器

    目录 一、什么是Apache? 二、虚拟目录是什么? 三、Apcahe相关配置文件 四、httpd.conf主配置文件的常用配置参数 五、Web网站配置案例 5.1搭建基于用户的个人主页网站 5.2、配置虚拟目录 5.3、配置虚拟主机 5.3.1搭建两个基于IP地址的虚拟主机 5.3.2搭建两个基于域名的站点 5.3.3搭建

    2024年02月10日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包