当前位置: 首页 > news >正文

网站sem深圳php网站开发

网站sem,深圳php网站开发,品牌设计广告公司,网站做软件有哪些内容Crawler —— Learning experience 数据的传输#xff1a; 在OSI七层模型中#xff0c;传输层为源主机和目标主机之间提供可靠的数据传输和通信服务#xff0c;在该层中#xff0c;有两个重要的协议—— TCP与 UDP协议。 TCP协议#xff08;传输控制协议#xff09; …Crawler —— Learning experience 数据的传输 在OSI七层模型中传输层为源主机和目标主机之间提供可靠的数据传输和通信服务在该层中有两个重要的协议—— TCP与 UDP协议。 TCP协议传输控制协议 主要特点 面向连接TCP是一个面向连接的协议这意味着在数据传输之前发送方和接收方之间必须先建立一个可靠的连接。这个连接通过三次握手Three-way Handshake过程来建立确保双方都已准备好进行数据传输。可靠传输TCP通过一系列机制来确保数据的可靠传输。流量控制TCP使用滑动窗口协议进行流量控制防止发送方发送的数据量超过接收方的处理能力。拥塞控制TCP还包含拥塞控制机制通过动态调整发送窗口大小来防止网络拥塞。面向字节流TCP将数据视为一个连续的字节流而不是独立的数据报。 UDP协议用户数据报协议 主要特点 无连接UDP是一个无连接的协议发送方和接收方在数据传输之前不需要建立连接。这简化了协议的实现并减少了延迟。不可靠传输UDP不提供确认、超时和重传机制因此它不保证数据的可靠传输。数据可能会丢失、重复或乱序到达。面向报文UDP将每个应用层数据报视为一个独立的单元保留了数据报的边界。低开销由于UDP没有复杂的连接建立和流量控制机制它的开销较低适用于对实时性要求较高但对可靠性要求不高的应用。支持多播和广播UDP支持多播和广播允许数据同时发送给多个接收方。 区别 TCP面向连接、可靠传输、流量控制和拥塞控制适用于需要可靠传输的应用。UDP无连接、不可靠传输、低开销适用于对实时性要求较高且对少量数据丢失不敏感的应用。 socket套接字 Python 的 socket 库提供了对 BSD socket 接口的访问它允许你进行网络通信。socket 库支持多种类型的通信协议包括 TCP、UDP 等。 基础知识 Socket套接字Socket用于表示网络通信的端点。在网络通信中每个参与通信的程序都需要一个套接字来发送和接收数据。Address(地址)每个网络通信的参与者都有一个唯一的网络地址通常由 IP 地址和端口号组成。Protocol(协议)定义了数据如何传输的规则如 TCP、UDP。 socket 是 Python 的标准库之一不需要额外安装可直接导入使用。 import socket主要函数 函数名称含义socket.socket()创建一个新的套接字socket.bind()将套接字绑定到指定的地址上socket.listen()使套接字进入监听状态等待客户端连接socket.accept()接受客户端连接socket.connect()客户端使用用于连接到服务器socket.send()发送数据socket.recv()接收数据socket.close()关闭套接字 socket函数详解 socket.socket(familyAF_INET, typeSOCK_STREAM, proto0, filenoNone) 作用创建一个新的套接字参数 family指定通信协议族如 AF_INET (IPv4) 或 AF_INET6 (IPv6)。type指定套接字类型如 SOCK_STREAM (TCP) 或 SOCK_DGRAM (UDP)。proto指定协议通常设置为0表示使用默认协议。fileno如果指定将现有的文件描述符包装为套接字对象。 socket.bind(address) 作用将套接字绑定到指定的地址。参数 address一个元组 (host, port)指定IP地址和端口号。 socket.listen(backlog) backlog指定在拒绝连接之前可以挂起的最大连接数。 socket.accept() 作用使套接字进入监听状态等待客户端连接。参数 返回值返回一个新的套接字对象和客户端的地址。 socket.connect(address) 作用客户端使用用于连接到服务器。参数 address一个元组 (host, port)指定服务器的IP地址和端口号。 socket.send(data, flags0) 作用发送数据。参数 data要发送的数据通常是一个bytes对象。flags通常设置为0表示使用默认行为。 socket.recv(bufsize, flags0) 作用接收数据。参数 bufsize指定接收数据的最大字节数。flags通常设置为0表示使用默认行为。 socket.sendto(data, address) 作用发送数据到指定地址通常用于UDP。参数 data要发送的数据。address一个元组 (host, port)指定接收方的地址。 socket.recvfrom(bufsize, flags0) 作用接收数据和发送方的地址通常用于UDP。 参数 bufsize指定接收数据的最大字节数。flags通常设置为0表示使用默认行为。 socket.close() 作用关闭套接字 socket.getpeername() 作用返回连接到套接字的远程地址。 socket.getsockname() 作用返回套接字自己的地址。 socket.setsockopt(level, optname, value) 作用设置套接字选项。 参数 level指定协议级别如 SOL_SOCKET。 optname指定要设置的选项名称如 SO_REUSEADDR。 value指定选项的值。 socket.getsockopt(level, optname) 作用获取套接字选项的值。 参数 level指定协议级别。 optname指定要获取的选项名称。 socket.shutdown(how) 作用关闭套接字的一个方向。 参数 how指定关闭的方向SHUT_RD 表示关闭接收方向SHUT_WR 表示关闭发送方向SHUT_RDWR 表示关闭双向。 TCP网络通讯实例 server.py import socketdef server_program():# 获取主机名host socket.gethostname()port 5000 # 设置访问的端口号# 创建实例server_socket socket.socket()# 绑定地址server_socket.bind((host, port))# 配置套接字最多连接1个客户端server_socket.listen(1)print(Waiting for a connection...)# 进入监听状态conn, address server_socket.accept()print(Connection from: str(address))while True:# 接收数据流设置缓冲大小data conn.recv(1024).decode()if not data:# 如果没有数据跳出循环breakprint(From connected user: str(data))# 发送数据conn.send(data.encode())conn.close() # 关闭连接if __name__ __main__:server_program()client.py import socketdef client_program():# 使用本地主机创建sockethost socket.gethostname()# 服务器的端口号port 5000# 实例化套接字client_socket socket.socket()# 连接到服务器client_socket.connect((host, port))message input( - ) # 用户输入信息while message.lower().strip() ! bye.:client_socket.send(message.encode()) # 发送消息# 接收响应data client_socket.recv(1024).decode() # 显示接收到的信息print(Received from server: data) message input( - ) # 用户再次输入信息client_socket.close() # 关闭连接if __name__ __main__:client_program(运行结果 UDP网络通讯实例 server.py import socketdef udp_server():# 本地主机地址host 127.0.0.1# 端口号port 12345# 使用UDP协议进行创建socket实例server_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定地址server_socket.bind((host, port))print(UDP server up and listening)while True:# 缓冲大小设为4096字节data, address server_socket.recvfrom(4096) print(fReceived message: {data.decode()} from {address})# sent 表示发送的字节数sent server_socket.sendto(data, address)print(fSent {sent} byte(s) back to {address})if __name__ __main__:udp_server()client.py import socketdef udp_client():# 服务器的主机地址host 127.0.0.1 # 服务器的端口号port 12345 client_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM)message input(Enter message to send: )while message.lower().strip() ! exit:client_socket.sendto(message.encode(), (host, port))# 缓冲大小设为4096字节data, server client_socket.recvfrom(4096) print(fReceived from server: {data.decode()})message input(Enter message to send: )client_socket.close()if __name__ __main__:udp_client()运行结果 简单的网络架构 Python 网络爬虫技术 HTTP 请求 urllibPython的标准库之一用于处理URL和发送HTTP请求Requests(重要)一个非常流行的第三方库用于发送HTTP请求。它比urllib更易用提供了简洁的 API。 网页解析 re正则表达式库是 Python 的标准库之一允许你执行诸如字符串搜索、替换、分割和匹配等操作。lxml(重要)一个高性能的XML和HTML解析库基于C语言实现解析速度快。Beautiful Soup是一个利用Python标凑库构建的库专门用于解析HTML和XML文档。它提供了简单直观的API来处理文档并且能够自动处理文档的编码问题。 爬虫框架 Scrapy一个用Python编写的开源网络爬虫框架它被设计用于抓取网站数据和提取结构化数据。Scrapy使用Twisted异步网络框架来处理网络通信这使得它能够快速地进行数据下载。PySpider 是一个强大的、开源的 Python 网络爬虫系统Cola是一个企业级应用架构的最佳实践它旨在简化应用架构的复杂性提供清晰的指导和约束。 urllib 主要函数 函数名称含义urllib.request.urlopen()打开一个 URL 并返回一个类似文件的对象urllib.request.Request(url: str, headers: dict)用于创建一个请求对象可以添加 HTTP 请求头等信息urllib.parse.urlparse(url: str)将 URL 分解成组件urllib.parse.urlunparse(url_ls: list)将分解后的组件重新组合成一个 URLurllib.parse.quote()将字符串进行 URL 编码urllib.parse.unquote()解码 URL 编码的字符串urllib.error.URLError当无法打开 URL 时抛出urllib.error.HTTPError当 HTTP 请求返回错误响应时抛出urllib.robotparser用于解析 robots.txt 文件这些文件用于告诉网络爬虫哪些页面可以访问 实例 example_1.py import urllib.request# 请求头 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36} # 创建一个 Request 对象 req urllib.request.Request(http://www.baidu.com, headersheaders)# 打开 URL with urllib.request.urlopen(req, timeout3) as response:# 读取响应内容html response.read()# 打印 HTML 内容 print(html.decode(utf-8))对于响应的response可以使用response.geturl()来获取当前所爬取的 URL 地址还可以使用response.getcode()来查看网页的状态码。 example_2.py from urllib.parse import urlencode# 创建一个字典包含查询参数 params {q: Python,page: 1 }# 编码查询字符串 query_string urlencode(params)# 打印编码后的查询字符串 print(query_string)post.py # 发送post请求 from urllib import request, parse post_data parse.urlencode([(key1, value1),(key2, value2)])url request.Request(http://httpbin.org/post) url.add_header(User-Agent, Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36) response request.urlopen(url, datapost_data.encode(utf-8)).read()robots.py from urllib.robotparser import RobotFileParser# 创建 RobotFileParser 对象 rp RobotFileParser()# 设置 robots.txt 文件的 URL rp.set_url(http://www.baidu.com/robots.txt)# 读取并解析 robots.txt 文件 rp.read()# 检查某个用户代理是否可以获取指定的页面 can_fetch rp.can_fetch(*, http://www.baidu.com/somepage.html) print(can_fetch) can_fetch() 方法接受两个参数 第一个是用户代理字符串通常是 * 表示所有用户代理第二个是想要访问的 URL。 如果返回 True则表示可以抓取如果返回 False则表示不可以抓取。requests requests 库是一个第三方库需要自行安装。 pip3 install requests # python3主要函数 发送请求: requests.get(url, paramsNone, \**kwargs): 发送一个 HTTP GET 请求。params: 一个字典或字节序列将会被发送在查询字符串中。**kwargs: 其他关键字参数将传递给 Request 类。 requests.post(url, dataNone, jsonNone, \**kwargs): 发送一个 HTTP POST 请求。data: 要发送的表单数据字典或字节序列。json: 要发送的 JSON 数据。**kwargs: 其他关键字参数将传递给 Request 类。同 get 请求。 requests.put(url, dataNone, \**kwargs): 发送一个 HTTP PUT 请求。data: 要发送的请求数据。**kwargs: 其他关键字参数将传递给 Request 类。同 get 请求。 requests.delete(url, \**kwargs): 发送一个 HTTP DELETE 请求。**kwargs: 关键字参数将传递给 Request 类。同 get 请求。 requests.head(url, \**kwargs): 发送一个 HTTP HEAD 请求。**kwargs: 关键字参数将传递给 Request 类。同 get 请求。 requests.patch(url, dataNone, \**kwargs): 发送一个 HTTP PATCH 请求。data: 要发送的请求数据。**kwargs: 关键字参数将传递给 Request 类。同 get 请求。 requests.options(url, \**kwargs): 发送一个 HTTP OPTIONS 请求。**kwargs: 关键字参数将传递给 Request 类。同 get 请求。 上述发送请求的函数中可选参数 \**kwargs 基本相同因为它们最终都会传递给 requests 库内部的 Request 类常见的 **kwargs 参数 params: 用于传递 URL 的查询字符串参数。可以是字典、字节序列或元组列表。headers: 自定义 HTTP 请求头。cookies 用于发送 cookies可以是字典或 RequestsCookieJar 对象。timeout: 指定请求的超时时间。auth: 用于 HTTP 认证的元组 (username, password)。proxies: 指定代理服务器的字典。verify: 用于控制 SSL 证书验证可以是布尔值或证书路径。stream: 如果为 False则响应内容将立即下载。allow_redirects: 是否自动处理重定向。data: 用于 requests.post 和其他方法但对于 requests.delete 方法你也可以通过 **kwargs 传递。json: 用于 requests.post 方法但通常不用于 requests.delete除非你明确需要发送 JSON 数据。files: 用于上传文件。 import requests# 豆瓣电影API的URL这里以获取电影《肖申克的救赎》的详细信息为例 movie_id 1292052 # 肖申克的救赎的豆瓣ID url fhttps://movie.douban.com/subject/{movie_id}headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36} # 发送GET请求 response requests.get(url, headersheaders, timeout3)# 检查请求是否成功 if response.status_code 200:print(response.text) else:print(请求失败状态码, response.status_code)# 处理可能的异常 try:response.raise_for_status() except requests.exceptions.HTTPError as e:print(HTTP错误:, e) except requests.exceptions.ConnectionError as e:print(连接错误:, e) except requests.exceptions.Timeout as e:print(请求超时:, e) except requests.exceptions.RequestException as e:print(请求出错:, e)返回内容 使用 requests 进行请求时返回一个response对象该对象包含以下属性 status_code服务器响应的HTTP状态码。headers服务器响应的HTTP头部字段。content服务器响应的内容通常是字节类型。text服务器响应的内容解码为字符串默认使用ISO编码。json()如果响应内容是JSON格式这个方法可以解析JSON并返回一个字典。 会话管理: Session 对象允许你在多个请求之间保持某些参数比如 cookies、headers 等。session.get(url, **kwargs): 在会话中发送一个 GET 请求。session.post(url, dataNone, jsonNone, **kwargs): 在会话中发送一个 POST 请求。 import requests# 创建一个 Session 对象 session requests.Session()# 你可以设置一些默认的请求参数 session.headers.update({user-agent: my-app/0.0.1})# 发送第一个请求 response_one session.get(http://www.baidu.com) print(response_one.text)# 发送第二个请求Session 会自动处理 cookies response_two session.get(https://blog.csdn.net/) print(response_two.text)# 关闭 Session session.close()请求构造: Request(method, url, **kwargs): 创建一个请求对象可以用于 Session 对象的 send 方法。 参数详解 method指定请求的 HTTP 方法。这是必需的。url请求的目标 URL。这也是必需的。params字典或字节序列将会被编码为 URL 的查询字符串。data作为请求体发送的字典、字节序列或文件对象。json字典或列表将会被编码为 JSON 格式并发送。headers字典包含请求头。cookies字典或 CookieJar 对象包含要发送的 cookies。files字典包含要上传的文件。auth元组包含用户认证信息。timeout浮点数或元组指定请求的超时时间。 import requests# 创建一个 Request 对象 req requests.Request(GET, http://example.com)# 添加额外的参数 req.headers.update({User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36})# 准备请求 prepared_req req.prepare()# 创建一个 Session 对象 with requests.Session() as session:# 使用 Session 的 send 方法发送准备好的请求response session.send(prepared_req)print(response.text)响应对象: 每个请求方法返回一个 Response对象包含以下属性和方法 status_code: HTTP 状态码。headers: 响应头。text: 响应体作为 Unicode。content: 响应体作为字节。json(): 解析 JSON 响应体。raise_for_status(): 如果响应码指示错误则抛出一个异常。 异常处理: requests 定义了一系列异常例如 HTTPError, ConnectionError, Timeout, RequestException 等用于处理请求中可能出现的错误。 常见的 requests 异常 RequestException这是所有 requests 异常的基类。通常你可以通过捕获这个异常来处理所有请求相关的错误。HTTPError当响应的 HTTP 状态码表示错误时例如 4xx 或 5xx会抛出这个异常。ConnectionError当网络连接问题导致请求失败时会抛出这个异常。Timeout当请求超过指定的超时时间时会抛出这个异常。TooManyRedirects当请求超过了最大重定向次数时会抛出这个异常。MissingSchema、InvalidSchema、InvalidURL这些异常与 URL 格式不正确有关。ChunkedEncodingError当服务器声明使用分块传输编码但实际上没有正确发送数据时会抛出这个异常。ContentDecodingError当服务器返回的内容无法正确解码时会抛出这个异常。StreamConsumedError当尝试多次读取已经读取过的响应内容时会抛出这个异常。 import requests from requests.exceptions import HTTPError, ConnectionError, Timeouturl http://example.comtry:response requests.get(url, timeout5)# 确保响应状态码为 200response.raise_for_status() except HTTPError as http_err:print(fHTTP error occurred: {http_err}) # HTTP错误 except ConnectionError as conn_err:print(fConnection error occurred: {conn_err}) # 连接错误 except Timeout as timeout_err:print(fTimeout error occurred: {timeout_err}) # 超时错误 except Exception as err:print(fOther error occurred: {err}) # 其他错误 else:print(Success!)高级特性: 支持代理、Cookie、认证、SSL 证书验证等高级特性。 proxies import requests# 代理服务 proxies {http: http://10.10.1.10:3128,https: http://10.10.1.10:1080, }response requests.get(http://example.com, proxiesproxies) print(response.text)Cookie.py import requests# 手动设置 cookies cookies dict(cookies_areworking)response requests.get(http://example.com, cookiescookies) print(response.text)SSl.py import requests# 禁用 SSL 证书验证 response requests.get(https://example.com, verifyFalse)# 使用自定义的证书文件, verify 是SSL证书路径 response requests.get(https://example.com, verify/path/to/certfile)lxml lxml 是一个 Python 第三方库它提供了非常高效的 XML 和 HTML 文件解析工具。lxml 基于 libxml2 和 libxslt 库这些是 C 语言编写的高性能、低内存占用的库因此 lxml 在解析大型文件时尤其有用。 安装 lxml 是一个第三方库需要自行安装。 pip3 install lxml # python3使用方法 导入 lxml.etree 模块 from lxml import etree解析 HTML 时需要先初始化 HTML 源码 selector etree.HTML(html) # html 表示爬取到的 HTML 源码。寻找某个标签的时候可以从根节点进行爬取默认根节点为 //如要爬取 li 标签且该标签的路径为div ul li。 all_li selector.xpath(//div/ul/li) # 爬取到 ul 路径下的所有的 li 标签。定位到具体的某一个标签可以在参数最后使用 [idx] 来定位序号从1开始如 li_1 selector.xpath(//div/ul/li[1])提取某标签下的文本可以在参数最后使用一级/text()来提取返回一个列表对象如提取第一个 li 标签下的 a 标签的文本 li_1_a_text selector.xpath(//div/ul/li[1]/text())如果某一个标签在 HTML 源码中时唯一的可以直接从根节点定位到该标签而不需要一级一级的定位如 ul 标签是唯一的可以直接定位到 ul li_1_a_text selector.xpath(//ul/li[1]/text())[0] # 这里 [0] 表示提取返回列表的第一个值。通过属性定位标签可以在对应标签后使用[class...] 来定位某个具体的标签 li_3 selector.xpath(//ul/li[classitem-inactive])如果某个标签对应的属性在整个 HTML 源码里是唯一的可以从根节点直接定位到该标签 li_3 selector.xpath(//*[classitem-inactive]) # * 表示任意标签li_3_a_text selector.xpath(//*[classitem-inactive]/a/text()) # 提取 a 标签下的文本li_3_a_text selector.xpath(//a[classitem-inactive]/text()) # 直接使用 a 标签的属性进行定位提取某标签的属性值如果要提取属性值可以直接在参数中添加一级属性的名称即可如 li_3_a_href selector.xpath(//ul/li[3]/a/href) # 提取出第三个 li 标签的属性all_class selector.xpath(//li/class) # 提取所有 li 标签的 class 属性提取以某部分开头的属性如多个属性值都以 item- 开头可以使用 starts-with() 语法进行提取如 li_1_5 selector.xpath(//li[starts-with(class, item-)])如果提取出来的元素包含的仍然是一个代码段可以对它继续使用 XPath 进行查找可以将当前的节点作为根节点来进行查找使用 .// 表示相对根节点 li_1_5_a_text [] for li in li_1_5:li_1_5_a_text.append(li.xpath(a/text())[0])# 下面的代码等价于上面的 li_1_5_a_text selector.xpath(//li[starts-with(class, item-)/a/text()])提取某标签下的所有文本如 提取 ul 标签下的所有标签的文本 all_text selector.xpath(string(//ul))# 使用列表推导式来提取所有文本 all_str_text [s.strip() for s in all_text.strip().split(\n)]Beautiful Soup Beautiful Soup 是一个用于解析 HTML 和 XML 文档的 Python 库。它常被用于网页抓取和数据提取。 安装 Beautiful Soup 是一个第三方库需要自行安装。 pip3 install beautifulsoup4使用方法 导入 BeautifulSoup 模块 from bs4 import BeautifulSoup创建解析器第一个参数是 HTML 源码第二个参数是解析器类型 soup BeautifulSoup(html_doc, html.parser) # 使用 Python 的内置解析器 soup BeautifulSoup(html_doc, lxml) # 使用 lxml 解析器 soup BeautifulSoup(html_doc, html5lib) # 使用 html5lib 解析器如果要使用 lxml 解析器 或 html5lib 解析器需要额外进行安装 pip install lxml pip3 install html5lib获取所有具有特定类的 a标签 links soup.find_all(a, class_class-name)使用 CSS 选择器select() 方法基本语法为 elements soup.select(CSS_SELECTOR)CSS_SELECTOR 是一个字符串表示你想要使用的 CSS 选择器 标签选择器通过标签名选择元素。 soup.select(div) # 选择所有 div 标签类选择器通过类名选择元素。 soup.select(.class-name) # 选择所有类名为 class-name 的元素ID 选择器通过 ID 选择特定的元素。 soup.select(#id-name) # 选择 ID 为 id-name 的元素属性选择器通过元素的属性选择元素。 soup.select(a[hrefhttp://example.com]) # 选择 href 属性为 http://example.com 的所有 a 标签组合选择器组合多个选择器来细化搜索条件。 soup.select(div.class-name#id-name) # 选择类名为 class-name 且 ID 为 id-name 的 div 标签后代选择器使用空格分隔选择作为某元素后代的所有元素。 soup.select(div a) # 选择所有在 div 标签内的 a 标签子元素选择器使用 符号选择作为某元素直接子元素的元素。 soup.select(div a) # 选择所有 div 标签的直接子元素 a 标签相邻兄弟选择器使用 符号选择紧随指定元素之后的相邻兄弟元素。 soup.select(a p) # 选择所有紧随 a 标签之后的 p 标签通用兄弟选择器使用 ~ 符号选择指定元素之后的所有兄弟元素。 soup.select(a ~ p) # 选择所有在 a 标签之后的所有 p 标签伪类选择器使用 CSS 伪类选择器来选择元素。 soup.select(p:first-child) # 选择每个父元素的第一个 p 子元素返回值 select() 方法返回一个列表其中包含所有匹配 CSS 选择器的元素。如果没有找到匹配的元素它将返回一个空列表。 divs soup.select(div.class-name)搜索文档树 find()返回第一个匹配的元素语法tag soup.find(name, attrs, recursive, text, **kwargs)每一个参数都是一个可选参数。 name 字符串或None。要搜索的标签名。如果设定为None则忽略此参数。 attrs 字典类型。要搜索的标签的属性。字典的键是属性名值是属性值。只有当标签具有这些属性时它才会被匹配。 recursive 布尔值。指定搜索是否包括子孙标签。默认为True如果设置为False则只在当前标签的直接子标签中搜索。 text 字符串或None。要搜索的标签的文本内容。如果设定为None则忽略此参数。 kwargs 关键字参数。任何额外的关键字参数都会传递给解析器。 find() 方法只返回第一个匹配的元素。如果你想要找到所有匹配的元素应该使用find_all()方法。 from bs4 import BeautifulSoup# 示例 HTML 文档 html_doc html headtitleThe title of the document/title /head bodydiv iddiv1 classsomeclasspThis is the first paragraph/pa hrefhttp://example.comExample link/a/divdiv iddiv2 classsomeclasspThis is the second paragraph/pa hrefhttp://example.orgExample link 2/a/div /body /html # 创建 Beautiful Soup 对象 soup BeautifulSoup(html_doc, html.parser)# 通过标签名查找 p_tag soup.find(p) print(p_tag) # 输出第一个 p 标签# 通过属性查找 a_tag soup.find(a, hrefTrue) print(a_tag) # 输出第一个有 href 属性的 a 标签# 通过属性字典查找 a_tag_with_specific_href soup.find(a, attrs{href: http://example.com}) print(a_tag_with_specific_href) # 输出具有特定 href 属性的 a 标签# 通过文本查找 text_tag soup.find(textThis is the first paragraph) print(text_tag) # 输出包含特定文本的第一个标签# 使用关键字参数查找 div_tag soup.find(iddiv1) print(div_tag) # 输出具有特定 id 属性的 div 标签find_all()返回所有匹配的元素列表语法find_all(name, attrs, recursive, string, limit, **kwargs), 每一个参数都是可选参数。 name 字符串或正则表达式。要搜索的标签名。可以使用正则表达式来匹配标签名。 attrs 字典类型。要搜索的标签的属性。字典的键是属性名值是属性值。只有当标签具有这些属性时它才会被匹配。 recursive 布尔值。指定是否递归地在子标签中查找。默认为 True。 text 字符串或正则表达式。要搜索的标签的文本内容。 limit 整数。用于限制返回结果的数量。 kwargs 关键字参数。任何额外的关键字参数都会被视为要匹配的元素的属性名和属性值。 find_all() 方法返回一个列表如果没有找到匹配的元素则返回一个空列表。 from bs4 import BeautifulSouphtml_doc html headtitleThe Dormouses story/title /head bodydiv iddiv1 classsomeclasspThis is the first paragraph/pa hrefhttp://example.comExample link/a/divdiv iddiv2 classsomeclasspThis is the second paragraph/pa hrefhttp://example.orgExample link 2/a/div /body /html soup BeautifulSoup(html_doc, html.parser)# 查找所有 p 标签 p_tags soup.find_all(p) for p in p_tags:print(p)# 查找所有具有特定类的 div 标签 divs_with_class soup.find_all(div, class_someclass) for div in divs_with_class:print(div)# 查找所有包含特定文本的 a 标签 links_with_text soup.find_all(a, textExample link) for link in links_with_text:print(link)# 使用属性字典查找 divs_with_attrs soup.find_all(div, attrs{class: someclass}) for div in divs_with_attrs:print(div)# 使用 limit 参数限制结果数量 limited_results soup.find_all(p, limit1) for result in limited_results:print(result)获取和修改标签属性 tag soup.find(a, hrefTrue) tag[href] http://newlink.com获取标签内的文本 text tag.get_text()获取去除了标签的文本内容 stripped_text tag.get_text(stripTrue)添加新的标签 from bs4 import BeautifulSoup# 假设我们有一段简单的 HTML html_doc htmlbody/body/html soup BeautifulSoup(html_doc, html.parser)# 创建一个新的 p 标签 new_tag soup.new_tag(p)# 设置新标签的内容 new_tag.string New paragraph# 将新标签添加到文档的 body 部分 soup.body.append(new_tag)# 打印修改后的 HTML print(soup.prettify())替换现有的标签 tag.replace_with(New text)格式化输出 HTML print(soup.prettify())指定编码输出 from bs4 import BeautifulSoup# 假设我们有一段简单的 HTML html_doc htmlheadtitlePage Title/title/headbodypSome content/p/body/html soup BeautifulSoup(html_doc, html.parser)# 将解析后的 HTML 文档转换为字符串 html_string str(soup)# 使用字符串的 encode 方法进行编码 encoded_data html_string.encode(latin-1)# 打印编码后的数据 print(encoded_data)如果解析器无法解析文档可以尝试更换解析器例如从 html.parser 切换到 lxml 或 html5lib。 使用 lxml 解析器可以提高解析速度。 如果处理非 UTF-8 编码的文档可以在创建 Beautiful Soup 对象时指定 from_encoding 参数。 re 正则表达式 简介 正则表达式Regular Expression简称regex或regexp是一种文本模式描述的方法它可以用来检索、替换符合某个模式规则的文本。正则表达式由一系列字符组成这些字符可以是普通字符例如字母a到z、特殊字符称为元字符或两者的组合。 学习链接 博客CSDNRe - 正则表达式附带大量python实例_python正则匹配条件-CSDN博客 案例一爬取黑马程序员网址 链接地址python技术交流论坛 (itheima.com) 目标爬取每一页的标题、作者、日期 第三方库 requestslxmlrandomtime 标题 通过浏览器的调试功能F12 快捷键可以定位到标题元素在源码中的位置 可以看到标题元素在a标签中并且该标签在table id threadlisttableid标签下并且通过观察可以看到所有的标题都在各个table id threadlisttableid标签下并且table id threadlisttableid该标签是独立的相对唯一因此可以使用属性定位来定位到所有的table id threadlisttableid标签然后在向下搜索得到需要的值代码编写如下 title_temp selector.xpath(//table[idthreadlisttableid]/tbody/tr/th/a[classs xst]/text())作者 通过观察可以看到各个作者标签都在在各个div classforuminfo的标签下且是独立的相对唯一因此同样可以使用属性定位到该标签之后一个标签为span标签代码编写如下 author_temp selector.xpath(//div[classforuminfo]/i[2]/span/a/text())日期 与作者分析一样日期标签也在各个div classforuminfo标签下因此也可以使用属性定位来找到该标签不同的是日期标签是div classforuminfo下的第二个子标签i因此可以使用索引的方式来进行定位代码如下 date_temp selector.xpath(//div[classforuminfo]/i[2]/text())爬取所有页面 由于该网址是分页的一次爬取只能得到一页的数据但我们需要的是全部的数据因此需要找到一种方式来爬取所有的页面。 再次分析网页可以发现存在下一页按钮并且下一页按钮对应的源码中其属性就是下一页的网址所以我们可以不断的爬取每一页的下一页网页然后不断请求直到不存在下一页按钮即返回一个空列表时爬取结束下一页按钮在源码中定位如下 细心的观察可以发现下一页按钮只存在于a classnxt标签中因此可以直接使用属性定位直接定位到该标签然后取其href属性值即可代码编写如下 next_temp selector.xpath(//a[classnxt]/href)如此我们可以使用函数来封装请求和解析的方法然后使用while循环来进行不断的爬取结束条件为while next_url ! []这里我们使用random和time库来对爬取的时间进行随机休眠以削减爬取的频率。 完整代码 import requests from lxml import etree import time import randomURL http://bbs.itheima.com/forum-425-1.html headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/458.22} # 请求函数 def Crawling(url: str): print(Crawling URL is :, url)response requests.get(urlurl, headersheaders, timeout3)if response.status_code requests.codes.ok:time.sleep(random.uniform(1.0, 2.5)) # 进行1秒 ~ 2.5秒的随机休眠return responseelse:print(Error)return None # 解析函数 def parse(response_parameter):selector etree.HTML(response_parameter.content)# 解析标题title_temp selector.xpath(//table[idthreadlisttableid]/tbody/tr/th/a[classs xst]/text())# 解析日期date_temp selector.xpath(//div[classforuminfo]/i[2]/text())# 解析作者author_temp selector.xpath(//div[classforuminfo]/i[2]/span/a/text())# 下一页地址next_temp selector.xpath(//a[classnxt]/href)if next_temp ! []:next_temp next_temp[0]return title_temp, date_temp, author_temp, next_temp# 进行爬取 next_temp URL title_ls [] date_ls [] author_ls [] next_ls [] while next_temp ! []:response Crawling(urlnext_temp)title_temp, date_temp, author_temp, next_temp parse(response_parameterresponse)title_ls.extend(title_temp)date_ls.extend(date_temp)author_ls.extend(author_temp)next_ls.extend(next_temp)# 对数据进行初步处理 title_stand [f{item.strip()}\n for item in title_ls] date_stand [f{item.strip()}\n for item in date_ls] date_stand_end [] for date_item in date_stand:if date_item \n:continuedate_stand_end.append(date_item) author_stand [f{item.strip()}\n for item in author_ls] # print(title_stand[:5]) # print(date_stand[:5]) # print(author_stand[:5])# 进行持久化存储 with open(r./黑马网址-标题.txt, w, encodingutf-8) as file:file.writelines(title_stand)with open(r./黑马网址-作者.txt, w, encodingutf-8) as file:file.writelines(author_stand)with open(r./黑马网址-日期.txt, w) as file:file.writelines(date_stand_end)# 确定每列的最大宽度 max_width_tit max(len(tit) for tit in title_stand) max_width_aut max(len(aut) for aut in author_stand) max_width_dat max(len(dat) for dat in date_stand_end)with open(r./黑马网址-组合.txt, w, encodingutf-8) as file:file.writelines(f{title.strip():{max_width_tit}}{author.strip():^{max_width_aut}}{date.strip():{max_width_dat}} \n for title, author, date in zip(title_stand, author_stand, date_stand_end)) Python 连接MySQL数据库 python 中可以使用 pymysql 第三方库来连接 MySQL。 安装 pymysql pip3 install pymysql简单的使用方法 import pymysql# 连接到MySQL数据库 connection pymysql.connect(hostlocalhost, # 数据库主机地址useryourusername, # 数据库用户名passwordyourpassword, # 数据库密码databaseyourdatabase # 数据库名称 )try:# 创建一个游标对象with connection.cursor() as cursor:# 执行SQL查询sql SELECT * FROM your_tablecursor.execute(sql)# 获取查询结果result cursor.fetchall()# 打印结果for row in result:print(row)finally:# 关闭数据库连接connection.close()使用方法详解 0. 基本方法详解 connection.cursor()用于创建一个游标对象以便执行SQL语句和管理结果集。 游标的参数 cursor connection.cursor(pymysql.cursors.Cursor) # 默认返回元组结果。 cursor connection.cursor(pymysql.cursors.DictCursor) # 返回字典结果键为列名。cursor.execute()用于执行SQL语句。 fetchone(): 获取结果集的下一行。 fetchall(): 获取结果集的所有行。 fetchmany(sizeNone): 获取结果集的多行参数为行数。 close(): 关闭游标。 connection.commit()用于提交数据。 1. 连接到数据库 使用 pymysql.connect() 来连接到数据库。 connection pymysql.connect(hosthostname,userusername,passwordpassword,databasedatabasename,charsetutf8mb4,cursorclasspymysql.cursors.DictCursor)2. 查询数据 try:with connection.cursor() as cursor:sql SELECT * FROM your_tablecursor.execute(sql)result cursor.fetchall()for row in result:print(row) finally:connection.close()3. 插入数据 插入一行数据 try:with connection.cursor() as cursor:sql INSERT INTO your_table (column1, column2) VALUES (%s, %s)cursor.execute(sql, (value1, value2))connection.commit() finally:connection.close()插入多行数据 cursor.executemany(SQL, DATA: list) 来提交插入多行数据第一个参数是SQL语句第二个参数是一个列表列表中每一个元素为一个元组类型的数据每一个元组类型的数据表示向表中插入一条数据。 try:with connection.cursor() as cursor:# 插入多行数据的SQL语句insert_multiple_sql INSERT INTO users (username, email) VALUES (%s, %s)# 要插入的数据data [(user1, user1example.com),(user2, user2example.com),(user3, user3example.com)]# 执行插入操作使用 executemanycursor.executemany(insert_multiple_sql, data)# 提交事务connection.commit()print(多行数据插入成功)except pymysql.MySQLError as e:print(f插入数据时发生错误{e})connection.rollback() # 出错回滚事务finally:connection.close() # 关闭连接4. 更新数据 try:with connection.cursor() as cursor:sql UPDATE your_table SET column1 %s WHERE column2 %scursor.execute(sql, (new_value1, value2))connection.commit() finally:connection.close()5. 删除数据 try:with connection.cursor() as cursor:sql DELETE FROM your_table WHERE column2 %scursor.execute(sql, (value2,))connection.commit() finally:connection.close()6. 创建一个表 try:with connection.cursor() as cursor:# 创建表的SQL语句create_table_sql CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,email VARCHAR(100) NOT NULL UNIQUE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)# 执行SQL语句cursor.execute(create_table_sql)# 提交事务connection.commit()print(表创建成功)except pymysql.MySQLError as e:print(f创建表时发生错误{e})connection.rollback() # 回滚事务以保持数据一致性finally:connection.close() # 关闭连接7. 处理异常 import pymysqltry:connection pymysql.connect(hostlocalhost,useryourusername,passwordyourpassword,databaseyourdatabase)with connection.cursor() as cursor:sql SELECT * FROM your_tablecursor.execute(sql)result cursor.fetchall()for row in result:print(row)except pymysql.MySQLError as e:print(fError: {e})finally:if connection.open: # 如果连接保持开启connection.close()
http://www.dnsts.com.cn/news/53948.html

相关文章:

  • 秦皇岛市住房和城乡建设局网站网站建设比较好
  • 南京网站建设方案中国菲律宾历史战绩
  • 低价建站在哪里买线上教育培训机构十大排名
  • 做招聘的h5用哪个网站宇舶手表网站
  • 用wordpress建站wordpress js特效
  • 深圳网站优化费用科技网站建设
  • 备案用网站建设方案建设信用卡手机银行官方网站
  • 室内设计网站 知乎wordpress用户注册卡慢
  • 网站建设开发做网站吧龙华网站建设招聘
  • 网站页面设计主要包括西安注册公司在哪个网站
  • 做网站的心得体会毕业设计做网站答辩
  • 剪辑素材网站免费百度app
  • 搜狗推广做网站要钱吗asp网站开发基础
  • 做个网站跳转链接怎么做服饰网站建设
  • 如何优化企业网站成都网站建设专业乐云seo
  • dw网站建设教程视频教程wordpress实现投稿功能
  • 南涧县城乡建设局网站wordpress微信打赏
  • 东莞住房和建设局网站建设路小学查分网站
  • 上弘科技网站建设网站经营性备案需要什么资料
  • 建一个网站做cpa联盟东至网站制作
  • 网站内容收费网站做cpa
  • 小视频做网站怎么赚钱网站开发入那个科目
  • 上传文档的网站广州建设职业培训学校
  • 桂林出网站网投网站制作
  • 北京市住房与城乡建设厅网站长沙网站制作哪家好
  • 地税局网站怎么做变更专业做网站厂家
  • 杭州p2p网站建设wordpress简单个人主题
  • 网易云课堂的网站建设特点国内做网站建设知名的公司
  • 在线员工后台网站建设内置wordpress主机
  • 重庆触摸屏_电子商务网站建设做简历那些网站比较好