抓取维基百科数据

基于python的脚本爬取:维基百科实战 爬虫已经逐渐成为非程序员都要学会的技能之一。而当前市面上的爬虫脚本冗杂,这里提供一个易于新手上手的脚本爬取,主要特点就是,快速上手看下面。:爬取维基百科内容:给一个网页,返回一个chinese_txt文件,里面有爬回这个网页内所有的文字,以及网页内所有的链接内的网页文字也会被爬到。 阅读详情

1方案概述

抓取维基百科数据。

根据网上调查,现有三种解决方案:

²  使用Apache Nutch爬虫技术,深度抓取页面数据。

²  使用JWPL技术,解析Wikipaia离线数据。

²  使用Jsoup工具类,解析Wikipaia在线html dom元素。

2方案分析

2.1 ApacheNutch

2.1 Apache Nutch

2.1.1原理

Nutch 是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。

1. 创建一个新的WebDb (admin db -create).

2. 将抓取起始URLs写入WebDB中 (inject).

3. 根据WebDB生成fetchlist并写入相应的segment(generate).

4. 根据fetchlist中的URL抓取网页 (fetch).

5. 根据抓取网页更新WebDb (updatedb).

6. 循环进行3-5步直至预先设定的抓取深度。

7. 根据WebDB得到的网页评分和links更新segments (updatesegs).

8. 对所抓取的网页进行索引(index).

9. 在索引中丢弃有重复内容的网页和重复的URLs (dedup).

10. 将segments中的索引进行合并生成用于检索的最终index(merge).

 

2.1.2不足

Nutch可以广度的抓取html页面,但是不能精确的分析html页面元素,进行数据分析。

2.2 JWPL

2.2.1原理

JWPL(Java Wikipedia Library)是一个开源的访问wikipeida数据的java api包。它提供的DataMachine 工具类可快速解析wiki格式文件,生成mysql的数据txt文件,可通过mysqlimport 导入到本地数据库中

2.2.2不足

无法快速有效的从词条正文(wiki格式的数据)中提取有用的信息,需要解析比对wiki中的数据模板,来查找对应的属性

2.3 Jsoup

2.3.1原理

Jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

2.3.2不足

只能解析制定url的html页面信息,无法像Nutch 一样自动的进行页面抓取。

3方案实施

3.1 结论

通过以上的方案分析,任何单独的一种技术都无法实现 精确抓取维基百科数据的功能。但是可以利用这些技术的优点,进行组合查询。

l  利用JWPL技术将下载的wikipedia数据进行解析,存入本地的mysql数据库中。然后根据表之间的关系,遍历分类信息,最后根据分类信息查询对应的词条。

²  Category 分类信息表

²  Category_outlinks 分类信息和父节点关系表

²  Category_pages 分类信息对应词条表

²  Page 词条信息表

l  词条信息 = https://zh.wikipedia.org/wiki/ + 词条名称

l  根据Jsoup技术解析 url 获取html信息,找出对应的属性、概述、文本

3.2 步骤

3.2.1Jwpl解析wiki数据

l  指导性的文章  

 http://www.cs.bgu.ac.il/~elhadad/nlp12/jwpl/wikification.html

http://www.cnblogs.com/heshizhu/archive/2012/06/26/2564267.html

3.2.1.1下载维基百科 历史数据

中文维基 历史下载地址http://dumps.wikimedia.org/zhwiki/

 需下载这三个 压缩包

 http://download.wikipedia.com/zhwiki/20150703/zhwiki-20150703-pages-articles.xml.bz2

 http://download.wikipedia.com/zhwiki/20150703/zhwiki-20150703-categorylinks.sql.gz

 http://download.wikipedia.com/zhwiki/20150703/zhwiki-20150703-pagelinks.sql.gz

 

3.2.1.2下载Wikipedia离线阅读器WikiTaxi

http://jingyan.baidu.com/article/90895e0fb9fb5164ec6b0b1e.html

 

3.2.1.3下载JWPL jar

下载 DataMachine地址:

https://repo1.maven.org/maven2/de/tudarmstadt/ukp/wikipedia/de.tudarmstadt.ukp.wikipedia.datamachine/0.9.1/de.tudarmstadt.ukp.wikipedia.datamachine-0.9.1-jar-with-dependencies.jar

 

下载 WikipediaAPI 地址:

https://repo1.maven.org/maven2/de/tudarmstadt/ukp/wikipedia/de.tudarmstadt.ukp.wikipedia.api/0.9.1/de.tudarmstadt.ukp.wikipedia.api-0.9.1-jar-with-dependencies.jar

 

3.2.1.4通过JWPL 中的DataMachine 工具 解析下载的历史数据


  
java -jar JWPLDataMachine.jar [LANGUAGE][MAIN_CATEGORY_NAME][DISAMBIGUATION_CATEGORY_NAME][SOURCE_DIRECTORY]

 

LANGUAGE——JWPL_Languages语言字符串匹配。

MAIN_CATEGORY_NAME——主要的名称(上)类别的Wikipedia类别层次结构

DISAMBIGUATION_CATEGORY_NAME -类别的名称包含消歧的类别

SOURCE_DIRECTORY——包含源文件的目录的路径

 

 

l  本机命令:

  
D:\Wikipedia>java -Dfile.encoding=utf8 -Xmx4g-cp jar-with-dependencies.jar de.t
 
udarmstadt.ukp.wikipedia.datamachine.domain.JWPLDataMachine chinese 頁面分類消歧义./zhwiki
DataMachine需要运行很长时间。运行完会在SOURCE_DIRECTORY目录下生成一个output目录,该目录里面有11个文件,这11个文件就是需要导入到mysql中的结构化数据了
3.2.1.5将解析完成的 txt文件导入到mysql数据库中
3.2.1.5.1创建数据库
  
CREATE DATABASE zhwiki DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
3.2.1.5.2执行建表sql

jwpl_tables.sql  http://www.cs.bgu.ac.il/~elhadad/nlp12/jwpl/jwpl_tables.sql

  
--MySQLdump10.11
--
--Host: localhost Database: jwpl_tables
--------------------------------------------------------
--Server version 5.0.37-community-nt
 
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
 
--
--Table structure for table `Category`
--
 
DROP TABLE IF EXISTS `Category`;
CREATE TABLE `Category`(
`id` bigint(20) NOT NULL auto_increment,
`pageId`int(11)default NULL,
`name` varchar(255)default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `pageId`(`pageId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
--
--Dumping data for table `Category`
--
 
LOCK TABLES `Category` WRITE;
/*!40000 ALTER TABLE `Category` DISABLE KEYS */;
/*!40000 ALTER TABLE `Category` ENABLE KEYS */;
UNLOCK TABLES;
 
--
--Table structure for table `category_inlinks`
--
 
DROP TABLE IF EXISTS `category_inlinks`;
CREATE TABLE `category_inlinks`(
`id` bigint(20) NOT NULL,
`inLinks`int(11)default NULL,
KEY `FK3F433773E46A97CC`(`id`),
KEY `FK3F433773BB482769`(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
--
--Dumping data for table `category_inlinks`
--
 
LOCK TABLES `category_inlinks` WRITE;
/*!40000 ALTER TABLE `category_inlinks` DISABLE KEYS */;
/*!40000 ALTER TABLE `category_inlinks` ENABLE KEYS */;
UNLOCK TABLES;
 
--
--Table structure for table `category_outlinks`
--
 
DROP TABLE IF EXISTS `category_outlinks`;
CREATE TABLE `category_outlinks`(
`id` bigint(20) NOT NULL,
`outLinks`int(11)default NULL,
KEY `FK9885334CE46A97CC`(`id`),
KEY `FK9885334CBB482769`(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
--
--Dumping data for table `category_outlinks`
--
 
LOCK TABLES `category_outlinks` WRITE;
/*!40000 ALTER TABLE `category_outlinks` DISABLE KEYS */;
/*!40000 ALTER TABLE `category_outlinks` ENABLE KEYS */;
UNLOCK TABLES;
 
--
--Table structure for table `category_pages`
--
 
DROP TABLE IF EXISTS `category_pages`;
CREATE TABLE `category_pages`(
`id` bigint(20) NOT NULL,
`pages`int(11)default NULL,
KEY `FK71E8D943E46A97CC`(`id`),
KEY `FK71E8D943BB482769`(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
--
--Dumping data for table `category_pages`
--
 
LOCK TABLES `category_pages` WRITE;
/*!40000 ALTER TABLE `category_pages` DISABLE KEYS */;
/*!40000 ALTER TABLE `category_pages` ENABLE KEYS */;
UNLOCK TABLES;
 
--
--Table structure for table `MetaData`
--
 
DROP TABLE IF EXISTS `MetaData`;
CREATE TABLE `MetaData`(
`id` bigint(20) NOT NULL auto_increment,
`language` varchar(255)default NULL,
`disambiguationCategory` varchar(255)default NULL,
`mainCategory` varchar(255)default NULL,
`nrofPages` bigint(20)default NULL,
`nrofRedirects` bigint(20)default NULL,
`nrofDisambiguationPages` bigint(20)default NULL,
`nrofCategories` bigint(20)default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
--
--Dumping data for table `MetaData`
--
 
LOCK TABLES `MetaData` WRITE;
/*!40000 ALTER TABLE `MetaData` DISABLE KEYS */;
/*!40000 ALTER TABLE `MetaData` ENABLE KEYS */;
UNLOCK TABLES;
 
--
--Table structure for table `Page`
--
 
DROP TABLE IF EXISTS `Page`;
CREATE TABLE `Page`(
`id` bigint(20) NOT NULL auto_increment,
`pageId`int(11)default NULL,
`name` varchar(255)default NULL,
`text` longtext,
`isDisambiguation` bit(1)default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `pageId`(`pageId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
--
--Dumping data for table `Page`
--
 
LOCK TABLES `Page` WRITE;
/*!40000 ALTER TABLE `Page` DISABLE KEYS */;
/*!40000 ALTER TABLE `Page` ENABLE KEYS */;
UNLOCK TABLES;
 
--
--Table structure for table `page_categories`
--
 
DROP TABLE IF EXISTS `page_categories`;
CREATE TABLE `page_categories`(
`id` bigint(20) NOT NULL,
`pages`int(11)default NULL,
KEY `FK72FB59CC1E350EDD`(`id`),
KEY `FK72FB59CC75DCF4FA`(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
--
--Dumping data for table `page_categories`
--
 
LOCK TABLES `page_categories` WRITE;
/*!40000 ALTER TABLE `page_categories` DISABLE KEYS */;
/*!40000 ALTER TABLE `page_categories` ENABLE KEYS */;
UNLOCK TABLES;
 
--
--Table structure for table `page_inlinks`
--
 
DROP TABLE IF EXISTS `page_inlinks`;
CREATE TABLE `page_inlinks`(
`id` bigint(20) NOT NULL,
`inLinks`int(11)default NULL,
KEY `FK91C2BC041E350EDD`(`id`),
KEY `FK91C2BC0475DCF4FA`(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
--
--Dumping data for table `page_inlinks`
--
 
LOCK TABLES `page_inlinks` WRITE;
/*!40000 ALTER TABLE `page_inlinks` DISABLE KEYS */;
/*!40000 ALTER TABLE `page_inlinks` ENABLE KEYS */;
UNLOCK TABLES;
 
--
--Table structure for table `page_outlinks`
--
 
DROP TABLE IF EXISTS `page_outlinks`;
CREATE TABLE `page_outlinks`(
`id` bigint(20) NOT NULL,
`outLinks`int(11)default NULL,
KEY `FK95F640DB1E350EDD`(`id`),
KEY `FK95F640DB75DCF4FA`(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
--
--Dumping data for table `page_outlinks`
--
 
LOCK TABLES `page_outlinks` WRITE;
/*!40000 ALTER TABLE `page_outlinks` DISABLE KEYS */;
/*!40000 ALTER TABLE `page_outlinks` ENABLE KEYS */;
UNLOCK TABLES;
 
--
--Table structure for table `page_redirects`
--
 
DROP TABLE IF EXISTS `page_redirects`;
CREATE TABLE `page_redirects`(
`id` bigint(20) NOT NULL,
`redirects` varchar(255)default NULL,
KEY `FK1484BA671E350EDD`(`id`),
KEY `FK1484BA6775DCF4FA`(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
--
--Dumping data for table `page_redirects`
--
 
LOCK TABLES `page_redirects` WRITE;
/*!40000 ALTER TABLE `page_redirects` DISABLE KEYS */;
/*!40000 ALTER TABLE `page_redirects` ENABLE KEYS */;
UNLOCK TABLES;
 
--
--Table structure for table `PageMapLine`
--
 
DROP TABLE IF EXISTS `PageMapLine`;
CREATE TABLE `PageMapLine`(
`id` bigint(20) NOT NULL auto_increment,
`name` varchar(255)default NULL,
`pageID`int(11)default NULL,
`stem` varchar(255)default NULL,
`lemma` varchar(255)default NULL,
PRIMARY KEY (`id`),
KEY `name`(`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
--
--Dumping data for table `PageMapLine`
--
 
LOCK TABLES `PageMapLine` WRITE;
/*!40000 ALTER TABLE `PageMapLine` DISABLE KEYS */;
/*!40000 ALTER TABLE `PageMapLine` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
 
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 
--Dump completed on 2008-02-1112:33:30

3.2.1.5.3导入数据库

在output目录下执行批处理文件 dbimport.bat:

  
@echo off
 
set db=zhwiki
 
set usr=root
 
set pwd=root
 
mysqlimport -u%usr%-p%pwd%--local--default-character-set=utf8 %db%Category.txt
 
mysqlimport -u%usr%-p%pwd%--local--default-character-set=utf8 %db% category_inlinks.txt
 
mysqlimport -u%usr%-p%pwd%--local--default-character-set=utf8 %db% category_outlinks.txt
 
mysqlimport -u%usr%-p%pwd%--local--default-character-set=utf8 %db% category_pages.txt
 
mysqlimport -u%usr%-p%pwd%--local--default-character-set=utf8 %db%MetaData.txt
 
mysqlimport -u%usr%-p%pwd%--local--default-character-set=utf8 %db%Page.txt
 
mysqlimport -u%usr%-p%pwd%--local--default-character-set=utf8 %db%PageMapLine.txt
 
mysqlimport -u%usr%-p%pwd%--local--default-character-set=utf8 %db% page_categories.txt
 
mysqlimport -u%usr%-p%pwd%--local--default-character-set=utf8 %db% page_inlinks.txt
 
mysqlimport -u%usr%-p%pwd%--local--default-character-set=utf8 %db% page_outlinks.txt
 
mysqlimport -u%usr%-p%pwd%--local--default-character-set=utf8 %db% page_redirects.txt
 

3.2.2Jsoup解析hml

  
/**
 
* 利用Jsoup技术解析html
 
*/
 
privatevoidJsoupHtml(String categoryId,String entryId,String name){
 
Date date =newDate();
 
//中文 简体转繁体 工具类
 
ZHConverter converter =ZHConverter.getInstance(ZHConverter.SIMPLIFIED);
 
 
String url ="https://zh.wikipedia.org/wiki/"+name;
 
name = converter.convert(name);
 
Long sTime =System.currentTimeMillis();
 
logger.info(name+" --------------------------------------------解析开始:---------------------------------url--"+url);
 
//判断数据库中是否存在该词条
 
String queryEntryByNameSql ="select t.id from bk_entry t where t.name = '"+name+"'";
 
List<Map<String,Object>> list =newArrayList<Map<String,Object>>();
 
try{
 
list = jtLocal.queryForList(queryEntryByNameSql);
 
}catch(Exception e){
 
logger.info("判断数据库中是否存在该词条 sql 出错了"+queryEntryByNameSql);
 
}
 
 
 
if(list.size()==0){
 
Document doc =null;
 
try{
 
// 5000 = 5秒
 
doc =Jsoup.connect(url).timeout(50000).get();
 
 
if(doc.select("sup").size()>0){
 
doc.select("sup").remove();//html页面的标注信息
 
}
 
if(doc.select(".mw-editsection").size()>0){
 
doc.select(".mw-editsection").remove();//删除编辑
 
}
 
 
 
//获取html正文信息
 
Elements bodys = doc.select("#mw-content-text > *");
 
StringBuffer text =newStringBuffer();
 
 
 
//解析 html 获取 概述 和 正文
 
for(Element el : bodys){
 
String elText = el.text().trim();
 
if(!StringUtil.isBlank(elText)){
 
elText = converter.convert(elText);
 
 
if(el.attr("id").equals("toc")){//目录
 
text.append("@@!@@");//定义特殊符号,分割 概述和正文
 
}
 
 
if(el.tagName().equals("h2")){//分类标题
 
text.append("<h2>"+elText+"</h2>");
 
}
 
if(el.tagName().equals("p")){//判断当前文本标签
 
text.append("<p>"+elText+"</p>");
 
}
 
}
 
 
}
 
 
 
String describe ="";//概述
 
String content ="";//正文
 
if(!StringUtil.isBlank(text.toString())){
 
if(text.indexOf("@@!@@")>-1){//判断当前text是否存在 正文和概述的分隔符
 
 
describe = text.substring(0, text.indexOf("@@!@@"));
 
content = text.substring(text.indexOf("@@!@@")+5,text.length());
 
 
logger.info("概述:--------------");
 
logger.info(describe);
 
logger.info("正文:--------------");
 
logger.info(content);
 
 
 
}else{//如果没有 @@!@@ 分隔符的话,默认用第一段作为概述
 
if(text.indexOf("<h2>")>-1){//默认用第一个分类标题 做分割
 
describe = text.substring(0, text.indexOf("<h2>"));
 
content = text.substring(text.indexOf("<h2>")+4,text.length());
 
}else{//用第一个p标签做分割
 
describe = text.substring(0, text.indexOf("</p><p>")+4);
 
content = text.substring(text.indexOf("</p><p>")+7,text.length());
 
}
 
 
 
logger.info("概述:--------------");
 
logger.info(describe);
 
logger.info("正文:--------------");
 
logger.info(content);
 
 
 
}
 
}
 
 
 
//添加词条信息到数据库
 
Entry entry =newEntry();
 
entry.setName(name);
 
entry.setCategoryId(categoryId);
 
entry.setAuthor("admin");
 
entry.setDescribe(describe);
 
entry.setContent(content);
 
entry.setWikiid(entryId);
 
 
try{
 
entryService.insertSelective(entry);
 
logger.info(JSON.toJSONString(entry));
 
}catch(Exception e){
 
logger.info("词条插入出错:-------"+JSON.toJSONString(entry));
 
}
 
 
 
 
logger.info("属性:--------------");
 
//获取页面属性信息 infobox
 
Elements infoboxs = doc.select(".infobox");
 
if(infoboxs.size()>0){//查找属性
 
Element info = infoboxs.get(0);
 
 
Elements trs = info.select("tr");
 
for(Element tr : trs){
 
String key ="";
 
String val ="";
 
if(tr.select("th").size()>0&& tr.select("td").size()>0){// key=th 、val=td
 
key = tr.select("th").text();
 
val = tr.select("td").text();
 
}elseif(tr.select("th").size()==0&& tr.select("td").size()>=2){// key=td 、val=td
 
key = tr.select("td").get(0).text();
 
val = tr.select("td").get(1).text();
 
}
 
 
 
key = converter.convert(key);
 
val = converter.convert(val);
 
if(!StringUtil.isBlank(key)&&!StringUtil.isBlank(val)){
 
logger.info(key+" : "+val );
 
Meta m =newMeta();
 
//判断属性表里是否已存在该属性
 
String metaSql =" select t.id from bk_meta t where t.category_id = '-' and t.name = '"+key+"' ";//is not null
 
// logger.info("判断该 '"+key+"' 属性是否已存在------"+metaSql);
 
List<Map<String,Object>> metaList = jtLocal.queryForList(metaSql);
 
if(metaList.size()==0){
 
m.setCategoryId("-");
 
m.setName(key);
 
try{
 
metaService.insertSelective(m);
 
}catch(Exception e){
 
logger.info("属性插入出错:-------"+JSON.toJSONString(m));
 
}
 
 
}else{
 
m.setId(Long.parseLong(metaList.get(0).get("id").toString()));
 
}
 
 
Metadata metadata =newMetadata();
 
metadata.setEntryId(entry.getId());
 
metadata.setMetaId(m.getId());
 
metadata.setValue(val);
 
metadata.setUpdateTime(date);
 
try{
 
metadataService.insertSelective(metadata);
 
}catch(Exception e){
 
logger.info("属性值 插入出错:-------"+JSON.toJSONString(metadata));
 
e.printStackTrace();
 
}
 
 
}
 
 
}
 
}
 
 
 
}catch(IOException e1){
 
logger.error(url+" 连接超时!!!");
 
}
 
 
}
 
 
Long eTime =System.currentTimeMillis();
 
logger.info(name+" --------------------------------------------解析结束:---------------------------------耗时--"+(eTime-sTime)+"毫秒!");
 
logger.info("");
 
logger.info("");
 
logger.info("");
 
logger.info("");
 
logger.info("");
 
logger.info("");
 
 
}
维基百科数据抓取避坑指南:Wikipedia-API常见问题与解决方案 本文提供了维基百科数据抓取的实战指南,重点解析了使用Wikipedia-API时常见的陷阱与解决方案。内容涵盖库的选择与配置、页面获取的多种状态处理、应对API限制的稳健抓取策略,以及多语言匹配与数据清洗等高级话题,旨在帮助开发者构建高效、可靠的数据抓取流程。 阅读详情

相关推荐

知识图谱实战:如何用Python快速抓取并结构化维基百科数据

本文提供了一套实用的Python实战方案,指导开发者如何从维基百科快速抓取并结构化数据,以构建知识图谱。文章详细介绍了从信息框和正文链接中抽取实体与关系的核心策略,并演示了整合数据、构建三元组以及实现可控递归爬取的完整流程,为自下而上构建知识图谱提供了清晰的路径。

weixin_29056101的博客 1073

维基百科的语料库下载以及信息提取笔记

目录前言一、前提知识1-1、中文维基百科的下载1-2、中文维基百科的下载1-3、中文维基百科的下载1-4、中文维基百科的下载1-5、中文维基百科的下载总结 前言 中文语料库一般都是极为稀少的,要进行中文词向量的训练可能是极为困难的,这时候我们需要使用中文维基百科来进行词向量的训练。 一、前提知识 1-1、中文维基百科的下载 wiki语料库下载网址:https://dumps.wikimedia.org/. 最近的中文wiki语料:https://dumps.wikimedia.org/zhwiki/la

艰难困苦,玉汝于成。 7214

Python中运用Pandas爬取维基百科SP500数据并保存

Python中运用Pandas爬取维基百科SP500数据并保存Pandas是什么?步骤1.引入库2.读入数据3.选取字段4.DataFrame创建数据表5.保存至Excel总结 Pandas是什么? pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量快速便捷地处理数据的函数和方法。它是使Python成为强大而高效的数据分析环境的重要因素之一。 步骤 1.引入库 代码.

weixin_45420937的博客 1569

python爬虫入门:1--爬取维基百科词条信息

开始之前先安装我们需要的库:bs4库内的Beautiful Soup 的方法可以用pip命令:pip install beautifulsoup4或者在pycharm中 settings–>Project:py–>Project interpreter–>点击右侧+ –>查询并install要爬取的维基百科url–>https://zh.wikipedia.org/wiki/Wikipedia:%E

知足常乐的博客 1万+

构建百科全书爬虫:抓取维基百科条目与信息

百科全书爬虫是一种用于从维基百科或其他在线百科全书上抓取条目和信息的工具。本篇博客将引导你构建一个高效的百科全书爬虫,使用Python编程实现自动化抓取和处理百科全书内容,让你快速获取丰富的知识和信息。百科全书爬虫是一种用于从维基百科或其他在线百科全书上抓取条目和信息的工具。通过百科全书爬虫,我们可以快速获取丰富的知识和信息,实现自动化的数据收集和处理。通过本篇博客的学习,你已经了解了如何构建一个高效的百科全书爬虫,使用Python编程实现自动化抓取和处理百科全书内容,让你快速获取丰富的知识和信息。

2201_76125393的博客 1115

Python实战:使用API获取维基百科数据

Python是一门非常强大的编程语言,可以通过各种API来获取各种有趣的数据。本篇文章中我们将使用Python和维基百科API获取有关于某个主题的详细信息。接下来,我们定义一个函数来获取维基百科中关于特定主题的所有信息。函数的输入参数为主题名称,输出参数为包含所有信息的字典。希望通过这篇文章能够帮助大家更好地学习Python,并且能够获取到更有趣的数据。最后,我们将上述代码组织成完整的Python程序,让大家可以更方便地使用。我们可以看到,这个函数成功地获取了维基百科中Python语言的所有信息。

持续更新 989

使用亮数据网页抓取API零代码抓取维基百科优质数据构建coze智能体知识库

使用亮数据网页抓取API零代码抓取维基百科优质数据构建coze智能体知识库

科技改变人类,技术成就未来 1万+

基于Python的维基百科数据抓取实战

本文将深入探讨如何使用Python最新技术抓取维基百科数据,包括requests-html、aiohttp异步爬虫、BeautifulSoup解析、API调用等多种方法。文章将详细介绍每种技术的实现原理、代码示例及性能对比,并提供完整的项目代码和异常处理方案,帮助读者构建高效、稳定的维基百科数据采集系统。关键词:Python爬虫、维基百科API、异步爬虫、数据抓取、BeautifulSoup。

2201_76125261的博客 322

零代码构建AI知识库:基于亮数据网页抓取API的维基百科数据自动化采集实战

网络爬虫,又称为网页蜘蛛、机器人或网络漫游器,是一种自动化脚本或程序,设计用于系统地浏览互联网并提取信息。信息收集:爬虫可以快速地从大量网站中收集数据,帮助用户获得所需的信息。搜索引擎优化:搜索引擎使用爬虫来抓取网页并索引内容,以便提供准确的搜索结果。市场分析:企业使用爬虫来监测竞争对手的动态、分析市场趋势和消费者行为。数据集构建:研究人员利用爬虫创建数据集以进行进一步的分析和模型训练。

HUANGXIN9898的博客 2052

使用 Python 爬虫抓取百科全书条目:从百度百科到维基百科的数据抓取与分析

Python 爬虫(Web Scraping)是一种通过编写程序从网页自动提取信息的技术。它的应用范围非常广泛,包括从新闻网站、社交平台、学术资源等抓取有价值的数据。在本篇博客中,我们将介绍如何利用 Python 爬虫技术抓取百度百科和维基百科的条目和内容,并通过这些内容进一步进行数据分析与展示。requests:一个流行的 Python HTTP 库,用于发送网络请求并接收响应。:一个 HTML/XML 解析库,用于提取和处理网页中的数据。pandas。

2201_76125261的博客 777

Python爬虫实战:如何抓取城市人口数据

抓取城市人口数据:从互联网上抓取不同城市的人口统计数据。数据清洗与存储:对抓取的数据进行清洗,并将其存储到数据库或文件中。数据分析:对抓取的城市人口数据进行分析,如人口增长趋势、各城市人口对比等。数据可视化:使用数据可视化技术,直观展示不同城市的人口数据。通过本文的学习,我们详细介绍了如何使用Python爬虫抓取城市人口数据,并对数据进行清洗、存储和分析。我们使用了最新的Python技术,包括requestspandas等库,以及如何从维基百科等网站抓取城市人口数据。

2201_76125261的博客 791

用DrissionPage升级维基百科爬虫:更简洁高效的数据抓取方案

代码简洁性:减少25%代码量功能扩展性:轻松应对动态加载等复杂场景健壮性:内置自动重试和错误处理可维护性:CSS选择器比正则表达式更易维护项目地址扩展阅读:《DrissionPage高级技巧:从爬虫到自动化测试》下期预告:《基于DrissionPage的自动化测试框架设计——从Web操作到数据验证》

eqwaak0的博客 1416

WikiScraper:抓取维基百科足球运动员数据的JavaScript脚本

本文还有配套的精品资源,点击获取 简介:WikiScraper是一个专门用于从维基百科抓取足球运动员相关数据的JavaScript脚本。它可能利用JavaScript库进行网页解析和数据提取,实现对HTML结构中信息的准确抓取。此外,脚本可能包含数据处理、存储和清洗等步骤,以结构化数据格式提供给用户。开发者可能需要考虑使用代理IP池以应对反爬策略,并可能使用数据进行后续的分...

weixin_35903223的博客 1577

r语言抓取维基百科表格数据

维基百科表格抓取

深蓝的博客 603

LayaNative源码编译

修改好后的LayaNative2.0需要重新编译生成Android和iOS所需要的动态库文件。

末之 1359

【vLLM-性能洞察】基于Ascend Profiler的端到端推理瓶颈定位与优化实践

本文详细介绍了如何利用Ascend Profiler对vLLM-Ascend大模型推理服务进行端到端的性能瓶颈定位与优化。通过实战案例,阐述了从数据采集、可视化分析到诊断低效算子、内存管理、计算通信重叠及框架调度等常见瓶颈的全过程,为基于昇腾NPU的AI推理性能调优提供了系统性的方法论和实用工具指南。

cc789的博客 522

python 维基百科爬虫_如何使用Python提取维基百科数据

python 维基百科爬虫 这是本教程的可视版: 我需要指出的是,我们不会手动抓取Wikipedia页面, Wikipedia模块已经为我们完成了艰巨的工作。 让我们安装它: pip3 install wikipedia 打开一个Python交互式外壳或一个空文件,然后继续。 让我们总结一下什么是Python编程语言: import wikipedia # print the s...

编程故事的地方 1522

ChatUI vs Ant Design X 技术选型对比

维度ChatUI优势轻量级、易上手、完美兼容 Ant Design全能型框架、企业级扩展性、深度模型集成局限性功能单一、缺乏高级交互支持学习曲线陡峭、包体积较大最佳实践单独聊天窗口集成整体智能助手系统开发通过对比可见,ChatUI 适合快速实现基础对话功能,而Ant Design X 更适合构建复杂的 AI 驱动应用。实际选择时需结合项目规模、团队技术栈和对交互复杂度的需求综合评估。

四楼没电梯的专栏 2265

Python爬虫包 BeautifulSoup 递归抓取

之前的代码都是对单个静态页面进行抓取,这是人为简化的例子。爬虫的主要目的就是为了沿着网络抓取需要的内容。它们的本质是一种递归的过程。它们首先需要获得网页的内容,然后分析页面内容并找到另一个URL,然后获得这个URL的页面内容,不断重复这一个过程。让我们以维基百科为一个例子。 我们想要将维基百科中凯文·贝肯词条里所有指向别的词条的链接提取出来。# -*- coding: utf-8 -*- # @A...

Null的博客 1105

手把手教你用OpenCompass评估Qwen1.5-1.8B模型(含数据集配置详解)

本文提供了使用OpenCompass评估Qwen1.5-1.8B-Chat模型的详细实战教程。内容涵盖从创建独立Python环境、下载模型与核心数据集,到编写配置文件、执行评测命令及解读结果的完整流程。重点解析了模型与数据集的配置细节,并分享了性能调优与常见问题排查方法,旨在帮助开发者快速上手系统化的模型评估。

weixin_29228781的博客 137

爬取二手房数据:Python爬虫+Geopy实战,看透房价与地理位置的隐藏关系

哪些区域单价虚高(房源少但单价远高于周边);哪些小区性价比高(靠近地铁/学校,单价低于同地段平均水平);房价与地理位置的量化关系(如距离地铁每远1公里,单价下降多少)。如果想扩展分析范围,可爬取多个城市/区域的数据,对比不同城市的房价差异;或结合时间维度(定期爬取),分析房价的涨跌趋势。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 949
上一篇: Apache POI介绍
下一篇: Solr6.0集成IK-Analyzer分词器
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值