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

Python →爬虫实践

爬取研究中心的书目

现在,想要把如下网站中的书目信息爬取出来。

案例一 耶鲁

Publications | Yale Law School

分析网页,如下图所示,需要爬取的页面,标签信息是“<p>”,所以用 items=soup.find_all("p")

代码如下:

import requests
from bs4 import BeautifulSoup as bs
from openpyxl import Workbookurl="https://law.yale.edu/china-center/publications/recent-staff-publications"webfile=requests.get(url)
webfile.encoding="utf-8"
data=webfile.textsoup=bs(data,"html.parser")
soup.prettify()items=soup.find_all("p")
for i in items:print(i.get_text())

完善代码如下:

import requests
from bs4 import BeautifulSoup as bs
from openpyxl import Workbook
import rewb=Workbook()
ws=wb.activewfile=open("bool.txt","w",encoding="utf-8")url="https://law.yale.edu/china-center/publications/recent-staff-publications"webfile=requests.get(url)
webfile.encoding="utf-8"
data=webfile.textsoup=bs(data,"html.parser")
soup.prettify()items=soup.find_all("p")# 正则表达式匹配模式
pattern1 = r'([^,\n“]+), “([^”]+),”\s*([^,\n]+)'
pattern2 = r'([^,]+(?: and [^,]+)*), “([^”]+),”''''
正则表达式匹配模式:([^,]+(?: and [^,]+)*):匹配作者名。这个模式匹配一个或多个名字,由“and”连接。[^,]+匹配一个或多个非逗号字符,(?: and [^,]+)*是一个非捕获组,匹配零个或多个“and”后跟一个或多个非逗号字符的模式。
“([^”]+),”:匹配文章名。这个模式匹配引号内的任何字符,直到遇到闭合的引号和逗号。([^,\n“]+):匹配作者名。这个模式匹配一个或多个非逗号、换行符和左引号的字符序列。[^,\n“]是一个字符集,表示匹配除了逗号、换行符和左引号之外的任何字符。+表示匹配一个或多个这样的字符。
“([^”]+),”:匹配文章名。这个模式匹配以左引号开始,以右引号结束的任何字符序列,并且确保文章名后面跟着一个逗号。
([^,\n]+):匹配期刊名。这个模式匹配一个或多个非逗号和换行符的字符序列。'''for i in items:info=i.get_text()# 查找所有匹配项matches = re.findall(pattern1, info)if len(matches)>0:print(matches)for m in matches:print(m,sep=",",file=wfile)wfile.close()

将txt文本导入excel即可。原因在于正则表达式中得到的列表中的信息,有的似乎是tuptle类型,导致openpyxl无法输入xlsx表格中。所以采用了txt文本方式。

基于以上出现的情况,再次优化代码,如下:

import requests
from bs4 import BeautifulSoup as bs
from openpyxl import Workbook
import rewb=Workbook()
ws=wb.activewfile=open("bool.txt","w",encoding="utf-8")url="https://law.yale.edu/china-center/publications/recent-staff-publications"webfile=requests.get(url)
webfile.encoding="utf-8"
data=webfile.textsoup=bs(data,"html.parser")
soup.prettify()items=soup.find_all("p")# 正则表达式匹配模式
pattern1 = r'([^\n“]+), “([^”]+),”\s*([^,\n]+)' #作者和文章名和期刊名,用括号将三者区分
pattern2 = r'([^\n“]+), “([^”]+),”\s*([^,\n]+[)])'
#parttern1缺少了最后的右括号,在这里补充上。[)]表示可供选择。for i in items:info=i.get_text()# 查找所有匹配项matches = re.findall(pattern2, info)if len(matches)>0:print(matches)for m in matches:mlist=[]#将元组的元素放到列表中,这样可以把列表的字符串输出到xlsx中for k in m:mlist.append(k)print(k,sep=",",end=";",file=wfile)print("\n",file=wfile)
##                print(type(k))ws.append(mlist)##            print(m,sep=",",file=wfile)#注意,m是元组而不是字符串#print(type(m))wfile.close()
wb.save("book2.xlsx")

首先是完善了正则表达式:

'''
正则表达式匹配模式

[^,]+匹配一个或多个非逗号字符,
(?: and [^,]+)*是一个非捕获组,匹配零个或多个“and”后跟一个或多个非逗号字符的模式。

([^\n“]+):匹配作者名。这个模式匹配一个或多个非换行符和左引号的字符序列。

“([^”]+),”:匹配文章名。这个模式匹配引号内的任何字符,直到遇到闭合的引号和逗号。
[^,\n“]是一个字符集,表示匹配除了逗号、换行符和左引号之外的任何字符。+表示匹配一个或多个这样的字符。
“([^”]+),”:匹配文章名。这个模式匹配以左引号开始,以右引号结束的任何字符序列,并且确保文章名后面跟着一个逗号。
([^,\n]+):匹配期刊名。这个模式匹配一个或多个非逗号和换行符的字符序列。
'''

# 正则表达式匹配模式
pattern1 = r'([^\n“]+), “([^”]+),”\s*([^,\n]+)' #作者和文章名和期刊名,用括号将三者区分
pattern2 = r'([^\n“]+), “([^”]+),”\s*([^,\n]+[)])'
#parttern1缺少了最后的右括号,在这里补充上。[)]表示可供选择。

然后循环输出元组中的元素,放到列表中,从而将元组的元素转化为列表中的字符串。

最后,将不必要的信息清除,简洁代码如下:

import requests
from bs4 import BeautifulSoup as bs
from openpyxl import Workbook
import rewb=Workbook()
ws=wb.activewfile=open("bool.txt","w",encoding="utf-8")url="https://law.yale.edu/china-center/publications/recent-staff-publications"webfile=requests.get(url)
webfile.encoding="utf-8"
data=webfile.textsoup=bs(data,"html.parser")
soup.prettify()items=soup.find_all("p")# 正则表达式匹配模式pattern2 = r'([^\n“]+), “([^”]+),”\s*([^,\n]+[)])'#作者和文章名和期刊名,用括号将三者区分for i in items:info=i.get_text()# 查找所有匹配项matches = re.findall(pattern2, info)if len(matches)>0:print(matches)for m in matches:mlist=[]for k in m:mlist.append(k)print(k,sep=",",end=";",file=wfile)            ws.append(mlist)wfile.close()
wb.save("book2.xlsx")

即可完成。

案例二 哈佛

爬取哈佛大学费正清中心出版书籍的信息时候,标签信息是class="article-container entry-content clear",所以用:item1=soup.find_all(attrs={"class":"article-container entry-content clear"})

所以,爬取代码如下:

 
'''
下面这段代码,爬取哈佛大学费正清中心出版书籍的信息
'''
import requests
from bs4 import BeautifulSoup as bs
from openpyxl import Workbookwb=Workbook()
ws=wb.activefor page in range(1,9):url=f'https://fairbank.fas.harvard.edu/research/publications/page/{page}/'webFile=requests.get(url)webFile.eocoding="utf-8"data=webFile.textsoup=bs(data,'html.parser')soup.prettify()##item1=soup.find_all(attrs={"class":"uagb-post__title"})#提取书本标题信息##for i in item1:##    print(i.get_text())######item2=soup.find_all(attrs={"class":"ast-excerpt-container ast-blog-single-element"})#提取书目介绍信息##for k in item2:##    print(k.get_text())item3=soup.find_all(attrs={"class":"article-container entry-content clear"})#在网络页面中,找到的整个的文本for m in item3:info=m.get_text()row1=info.split("\n")row2=list(filter(lambda x:len(x)>1,row1))#过滤掉空字符串。ws.append(row2)#worksheet中添加的是列表,然后把列表中的元素挨个放到了xlsx表格中。wb.save("bool.xlsx")

即可完成。

案例三 普林斯顿大学

观察该网站,标签信息是class="row search-result-wrapper"

其网站如下:


url="https://catalog.princeton.edu/?f%5Bformat%5D%5B%5D=Book&f%5Blocation%5D%5B%5D=East+Asian+Library&page=1&per_page=100"
 

于是写代码如下:

import requests
from bs4 import BeautifulSoup as bs
from openpyxl import Workbook
import rewb=Workbook()
ws=wb.activefor pageNum in  range(1,100):#提取一百页,共10000条书目的信息url=f"https://catalog.princeton.edu/?f%5Bformat%5D%5B%5D=Book&f%5Blocation%5D%5B%5D=East+Asian+Library&page={pageNum}&per_page=100"webfile=requests.get(url)webfile.encoding="utf-8"data=webfile.textsoup=bs(data,"html.parser")soup.prettify()item=soup.find_all(attrs={"class":"row search-result-wrapper"})for m in item:info=m.get_text()row1=info.split("\n")row2=list(filter(lambda x: len(x)>1,row1))ws.append(row2)print(pageNum,pageNum/100)
wb.save("book3.xlsx")

即可完成。

一日一图

代码如下:

"""
使用Python中的turtle模块绘制一个壮观的太阳系图是一个有趣且具有挑战性的任务"""import turtle
import math# 设置屏幕
screen = turtle.Screen()
screen.bgcolor("black")
screen.title("Solar System")# 创建太阳
sun = turtle.Turtle()
sun.hideturtle()
sun.penup()
sun.goto(0, -200)
sun.pendown()
sun.color("yellow")
sun.begin_fill()
sun.circle(50)
sun.end_fill()# 行星数据(名称,距离太阳的距离(单位:像素),大小(单位:像素))
planets = [("Mercury", 35, 5),("Venus", 72, 10),("Earth", 98, 10),("Mars", 152, 7),("Jupiter", 279, 30),  # 简化大小,实际应更大("Saturn", 449, 25),   # 简化大小,实际应更大# "Uranus" 和 "Neptune" 由于距离太远,在这个比例下可能无法很好地显示
]# 绘制行星和轨道
orbit_color = "gray"
planet_color = ["gray", "yellow", "blue", "red", "orange", "gold", "lightblue"]  # 对应行星的颜色,实际应根据行星选择for i, (name, distance, size) in enumerate(planets):# 绘制轨道orbit_turtle = turtle.Turtle()orbit_turtle.hideturtle()orbit_turtle.speed(0)orbit_turtle.penup()orbit_turtle.goto(0, 0)orbit_turtle.pendown()orbit_turtle.color(orbit_color)orbit_turtle.width(2)orbit_turtle.circle(distance)orbit_turtle.hideturtle()# 绘制行星planet_turtle = turtle.Turtle()planet_turtle.hideturtle()planet_turtle.speed(0)planet_turtle.penup()# 计算行星在轨道上的位置angle = 360 * i / len(planets)  # 均匀分布行星x = distance * math.cos(math.radians(angle))y = distance * math.sin(math.radians(angle)) - 200  # 减去太阳的高度planet_turtle.goto(x, y)planet_turtle.pendown()planet_turtle.color(planet_color[i % len(planet_color)])  # 循环使用颜色planet_turtle.begin_fill()planet_turtle.circle(size)planet_turtle.end_fill()planet_turtle.write(name, align="center", font=("Arial", 8, "normal"))planet_turtle.hideturtle()# 隐藏turtle光标
turtle.done()
turtle.tracer(False)

图片如下:

即可完成。

相关文章:

Python →爬虫实践

爬取研究中心的书目 现在&#xff0c;想要把如下网站中的书目信息爬取出来。 案例一 耶鲁 Publications | Yale Law School 分析网页&#xff0c;如下图所示&#xff0c;需要爬取的页面&#xff0c;标签信息是“<p>”&#xff0c;所以用 itemssoup.find_all("p&…...

Visitor 访问者模式

1)意图 表示一个作用于某对象结构中的各元素的操作。它允许在不改变各元素的类的前提下定义用于这些元素的新操作。 2)结构 访问者模式的结构图如图 7-48 所示。 其中: Visitor(访问者) 为该对象结构中ConcreteElement 的每一个类声明一个 Vsit 操作。该操作的名字和特征标识…...

Mac解压包安装MongoDB8并设置launchd自启动

记录一下在mac上安装mongodb8过程&#xff0c;本机是M3芯片所以下载m芯片的安装包&#xff0c;intel芯片的类似操作。 首先下载安装程序包。 # M芯片下载地址 https://fastdl.mongodb.org/osx/mongodb-macos-arm64-8.0.3.tgz # intel芯片下载地址 https://fastdl.mongodb.org…...

Springboot采用jasypt加密配置

目录 前言 一、Jasypt简介 二、运用场景 三、整合Jasypt 2.1.环境配置 2.2.添加依赖 2.3.添加Jasypt配置 2.4.编写加/解密工具类 2.5.自定义加密属性前缀和后缀 2.6.防止密码泄露措施 2.61.自定义加密器 2.6.2通过环境变量指定加密盐值 总结 前言 在以往的多数项目中&#xff0…...

加载shellcode

​​​​​​ #include <stdio.h>#include <windows.h>DWORD GetHash(const char* fun_name){ DWORD digest 0; while (*fun_name) { digest ((digest << 25) | (digest >> 7)); //循环右移 7 位 digest *fun_name; //累加…...

K8S如何基于Istio实现全链路HTTPS

K8S如何基于Istio实现全链路HTTPS Istio 简介Istio 是什么?为什么选择 Istio?Istio 的核心概念Service Mesh(服务网格)Data Plane(数据平面)Sidecar Mode(边车模式)Ambient Mode(环境模式)Control Plane(控制平面)Istio 的架构与组件Envoy ProxyIstiod其他组件Istio 的流量管…...

React Query在现代前端开发中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 React Query在现代前端开发中的应用 React Query在现代前端开发中的应用 React Query在现代前端开发中的应用 引言 React Query …...

【HAProxy09】企业级反向代理HAProxy高级功能之压缩功能与后端服务器健康性监测

HAProxy 高级功能 介绍 HAProxy 高级配置及实用案例 压缩功能 对响应给客户端的报文进行压缩&#xff0c;以节省网络带宽&#xff0c;但是会占用部分CPU性能 建议在后端服务器开启压缩功能&#xff0c;而非在HAProxy上开启压缩 注意&#xff1a;默认Ubuntu的包安装nginx开…...

PostgreSQL中表的数据量很大且索引过大时怎么办

在PostgreSQL中&#xff0c;当表的数据量很大且索引过大时&#xff0c;可能会导致性能问题。以下是一些优化索引和表数据的方法&#xff1a; 1. 评估和删除不必要的索引 识别未使用的索引&#xff1a;使用pg_stat_user_indexes和pg_index系统视图来查找未被使用的索引&#x…...

【QML】QML多线程应用(WorkerScript)

1. 实现功能 QML项目中&#xff0c;点击一个按键后&#xff0c;运行一段比较耗时的程序&#xff0c;此时ui线程会卡住。如何避免ui线程卡住。 2. 单线程&#xff08;会卡住&#xff09; 2.1 界面 2.2 现象 点击delay btn后&#xff0c;执行耗时函数&#xff08;TestJs.func…...

认证鉴权框架SpringSecurity-1--概念和原理篇

1、基本概念 Spring Security 是一个强大且高度可定制的框架&#xff0c;用于构建安全的 Java 应用程序。它是 Spring 生态系统的一部分&#xff0c;提供了全面的安全解决方案&#xff0c;包括认证、授权、CSRF防护、会话管理等功能。 2、认证、授权和鉴权 &#xff08;1&am…...

计算器上的MC、MR、M+、M—、CE是什么意思?

在计算器中&#xff0c; MC键叫做memory clear&#xff0c;中文 清除存储&#xff0c;是一个清除寄存器中存储数字的指令。 MS键叫做memory save&#xff0c;中文 存入存储。 而MR键&#xff0c;则是一个读取原先存储在寄存器中的数字的指令。 M键指将当前数值存入寄存器以…...

无人机飞手执照处处需要,森林、石油管道、电力巡检等各行业都需要

无人机飞手执照在多个行业中确实具有广泛的应用需求&#xff0c;包括森林、石油管道、电力巡检等领域。以下是对这些领域无人机飞手执照需求的具体分析&#xff1a; 一、森林领域 在森林领域&#xff0c;无人机飞手执照对于进行高效、准确的森林资源管理和监测至关重要。无人机…...

计算机网络——路由选择算法

路由算法 路由的计算都是以子网为单位计算的——找到从原子网到目标子网的路径 链路状态算法...

【前端】技术演进发展简史

一、前端 1、概述 1990 年&#xff0c;第一个web浏览器诞生&#xff0c;Tim 以超文本语言 HTML 为基础在 NeXT 电脑上发明了最原始的 Web 浏览器。 1991 年&#xff0c;WWW诞生&#xff0c;这标志着前端技术的开始。 前端&#xff08;Front-end&#xff09;和后端&#xff08;…...

深入解析贪心算法及其应用实例

标题&#xff1a;深入解析贪心算法及其应用实例 一、引言 贪心算法&#xff08;Greedy Algorithm&#xff09;是一类简单、直观的算法设计策略&#xff0c;广泛应用于优化问题中。其基本思想是每一步都选择当前状态下最优的选择&#xff0c;即在每一步做出局部最优的决策&…...

电子工牌独立双通道定向拾音方案(有视频演示)

现在一些行业的客服人员在面对客户都要求使用电子工牌分别记录客服和顾客的声音,我们利用双麦克风阵列双波束拾音的方案设计了一个电子工牌方案.可以有效分别记录客服和顾客的声音. 方案思路: 我们采用了一个双麦阵列波束拾音的模块A-59,此模块可以利用2个麦克风组成阵列进行双…...

举例理解LSM-Tree,LSM-Tree和B+Tree的比较

写操作 write1&#xff1a;WAL 把操作同步到磁盘中WAL做备份&#xff08;追加写、性能极高&#xff09; write2&#xff1a;Memtable 完成WAL后将(k,v)数据写入内存中的Memtable&#xff0c;Memtable的数据结构一般是跳表或者红黑树 内存内采用这种数据结构一方面支持内存…...

React Native 全栈开发实战班 - 核心组件与导航

在 React Native 中&#xff0c;组件是构建用户界面的基本单元。React Native 提供了丰富的内置组件&#xff0c;涵盖了从基础布局到复杂交互的各种需求。本章节将详细介绍常用的内置组件&#xff0c;并重点讲解列表与滚动视图的使用。 1. 常用内置组件详解 React Native 提供…...

Leecode热题100-35.搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入:…...

AppSpider 7.5.025 for Windows - Web 应用程序安全测试

AppSpider 7.5.025 for Windows - Web 应用程序安全测试 Rapid7 Dynamic Application Security Testing (DAST) released March 31, 2026 请访问原文链接&#xff1a;https://sysin.org/blog/appspider/ 查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xf…...

告别创作瓶颈:像素剧本圣殿应用指南,打造你的专属剧本工作站

告别创作瓶颈&#xff1a;像素剧本圣殿应用指南&#xff0c;打造你的专属剧本工作站 1. 像素剧本圣殿简介 像素剧本圣殿是一款基于Qwen2.5-14B-Instruct深度微调的专业剧本创作工具。它将AI推理能力与8-Bit复古美学完美融合&#xff0c;为创作者提供沉浸式的剧本开发体验。 …...

视频高清低延时直播/音视频点播/云点播/云直播EasyDSS在校园教育/K12教育等各场景中的应用介绍

在线教育的核心竞争力&#xff0c;归根结底在于教学体验的优劣&#xff0c;而视频技术作为线上教学的核心载体&#xff0c;直接决定了教学体验的上限。随着在线教育行业的快速迭代&#xff0c;学员对线上课堂的要求愈发严苛&#xff1a;不仅需要高清流畅、稳定无卡顿的音视频传…...

如何快速解决AMD Ryzen系统调试问题:SMUDebugTool完整使用指南

如何快速解决AMD Ryzen系统调试问题&#xff1a;SMUDebugTool完整使用指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…...

QtScrcpy突破手游操控限制:从设备连接到多端协同的全栈解决方案

QtScrcpy突破手游操控限制&#xff1a;从设备连接到多端协同的全栈解决方案 【免费下载链接】QtScrcpy Android real-time display control software 项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy 在移动游戏竞技领域&#xff0c;触控操作的物理局限已成…...

从GC停顿2.3s到零暂停:Java函数GraalVM Native Image迁移全周期复盘(含12个兼容性雷区)

第一章&#xff1a;从GC停顿2.3s到零暂停&#xff1a;Java函数GraalVM Native Image迁移全周期复盘&#xff08;含12个兼容性雷区&#xff09;在高吞吐、低延迟的Serverless函数场景中&#xff0c;一个Spring Boot微服务因频繁Full GC导致单次停顿高达2.3秒&#xff0c;严重违反…...

Qwen3.5-9B Java面试宝典生成器:动态定制八股文与场景题

Qwen3.5-9B Java面试宝典生成器&#xff1a;动态定制八股文与场景题 1. 为什么需要智能面试助手 Java开发者求职路上&#xff0c;最头疼的莫过于海量面试题的整理和记忆。传统方式要么依赖网上零散的八股文合集&#xff0c;要么自己手动整理知识点&#xff0c;效率低下且难以…...

ESP32-S3 PSRAM实战:PlatformIO Arduino配置与内存分配优化指南

1. ESP32-S3 PSRAM基础配置与验证 最近在折腾ESP32-S3的PSRAM配置时&#xff0c;发现PlatformIO Arduino环境下有些坑需要特别注意。先说说我的硬件配置&#xff1a;ESP32-S3-DevKitC-1开发板&#xff0c;搭载8MB PSRAM和16MB FLASH。这种配置非常适合需要大内存的应用场景&…...

KityMinder:可视化思维的协作引擎 | 高效工作者必备工具

KityMinder&#xff1a;可视化思维的协作引擎 | 高效工作者必备工具 【免费下载链接】kityminder 百度脑图 项目地址: https://gitcode.com/gh_mirrors/ki/kityminder 在信息爆炸的时代&#xff0c;如何将零散的想法系统化、复杂的项目结构化&#xff1f;作为一款开源免…...

机器学习 01高斯混合模型(Gaussian Mixture Model:GMM)_基础知识与认识

公式&#xff1a; 应用&#xff1a;高斯混合模型本质是用多个高斯分布叠加&#xff0c;去拟合任意复杂的数据分布&#xff0c;常用来做聚类、密度估计、数据生成、异常检测等&#xff1a; 第一步&#xff1a;基本认识“高斯模型”&#xff1a;从“一个高斯”开始 什么是高斯分…...