爬取旅游网站

2023-11-10

完整代码如下(可直接copy):

from bs4 import BeautifulSoup
import urllib.request
import sqlite3
import os
import time
import threading


class Database:
    def open(self):
        self.con=sqlite3.connect("travels.db")
        self.cursor=self.con.cursor()

    def close(self):
        self.con.commit()
        self.con.close()

    def initialize(self):
        try:
            self.cursor.execute("drop table items")
        except:
            pass
        self.cursor.execute("create table items(ID varchar(8) primary key, tDate varchar(16), tTitle varchar(1024), tContent text, tExt varchar(8))")

    def insert(self, ID, tDate, tTitle, tContent, tExt):
        try:
            self.cursor.execute("insert into items (ID,tDate,tTitle,tContent,tExt) values(?, ?, ?, ?, ?)", [ID, tDate, tTitle, tContent, tExt])
        except Exception as err:
            print(err)

    def show(self):
        self.cursor.execute("select ID,tDate,tTitle,tContent,tExt from items order by ID")
        rows = self.cursor.fetchall()
        for row in rows:
            print(row[0])
            print(row[1])
            print(row[2])
            print(row[3])
            print(row[4])
            print()
        print("Total", len(rows), "items")


def downloadImage(ID, src, tExt):
    try:
        req = urllib.request.Request(src, headers=headers)
        resp = urllib.request.urlopen(req, timeout=20)
        data = resp.read()
        imgName = ID + "." + tExt
        f = open("download\\" + imgName, "wb")
        f.write(data)
        f.close()
        print("Downloaded " + imgName)
    except Exception as err:
        print(err)


def downloadContent(url):
    content = ""
    try:
        req = urllib.request.Request(url, headers=headers)
        resp = urllib.request.urlopen(req)
        html = resp.read().decode()
        soup = BeautifulSoup(html, "lxml")
        ps = soup.select("div[id='Content'] p")
        for p in ps:
            content += p.text + "\n"
    except Exception as err:
        print(err)
    return content


def initializeDownload():
    if not os.path.exists("download"):
        os.mkdir("download")
    fs=os.listdir("download")
    for f in fs:
        os.remove("download\\"+f)


def spider(url):
    global page, count, DB, threads
    page = page + 1
    print("Page", page, url)
    try:
        req = urllib.request.Request(url, headers=headers)
        resp = urllib.request.urlopen(req)
        html = resp.read().decode()
        soup = BeautifulSoup(html, "lxml")
        divs = soup.select("div[class='lft_art lf'] div[class='mb10 tw3_01_2']")
        for div in divs:
            tTitle = div.select_one("span h4").text
            tDate = div.select_one("span b").text
            count = count + 1
            ID = "%06d" % count
            img = div.select_one("span a img")
            src = ""
            tExt = ""
            if img:
                src = urllib.request.urljoin(url, img["src"])
                p = src.rfind(".")
                if p >= 0:
                    tExt = src[p + 1:]
                T = threading.Thread(target=downloadImage, args=[ID, src, tExt])
                T.start()
                threads.append(T)
            link = div.select_one("span h4 a")["href"]
            link = urllib.request.urljoin(url, link)
            tContent = downloadContent(link)
            DB.insert(ID, tDate, tTitle, tContent, tExt)
        nextUrl = ""
        links = soup.select("div[id='div_currpage'] a[class='pagestyle']")
        for link in links:
            if link.text == "Next":
                href = link["href"]
                if href.startswith("//www."):
                    nextUrl = "http:" + href
                else:
                    nextUrl = urllib.request.urljoin(url, href)
                break
            if nextUrl:
                spider(nextUrl)
    except Exception as err:
        print(err)


headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0)AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 32.0.1664.3Safari / 537.36"}

while True:
    print("1.Spider")
    print("2.Show")
    print("3.Exit")
    s = input("Please enter(1,2,3):")
    if s == "1":
        initializeDownload()
        threads = []
        page = 0
        count = 0
        DB = Database()
        DB.open()
        DB.initialize()
        spider(url="http://www.chinadaily.com.cn/travel/citytours")
        DB.close()
        for T in threads:
            T.join()
        print("Total %d pages, %d items" % (page, count))
    elif s == "2":
        DB = Database()
        DB.open()
        DB.show()
        DB.close()
    else:
        break

运行结果:

 

爬取到的图片:

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬取旅游网站 的相关文章

  • 如果两点之间的距离低于某个阈值,则从列表中删除点

    我有一个点列表 只有当它们之间的距离大于某个阈值时 我才想保留列表中的点 因此 从第一个点开始 如果第一个点和第二个点之间的距离小于阈值 那么我将删除第二个点 然后计算第一个点和第三个点之间的距离 如果该距离小于阈值 则比较第一点和第四点
  • 是否有解决方法可以通过 CoinGecko API 安全检查?

    我在工作中运行我的代码 一切都很顺利 但在不同的网络 家庭 WiFi 上 我不断收到403访问时出错CoinGecko V3 API https www coingecko com api documentations v3 可以观察到 在
  • 中断 Select 以添加另一个要在 Python 中监视的套接字

    我正在 Windows XP 应用程序中使用 TCP 实现点对点 IPC 我正在使用select and socketPython 2 6 6 中的模块 我有三个 TCP 线程 一个读取线程通常会阻塞select 一个通常等待事件的写入线程
  • 与区域指示符字符类匹配的 python 正则表达式

    我在 Mac 上使用 python 2 7 10 表情符号中的标志由一对表示区域指示符号 https en wikipedia org wiki Regional Indicator Symbol 我想编写一个 python 正则表达式来在
  • 处理 Python 行为测试框架中的异常

    我一直在考虑从鼻子转向行为测试 摩卡 柴等已经宠坏了我 到目前为止一切都很好 但除了以下之外 我似乎无法找出任何测试异常的方法 then It throws a KeyError exception def step impl contex
  • 使用 Python 从文本中删除非英语单词

    我正在 python 上进行数据清理练习 我正在清理的文本包含我想删除的意大利语单词 我一直在网上搜索是否可以使用像 nltk 这样的工具包在 Python 上执行此操作 例如给出一些文本 Io andiamo to the beach w
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • 如何在 Python 中解析和比较 ISO 8601 持续时间? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Python v2 库 它允许我解析和比较 ISO 8601 持续时间may处于不同单
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • “隐藏”内置类对象、函数、代码等的名称和性质[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我很好奇模块中存在的类builtins无法直接访问的 例如 type lambda 0 name function of module
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 仅第一个加载的 Django 站点有效

    我最近向 stackoverflow 提交了一个问题 标题为使用mod wsgi在apache上多次请求后Django无限加载 https stackoverflow com questions 71705909 django infini
  • 根据列 value_counts 过滤数据框(pandas)

    我是第一次尝试熊猫 我有一个包含两列的数据框 user id and string 每个 user id 可能有多个字符串 因此会多次出现在数据帧中 我想从中导出另一个数据框 一个只有那些user ids列出至少有 2 个或更多string
  • 如何在 pygtk 中创建新信号

    我创建了一个 python 对象 但我想在它上面发送信号 我让它继承自 gobject GObject 但似乎没有任何方法可以在我的对象上创建新信号 您还可以在类定义中定义信号 class MyGObjectClass gobject GO
  • 使用for循环时如何获取前一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 循环内的上一个和下一个值 https stackoverflow com questions 1011938 python previous and next values inside
  • Scipy Sparse:SciPy/NumPy 更新后出现奇异矩阵警告

    我的问题是由大型电阻器系统的节点分析产生的 我基本上是在设置一个大的稀疏矩阵A 我的解向量b 我正在尝试求解线性方程A x b 为了做到这一点 我正在使用scipy sparse linalg spsolve method 直到最近 一切都
  • 如何应用一个函数 n 次? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 假设我有一个函数 它接受一个参数并返回相同类型的结果 def increment x return x 1 如何制作高阶函数repeat可以
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重

随机推荐

  • websocket如何设置header

    websocket请求的时候要获取请求头而且需要给前端相同的相应 所以需要处理 这里记录一下 创建一个配置类 并且继承ServerEndpointConfig Configurator 重写modifyHandshake方法 获取请求头和反
  • Vue todos代办事项功能

    今天做的笔记是todos 待办事项项目 相信大家学完vue基础后 迫不及待想实现一些功能 所以这里我会用到Vue基础语法 和一些js的知识来互相结合运用 可能写的笔记不太好 大家耐心观看 有意见可以在评论区留言 我不会分享源码哦 大家想要源
  • 数字电路经验贴

    1 有时候会写一些通用模块 但是在实际使用的时候 模块内部的功能不会全部用到 会导致覆盖率上不去 以及面积增大 后续工作可以考虑怎么避免这种情况
  • ubuntu系统空间占满,无法启动

    1 今天第一次遇到Ubuntu系统整个崩溃无法启动 这个时候会出现下图所示 2 此时重启 选择recovery模式 进行修复 如下图所示 小白的我不懂以为只要进行了第二项的清处就可以 亲自尝试只清理出空间80M 3 此时应该选择root 选
  • 【机器人仿真Webots教程】-Webots安装

    Webots安装 文章目录 Webots安装 1 Webots简介 2 Webots安装 2 1 系统要求 2 2 验证显卡驱动 2 3 安装 3 Webots仿真 3 1 world文件 3 2 Controller文件 3 3 Supe
  • “全国首款自主研发IDE”——CEC-IDE(VSCode)

    省流 开源的钱真好赚 本人没有多好的文笔直接放图 从 芯 出发 前端时间用 芯 做营销的还是一个无脑恋爱剧 我的中国 芯 现在打着爱国旗号的钱就那么好圈了吗 然后就是软件上图为微软开发开源的代码编辑器下图为所谓国产自研的IDE 不能说是毫不
  • jqgrid jsonReader

    jsonReader root data page page total total records record repeatitems false 1 json 是一个比较好web 传送数据格式 jqgrid里面jsonreader 怎
  • 学习笔记-Matlab算法篇-时间序列

    时间序列 01时间序列模型 介绍 时间序列是按时间顺序排列的 随时间变化且相互关联的数据序列 分析时间序列的方法构成数据分析的一个重要领域 即时间序列分析 时间序列根据所研究的依据不同 可有不同的分类 1 按所研究的对象的多少分 有一元时间
  • uniapp的picker标签实现多级联动

  • C语言中#if的使用

    if定义 if和 endif是一组同时使用的 叫做条件编译指令 if与 define include等指令一样是由预处理器这个强大的工具处理的 预处理器可以在编译前处理c程序 if使用 if的后面接的是表达式 if MAX 10 MAX 2
  • filezilla如何连接远程FTP服务器

    进入站点管理 创建站点 填写对应连接信息 端口默认不写就是21
  • c语言编程代码五星红旗,飘动的五星红旗

    程序清单 include graphics h include stdlib h void main int size int driver VGA int mode VGAHI int d 60 40 60 65 65 40 50 65
  • 平衡车之mpu6050调试及问题总结

    这里重点讲解AD0的作用 I2C通讯中从机是要有地址的 以区别多个从机 当AD0管脚接低电平的时候 从机地址是0x68 从MPU6050的寄存器中我们可以得到答案 MPU6050作为一个IIC从机设备的时候 有8位地址 高7位的地址是固定的
  • java.lang.NumberFormatException for input string “1“异常处理

    首先说下这个异常出现原因 这个异常是因为csv编码为utf 8导致的 改成就ANSI好了 然后再说明一下异常出现场景 读取csv文件 gt 转成json数据 gt 再转成对象 这个异常是在json数据转成对象时出现了 JSONObject
  • Struts2基础学习总结

    Struts 2是在WebWork2基础发展而来的 注意 struts 2和struts 1在代码风格上几乎不一样 Struts 2 相比Struts 1的优点 1 在软件设计上Struts 2 没有像Struts 1那样跟Servlet
  • C语言基础入门48篇_42_共用体(关键字union,共用体占用大小为成员中最大值、结构体为所有成员相加,所占内存比单纯相加大)

    1 共用体的定义与使用 共用体的关键字是 union 共用体是非基本数据类型 同结构体类似 我们需要先声明共用体类型 再利用自定义的类型去定义变量 include
  • 揭秘国产操作系统的黄金测试利器:探索开源测试工具的神秘世界

    揭秘国产操作系统的黄金测试利器 探索开源测试工具的神秘世界 文章目录 1 前言 2 国产操作系统现状的深度解析 3 国产操作系统的质量保障神器 开源测试工具 4 开源测试工具的重要性 5 国产操作系统如何利用开源测试工具进行黄金测试 6 国
  • 什么是子系统、模块、功能点,你清楚吗?

    1 子系统 对于所实现系统在功能上做的整体划分 可以是某个子系统 2 功能模块 子系统下的功能点的集合 3 功能点 通过用户交互触发 外部系统触发或后台程序触发来完成的一个完整的动作 搞清楚这些 有助于你书写建设方案 设计文档
  • Java--IDEA中Spring配置错误:class path resource [.xml] cannot be opened because it does not exist

    一 报错 运行 Spring 项目时报错如下 class path resource beans xml cannot be opened because it does not exist 没有找到 beans xml 配置文件 二 报错
  • 爬取旅游网站

    完整代码如下 可直接copy from bs4 import BeautifulSoup import urllib request import sqlite3 import os import time import threading