python爬取网站数据,作为后端数据

一. 内容简介

python爬取网站数据,作为后端数据

二. 软件环境

2.1vsCode

2.2Anaconda

version: conda 22.9.0

2.3代码

链接:

三.主要流程

3.1 通过urllib请求网站

里面用的所有的包

! pip install lxml
! pip install selenium
! pip install pyautogui

通过urllib请求网站,需要注意一个问题,需要js加载的他都会没有,
使用 urllib 或 requests 库通常无法获取完整的页面内容,因为这些库只会获取页面的初始 HTML,而不会执行 JavaScript。

import urllib.request
from lxml import etree
import json
from selenium.webdriver.common.by import By
from selenium import webdriver
import random 
import time
import pyautogui
from datetime import datetime

def urllibRequest(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
    }
    request = urllib.request.Request(url=url, headers=headers)
    response = urllib.request.urlopen(request)

    content = response.read().decode('UTF-8')
    return content

url = "https://cxcy.upln.cn/"
print(url)
content = urllibRequest(url)
print(content)

最原始的网页,什么也没有,部分网页是这样的,没办法通过urllib 或 requests来获取完整的结构。
在这里插入图片描述

3.2 通过selenium请求网站

这个是通过驱动调用浏览器去进行访问,Selenium 可以模拟真实浏览器的行为,包括执行 JavaScript 代码,从而获取完整的页面内容。代码只需要给定链接,谷歌浏览器的exe位置,和网页加载时间就可以了,不需要下载谷歌浏览器驱动。

import urllib.request
from lxml import etree
import json
from selenium.webdriver.common.by import By
from selenium import webdriver
import random 
import time
import pyautogui
from datetime import datetime

def seleniumRequest(url,chrome_path,waitTime): 
        options = webdriver.ChromeOptions()
        options.add_experimental_option('excludeSwitches', ['enable-automation'])
        options.add_experimental_option('useAutomationExtension', False)
        # 谷歌浏览器exe位置
        options.binary_location = chrome_path
        # 是否要启动页面
        options.add_argument("--headless")  # 启用无头模式
        # GPU加速有时候会出bug
        options.add_argument("--disable-gpu")  # 禁用GPU加速
        options.add_argument("--disable-blink-features=AutomationControlled")
        driver = webdriver.Chrome(options=options)
        driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
                                {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})
        # 启动要填写的地址,这就启动浏览器
        driver.get(url)
        # 这是关闭浏览器
        # 等待页面加载,可以根据实际情况调整等待时间
        driver.implicitly_wait(waitTime)

        # 获取完整页面结构
        full_page_content = driver.page_source

        # 关闭浏览器
        driver.quit()

        return full_page_content
# # 处理完整页面结构
# print(full_page_content)
url = "https://cxcy.upln.cn/"
print(url)

chrome_path = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
waitTime = 8
# 获取网页结构
# 通过selenium调用浏览器访问
content = seleniumRequest(url,chrome_path,waitTime)
print(content)

可以看到拿到了完整的网页结构了
在这里插入图片描述

3.2 通过request请求api,并保存json数据

import requests
import json

def apiRequset(api_url):
    headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
    }
    # 发起带有头部信息的 GET 请求
    response = requests.get(api_url, headers=headers)
    # 检查请求是否成功
    if response.status_code == 200:
        # 解析 JSON 数据
        data = response.json()
        return data
api_url = 'https://cxcy.upln.cn/provincial/match/competition/queryOngoing?_t=1699950536&year=2023&code=2&column=createTime&order=desc&field=id,&pageNo=1&pageSize=10'
data = apiRequset(api_url)
json_data = json.dumps(data, indent=4)
 # 将JSON数据写入文件
with open("data.json", "w") as json_file:
    json_file.write(json_data)

在这里插入图片描述

3.4 通过xpath获取网页结构里面的数据,并存入json

xpath语法可以自己查一下,网上有很多

import urllib.request
from lxml import etree
import json
from selenium.webdriver.common.by import By
from selenium import webdriver
import random 
import time
import pyautogui
from datetime import datetime

url = "https://cxcy.upln.cn/"
print(url)
imgs = []
chrome_path = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
waitTime = 8
# 获取网页结构
# 通过selenium调用浏览器访问
content = seleniumRequest(url,chrome_path,waitTime)
# 这是直接请求得到的html,
# slelenium会拼接字符串
# content = urllibRequest(url)

# 给html变成tree用于xpath解析用
tree = etree.HTML(content)
# 改进的XPath表达式,选择你感兴趣的div元素
# 解析对应数据
bannerimgs = tree.xpath("//div[@class='img-box']//img/@src")
print(bannerimgs)
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
for index, url in enumerate(bannerimgs):
    print(index,url)
    img = {
        #   'img_id':,
        'img_url':url,
        'prod_id':None,
        'seq':index+1,
        'status':1,
        'create_time':current_time,
        'update_time':current_time,
    }
    imgs.append(img)

json_data = json.dumps(imgs, indent=4)
 # 将JSON数据写入文件
with open("data.json", "w") as json_file:
    json_file.write(json_data)
print("JSON数据已保存到文件")

在这里插入图片描述

3.4 读取json,将数据存入对应的数据库中

先下载驱动

! pip install mysql-connector-python
import json
import mysql.connector

# 读取JSON文件
with open('data.json', 'r') as file:
    data = json.load(file)

# 连接到MySQL数据库
conn = mysql.connector.connect(
    host='localhost',
    port=3306,  # MySQL默认端口号
    user='root',
    password='1234qwer',
    database='competitionassistant'
)

cursor = conn.cursor()

# 创建表(如果不存在的话),并清空表数据
# cursor.execute('''
#     CREATE TABLE IF NOT EXISTS your_table (
#         id INT AUTO_INCREMENT PRIMARY KEY,
#         name VARCHAR(255),
#         age INT,
#         other_field VARCHAR(255)
#     )
# ''')
# 先清空一下表

cursor.execute('TRUNCATE TABLE index_img')
# 将数据插入数据库
for item in data:
    # print(item)
    # cursor.execute('''
    #     INSERT INTO index_img (img_url, prod_id, seq, status, create_time, update_time)
    #     VALUES (%s, %s, %s, %s, %s, %s)
    # ''', (item['img_url'], item['prod_id'], item['seq'], item['status'], item['create_time'], item['update_time']))
    
    sql_statement = f"""
    INSERT INTO index_img (img_url, prod_id, seq, status, create_time, update_time)
    VALUES ('{item['img_url']}', 0, {item['seq']}, {item['status']}, '{item['create_time']}', '{item['update_time']}')
    """

    print(sql_statement)
    cursor.execute(sql_statement)

    # print()
# 提交更改并关闭连接
conn.commit()
conn.close()

有一个问题需要注意,这种拼接的,大部分情况都还好,都可以用,但是拼接链接以及时间这种里面有一些其他字符的情况下,他拼接好的语句给数据库是没办法执行的,他也不会报错,这样的问题就比较难找,所以我就直接用字符串拼接接了,不太安全。

    INSERT INTO index_img (img_url, prod_id, seq, status, create_time, update_time)
    VALUES (/img/bg3.f0b8e5f1.jpg, 0, 1, 1, '023-11-15 13:03:49, 2023-11-15 13:03:49)
    cursor.execute('''
         INSERT INTO index_img (img_url, prod_id, seq, status, create_time, update_time)
         VALUES (%s, %s, %s, %s, %s, %s)
     ''', (item['img_url'], item['prod_id'], item['seq'], item['status'], item['create_time'], item['update_time']))

爬到的数据
在这里插入图片描述
执行代码存入数据库中
在这里插入图片描述
启动后端服务器,请求接口查询服务器,可以查到数据。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/148384.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据创新加速产业发展∣企企通亮相2023浙北CIO峰会,以技术驱动数智升级

近年来,政府工作报告多次提及数字化,要求“加快数字化发展,发展数字经济,推进数字产业化,推动数字经济和实体经济深度融合,打造具有国际竞争力的数字产业集群”。数据成为推动企业数字化转型发展、提质增效…

【带头学C++】----- 六、结构体 ---- 6.1 结构体概述

6.1 结构体概述(struct) 结构体(struct)是C中用于自定义数据类型的一种机制,它允许将多个不同类型的变量(成员变量)组合在一起形成一个新的数据类型。结构体允许程序员创建一个包含不同数据类型…

vue中通过.style.animationDuration属性,根据数据长度动态设定元素的纵向滚动时长的demo

根据数据长度动态设定元素的animation 先看看效果,是一个纯原生div标签加上css实现的表格纵向滚动动画: 目录 根据数据长度动态设定元素的animationHTMLjs逻辑1、判断是数据长度是否达到滚动要求2、根据数据长度设置滚动速度 Demo完整代码 HTML 1、确…

算法萌新闯力扣:最后一个单词的长度

力扣热题:最后一个单词的长度 开篇 健康是奋斗的本钱,今天生病后深有体会。看电脑都头晕,勉强来发道题吧。。 题目链接:58.最后一个单词的长度 题目描述 代码纯享版 class Solution {public int lengthOfLastWord(String s) {int sum 0…

python基于图卷积神经网络GCN模型开发构建文本数据分类模型(以论文引用领域数据未例)

GCN(Graph Convolutional Network)图卷积神经网络是一种用于处理图数据的深度学习模型。它是基于图结构的卷积操作进行信息传递和特征学习的。 GCN模型的核心思想是通过利用邻居节点的特征来更新中心节点的表示。它通过迭代地聚集邻居节点的信息&#x…

太可怕啦!我在网上发了个贴,就被GPT-4推断出了个人隐私!GPT-4化身福尔摩斯

最近 GPT-4 被人发现了具有“福尔摩斯”一样的能力! 可以仅仅通过帖子内容来推测出用户的隐私! 瑞士苏黎世联邦理工学院的研究人员发现大语言模型可以对用户发在Reddit 帖子进行深度分析,并成功“猜测”出用户的年龄、地点、性别和收入等个…

【mujoco】Ubuntu20.04配置mujoco210

【mujoco】Ubuntu20.04配置mujoco210 文章目录 【mujoco】Ubuntu20.04配置mujoco2101. 安装mujoco2102. 安装mujoco-py3.使用render时报错Reference 本文简要介绍一下如何在ubuntu20.04系统中配置mujoco210,用于强化学习。 1. 安装mujoco210 在官方资源里找到http…

不变式和橄榄树-UMLChina建模知识竞赛第4赛季第20轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题,即可获得本轮优胜。第4题为附加题,对错不影响优胜者…

如何准备2024年的系统设计面试?

1 前言 如果你正在准备软件工程师或软件开发人员的面试,那么你可能知道由于其开放性质和广泛性,准备系统设计是多么困难,但同时你也不能忽略它。在软件工程界,如果你正在申请高级工程师/主管/架构师或更高级别的角色,系统设计是最受追捧的技能,也是整个过程中最重要的环节之一…

四川竹哲电子商务有限公司怎么样?是真的吗

在当今数字化时代,抖音电商服务逐渐成为了企业营销的重要手段。在这个充满机遇与挑战的领域,四川竹哲电子商务有限公司以其卓越的服务质量,成为了行业内的佼佼者。本文将详细介绍四川竹哲电子商务有限公司的抖音电商服务,帮助您了…

2024转行软件测试?从零到中高级自动化测试开发,一路狂飙...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、认知准备 1&a…

足底筋膜炎怎么治疗治愈

足底筋膜炎又称为跖筋膜炎,跖筋膜主要在足弓下方,它维持足弓稳定性,对于喜欢长期长跑、跳远,或者越野运动,或者部队中的士兵进行拉练,还有需要久坐或者久站的人群中,容易发生跖筋膜炎。治疗方法…

Express基本接口开发-入门学习与后续进阶

前提推荐 任何一个新的知识都是从文档看起,因此express官方文档示例有必要去学习一遍。 推荐看: 推荐入门指南-路由指南-中间件 看完这几个内容之后心里大概知道express有些什么东西了,然后现在就可以去练习了 注意:更多示例-代…

我记不住的那些命令(不断更新中)

fzf 一种进行模糊查找的命令行工具 主页:https://github.com/junegunn/fzf 我的主机是 Kali,通过apt进行安装fzf,并进行配置。 # apt install fzf # apt show fzf 通过参考/usr/share/doc/fzf/README.Debian来进行快速配置快捷键和自动补…

属兔人连续两年不顺,运势低迷要化解

属兔人为人生性浪漫,有着美好憧憬, 与人相处的时候总是谦和待人,不会随便发脾气, 也不喜欢与人发生争执,不善于算计别人。 对于自己的另一半,是一个很温暖的人,为人细腻,并且懂得体谅…

[答疑]改善系统的性能,用得着业务建模吗

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 第五元素 2023-10-27 22:02 潘老师,请教一个实践中遇到的问题: 假设生产人员使用某个工具处理数据,需要10天时间;现在改进了这个工具…

【Web 实战】记一次攻防实战

经典开局一个登录框 由于漏洞应该还未修复。对于数据和相关网址打个码见谅一下 常规思路(爆破) 常规操作进行一波 尝试弱口令然后开始爆破 对于此种有验证码的爆破,可以借用一个bp插件。 captcha-killer-modified-jdk14.jar 具体使用我就…

【算法练习Day49】每日温度下一个更大元素 I

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 每日温度下一个更大元素 I总…

【网络】计算机网络基础概念入门

🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁 🦄 个人主页——🎐个人主页 🎐✨🍁 🪁🍁🪁🍁🪁🍁🪁&#…

软件测试不是所有人都适合的

测试工作是一项极其重要的质量保证活动,因此测试部门既是软件发布质量把控的出口,也是客户意见反馈的入口。但是因为之前的不重视,导致了软件测试行业的发展相对滞后,优秀的软件测试工程师非常难得。 一个优秀的测试工程师要对一些…