Python →爬虫实践

server/2024/11/17 17:00:41/

爬取研究中心的书目

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

案例一 耶鲁

Publications | Yale Law School

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

代码如下:

python">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())

完善代码如下:

python">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文本方式。

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

python">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缺少了最后的右括号,在这里补充上。[)]表示可供选择。

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

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

python">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"})

所以,爬取代码如下:

python"> 
'''
下面这段代码,爬取哈佛大学费正清中心出版书籍的信息
'''
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"
 

于是写代码如下:

python">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">"""
使用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)

图片如下:

即可完成。


http://www.ppmy.cn/server/142695.html

相关文章

String类型

String类 在Java中&#xff0c;String 类是一个非常核心且常用的类&#xff0c;它用于表示文本值&#xff0c;即字符序列或者说字符串。 1.1 类的声明 public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence 解释&#xff1a…

llamaindex实战-Agent-在Agent中和数据库对话(本地部署)

概述 本文实现了一个简单的智能Agent&#xff0c;该Agent先从数据库中查询出数据&#xff0c;然后再通过工具函数来对数据进行处理。这是一个非常常见的场景。从这个场景可以扩展到多个实际的场景。 同样&#xff0c;本文的实验都是在本地一台&#xff1a;16C32G的linux机器(…

D3的竞品有哪些,D3的优势,D3和echarts的对比

D3 的竞品 ECharts: 简介: ECharts 是由百度公司开发的一款开源的 JavaScript 图表库&#xff0c;提供了丰富的图表类型和高度定制化的配置选项。特点: 易于使用&#xff0c;文档详尽&#xff0c;社区活跃&#xff0c;支持多种图表类型&#xff08;如折线图、柱状图、饼图、散点…

ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案

在当今快速发展的农业领域&#xff0c;智慧农业已成为推动农业现代化、助力乡村全面振兴的新手段和新动能。随着信息技术的持续进步和城市化进程的加快&#xff0c;智慧农业对于监控安全和智能管理的需求日益增长。 视频设备轨迹回放平台EasyCVR作为智慧农业视频远程监控管理方…

【C#】C#编程入门指南:构建你的.NET开发基础

文章目录 前言&#xff1a;1. C# 开发环境 VS的基本熟悉2. 解决方案与项目的关系3. 编辑、编译、链接、运行4. 托管代码和CLR4.1 CLR&#xff1a;4.2 C# 代码第编译过程&#xff08;两次编译的&#xff09; 5. 命名空间6. 类的组成与分析7. C# 的数据类型7.1 值类型7.2 引用类型…

循环神经网络(GRU)全面解析

1. 引言 什么是GRU&#xff1f; GRU&#xff08;Gated Recurrent Unit&#xff0c;门控循环单元&#xff09;是一种循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;变体&#xff0c;旨在处理序列数据。GRU在LSTM&#xff08;Long Short-Term Memory&…

超子物联网HAL库笔记:定时器[外部模式]篇

超子物联网 HAL库学习 汇总入口&#xff1a; 超子物联网HAL库笔记&#xff1a;[汇总] 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 一、资源介绍&#xff1a;STM32F103C8T6定时器资源介绍 高级定时器&#x…

PGSQL记录

1.每句后面需要加 &#xff1b; 2.获取时间 当前时间 : GETDATE() now() LOCALTIMESTAMP 提前几天时间: now()::DATE -3 now()::TIME 推迟几天时间&#xff1a;now()1 获取第几周: date_part(week,Today) day month 设定每周的第一天为周一 SET datestyle TO IS…