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)

图片如下:

即可完成。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux学习】【Ubuntu入门】1-4 ubuntu终端操作与shell命令1

1.使用快捷键CtrlAltT打开命令终端&#xff0c;或者单击右键点击… 2.常用shell命令 目录信息查看命令&#xff1a;ls ls -a&#xff1a;显示目录所有文件及文件夹&#xff0c;包括隐藏文件&#xff0c;比如以.开头的 ls -l&#xff1a;显示文件的详细信息 ls -al&#xff1…

WordPress 6.7 “Rollins”发布

每个 WordPress 版本都会向一位在音乐界留下不可磨灭印记的艺术家致敬。WordPress 6.7 的代号为“Rollins”&#xff0c;旨在向传奇爵士萨克斯演奏家桑尼罗林斯致敬。罗林斯是爵士乐界最伟大的即兴演奏家和先驱之一&#xff0c;他以精湛的技术、创新精神和无畏的音乐表达方式影…

ESXi安装【真机和虚拟机】(超详细)

项目简介&#xff1a; ESXi&#xff08;Elastic Sky X Integrated&#xff09;是VMware公司开发的一种裸机虚拟化管理程序&#xff0c;允许用户在单一物理服务器上运行多个虚拟机&#xff08;VM&#xff09;。它直接安装在服务器硬件上&#xff0c;而不是操作系统之上&#xff…

【若依框架】代码生成详细教程,15分钟搭建Springboot+Vue3前后端分离项目,基于Mysql8数据库和Redis5,管理后台前端基于Vue3和Element Plus,开发小程序数据后台

今天我们来借助若依来快速的搭建一个基于springboot的Java管理后台&#xff0c;后台网页使用vue3和 Element Plus来快速搭建。这里我们可以借助若依自动生成Java和vue3代码&#xff0c;这就是若依的强大之处&#xff0c;即便你不会Java和vue开发&#xff0c;只要跟着石头哥也可…

HBuilder(uniapp) 配置android模拟器

HBuilder&#xff08;uniapp&#xff09; 配置android模拟器 选择完成之后&#xff0c;点击ok&#xff0c;再次点击Configure—》AVD Manager

flutter插件:录制系统播放的声音

该插件基于flutter包 flutter_screen_recording 和 github库 SystemAudioCaptureAndroid&#xff0c;实现了在安卓手机上录制系统播放声音的功能&#xff0c;也就是说&#xff0c;只要一个安卓应用没有设置不允许其它应用录制声音&#xff0c;该插件可以录制该应用播放的声音。…

Mac中安装OhMyZsh

Mac中安装OhMyZsh 文章目录 Mac中安装OhMyZsh一、Homebrew二、OhMyZsh1、Oh-My-Zsh配置1.1&#xff1a;主题配置1.2&#xff1a;插件配置&#xff08;语法高亮和自动提示&#xff09;1、zsh-autosuggestions&#xff08;需下载安装&#xff09;&#xff1a;高亮显示所有支持的命…

生信:TCGA学习(R、RStudio安装与下载、常用语法与常用快捷键)

前置环境 macOS系统&#xff0c;已安装homebrew且会相关命令。 近期在整理草稿区&#xff0c;所以放出该贴。 R语言、RStudio、R包安装 R语言安装 brew install rRStudio安装 官网地址&#xff1a;https://posit.co/download/rstudio-desktop/ R包下载 注意R语言环境自带…

elementUI input 禁止内容两端存在空格,或者是自动去除两端空格

需求 项目中有需求&#xff1a;输入框中禁止内容两端存在空格&#xff0c;或者是自动去除两端空格。 解决方法 vue的api文档中有过介绍&#xff0c;使用.trim可以去掉用户输入内容中两端的空格&#xff0c;如下图 代码 <el-input v-model.trim"name" cleara…

flink同步mysql数据表到pg库

1.关闭防火墙和selinux systemctl stop firewalld systemctl disable firewalld systemctl status firewalldvi /etc/selinux/config 修改为disabled2.安装java8 yum list java-1.8* yum install java-1.8.0-openjdk* -yjava -version3.下载和部署postgresql 下载地址&#…

HBase理论_HBase架构组件介绍

近来有些空闲时间&#xff0c;正好最近也在开发HBase相关内容&#xff0c;借此整理一下学习和对HBase组件的架构的记录和个人感受&#xff0c;付出了老夫不少心血啊&#xff0c;主要介绍的就是HBase的架构设计以及我的拓展内容。内容如有不当或有其他理解 matirx70163.com HB…

第九部分 :1.STM32之通信接口《精讲》(USART,I2C,SPI,CAN,USB)

本芯片使用的是STM32F103C8T6型号 STM32F103C8T6是STM32F1系列中的一种较常用的低成本ARM Cortex-M3内核MCU&#xff0c;具有丰富的通信接口&#xff0c;包括USART、SPI、I2C等。下面是该芯片上通信接口的管脚分布、每个接口的工作模式、常用应用场景和注意事项。 1. USART (通…

ODOO学习笔记(8):模块化架构的优势

灵活性与可定制性 业务流程适配&#xff1a;企业的业务流程往往因行业、规模和管理方式等因素而各不相同。Odoo的模块化架构允许企业根据自身的具体业务流程&#xff0c;选择和组合不同的模块。例如&#xff0c;一家制造企业可以启用采购、库存、生产和销售模块&#xff0c;并通…

MATLAB课程:AI工具辅助编程——MATLAB+LLMs

给出一些可能有用的方法辅助大家写代码。 方法一&#xff1a;MATLAB软件LLM (不太懂配置的同学们为了省事可以主要用这个方法) 方法一特别针对本门MATLAB教学课程&#xff0c;给出一种辅助ai工具的操作指南。MATLAB中可以安装MatGPT插件&#xff0c;该插件通过调用ChatGPT的API…

C++二叉平衡搜索树:AVL树的插入、删除与平衡

目录 引言 AVL树的概念 AVL树节点的定义 AVL树的插入 AVL树的基本结构 AVL树的插入 第一步&#xff1a;按搜索树的规则进行插入 第二步&#xff1a;更新平衡因子 1、父节点的平衡因子为 parent->bf 0 2、更新完 parent 的 bf&#xff0c;如果 parent->bf 1…

机器学习(1)

一、机器学习 机器学习&#xff08;Machine Learning, ML&#xff09;是人工智能&#xff08;Artificial Intelligence, AI&#xff09;的一个分支&#xff0c;它致力于开发能够从数据中学习并改进性能的算法和模型。机器学习的核心思想是通过数据和经验自动优化算法&#xff…

【Kafka】集成案例:与Spark大数据组件的协同应用

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《大数据前沿&#xff1a;技术与应用并进》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是kafka 2、Kafka 的主要特性 3、Kafka 的…

【卡尔曼滤波】递归算法Recursive的应用 C语言、Python实现(Kalman Filter)

【卡尔曼滤波】递归算法Recursive的应用 C语言、Python实现&#xff08;Kalman Filter&#xff09; 更新以gitee为准&#xff1a; gitee地址 文章目录 递归算法算术平均的递归算法例子卡尔曼滤波递归Python实现C语言实现与普通卡尔曼滤波的比较附录&#xff1a;压缩字符串、大…

python+pptx:(二)添加图片、表格、形状、模版渲染

目录 图片 表格 合并单元格 填充色、边距 写入数据 形状 模版渲染 上一篇&#xff1a;pythonpptx&#xff1a;&#xff08;一&#xff09;占位符、文本框、段落操作_python输出ppt母版占位符标号-CSDN博客 from pptx import Presentation from pptx.util import Cm, In…

【Windows】CMD命令学习——系统命令

CMD&#xff08;命令提示符&#xff09;是Windows操作系统中的一个命令行解释器&#xff0c;允许用户通过输入命令来执行各种系统操作。 系统命令 systeminfo - 显示计算机的详细配置信息。 tasklist - 显示当前正在运行的进程列表。 taskkill - 终止正在运行的进程。例如&am…