re,xpath,BeautifulSoup三种方法爬取古诗词网上诗歌
re,xpath ,bs4对同一个页面的解析速度
发现re比xpath快接近10倍,xpath比bs4快接近10倍
可见要想追求极致速度,使用正则表达式解析有多重要
1、re解析的代码
# 使用正则表达式解析网页元素
# 关键点:直接找每个个体里面相同位置的元素,用findall一次提取出来到列表中
import requests
import re
DATA = []
def getHTMLtext(url,headers,timeout=10):
try :
resp = requests.get(url,headers=headers,timeout=timeout)
resp.raise_for_status
resp.encoding = 'utf-8'
return resp.text
except:
return ''
def reParser(text):
name_list = re.findall(r'<div class="yizhu".*?<b>(.*?)</b>',text,re.S) #re.DOTALL
dynasty_list = re.findall(r'<p class="source">.*?target="_blank">(.*?)</a>',text,re.S)
author_list = re.findall(r'<p class="source">.*?target="_blank">.*?</a>.*?target="_blank">(.*?)</a>',text,re.S)
row_content_list = re.findall(r'<div class="contson".*?>(.*?)</div>',text,re.S)
content_list = []
for content in row_content_list:
temp = re.sub(r'<.*?>','',content) #这里一定要记得不要写成了贪婪匹配哦
content_list.append(temp.strip()) #去除空格
likes_list = re.findall(r'<span> (\d*?)</span>',text,re.S)
for value in zip(name_list,dynasty_list,author_list,content_list,likes_list):
name,dynasty,author,content,likes = value
poetry_dict = {
'诗词名':name,
'朝代':dynasty,
'作者':author,
'内容':content,
'点赞数':likes
}
DATA.append(poetry_dict)
def print_poetry(data):
for every_poetry in data:
print(every_poetry['诗词名'])
print(every_poetry['朝代'] + ':' + every_poetry['作者'] )
print(every_poetry['内容'])
print('有{}人喜欢这首诗(词)哦'.format(every_poetry["点赞数"]))
print("\n"+'*'*50+"\n")
if __name__ == '__main__':
row_url = 'https://www.gushiwen.org/default_{}.aspx'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'}
num = input('请输入要爬取的页数(1-100):')
for i in range(eval(num)):
url = row_url.format(i+1)
text = getHTMLtext(url,headers)
if text == '':
print('url: {} 访问失败'.format(url))
else:
reParser(text)
DATA.sort(key=lambda x: int(x['点赞数']),reverse = True)
TOP10 = DATA[:10]
print_poetry(TOP10) 2、Xpath版本
from lxml import etree
DATA = []
def getHTMLtext(url,headers,timeout=10):
try :
resp = requests.get(url,headers=headers,timeout=timeout)
resp.raise_for_status
resp.encoding = 'utf-8'
return resp.text
except:
return ''
def xpathParser(text):
htmlElement = etree.HTML(text) # <class 'lxml.etree._Element'>
name_list = htmlElement.xpath('/html/body/div[2]/div[1]/div/div[1]/p[1]/a/b/text()')
dynasty_list = htmlElement.xpath('/html/body/div[2]/div[1]/div/div[1]/p[2]/a[1]/text()')
author_list = htmlElement.xpath('/html/body/div[2]/div[1]/div/div[1]/p[2]/a[2]/text()')
content_list = []
poetries = htmlElement.xpath('//div[@class="contson" and contains(@id,"contson")]') #返回一个列表,里面每一个都是'lxml.etree._Element'
# print(etree.tostring(poetries[0],encoding = 'utf-8').decode('utf-8'))
for poetry in poetries:
row_content = ''.join(poetry.xpath('.//text()'))#这里的.可千万不能掉,否则会忽略掉poetry哦
content_list.append(row_content.replace('\n',''))
row_likes_list = htmlElement.xpath('//a[contains(@id,"agood")]/span/text()')
likes_list = [int(like.strip()) for like in row_likes_list]
for value in zip(name_list,dynasty_list,author_list,content_list,likes_list):
name,dynasty,author,content,likes = value
poetry_dict = {
'诗词名':name,
'朝代':dynasty,
'作者':author,
'内容':content,
'点赞数':likes
}
DATA.append(poetry_dict)
def print_poetry(data):
for every_poetry in data:
print(every_poetry['诗词名'])
print(every_poetry['朝代'] + ':' + every_poetry['作者'] )
print(every_poetry['内容'])
print('有{}人喜欢这首诗(词)哦'.format(every_poetry["点赞数"]))
print("\n"+'*'*50+"\n")
if __name__ == '__main__':
row_url = 'https://www.gushiwen.org/default_{}.aspx'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'}
num = input('请输入要爬取的页数(1-100):')
for i in range(eval(num)):
url = row_url.format(i+1)
text = getHTMLtext(url,headers)
if text == '':
print('url: {} 访问失败'.format(url))
else:
xpathParser(text)
DATA.sort(key=lambda x: int(x['点赞数']),reverse = True)
TOP10 = DATA[:10]
print_poetry(TOP10)
3、bs4版本
# 使用bs4提取网页,先利用find_all解析
import requests
from bs4 import BeautifulSoup
DATA = []
def getHTMLtext(url,headers,timeout=10):
try :
resp = requests.get(url,headers=headers,timeout=timeout)
resp.raise_for_status
resp.encoding = 'utf-8'
return resp.text
except:
return ''
def bs4_find_all_Parser(text):
soup = BeautifulSoup(text,'lxml')
sons = soup.find_all('div',class_ = "sons")[:10] #返回一个<class 'bs4.element.ResultSet'>,每一个元素都是Tag类型
# 注意:上一步里面返回了一些其他的元素,我们可以提取出前面的10项,那是我们需要用到的
for son in sons:
name = son.find('b').string
print(name)
dynasty_author = son.find('p',class_="source").get_text()
print(dynasty_author)
content = son.find('div',class_="contson").get_text().strip()
print(content)
like = son.find_all('span')[1].string.strip()
print('点赞数:'+like)
print('\n'+'*'*30+'\n')
if __name__ == '__main__':
url = 'https://www.gushiwen.org/default_1.aspx'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'}
text = getHTMLtext(url,headers)
if text == '':
print('url: {} 访问失败'.format(url))
else:
bs4_find_all_Parser(text)
re,xpath,BeautifulSoup三种方法爬取古诗词网上诗歌的更多相关文章
- Python学习--两种方法爬取网页图片(requests/urllib)
实际上,简单的图片爬虫就三个步骤: 获取网页代码 使用正则表达式,寻找图片链接 下载图片链接资源到电脑 下面以博客园为例子,不同的网站可能需要更改正则表达式形式. requests版本: import ...
- Pyhton网络爬虫实例_豆瓣电影排行榜_Xpath方法爬取
-----------------------------------------------------------学无止境------------------------------------- ...
- JAVA之线程同步的三种方法
最近接触到一个图片加载的项目,其中有声明到的线程池等资源需要在系统中线程共享,所以就去研究了一下线程同步的知识,总结了三种常用的线程同步的方法,特来与大家分享一下.这三种方法分别是:synchroni ...
- 【SQL】Oracle分页查询的三种方法
[SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 ? 1 2 3 4 5 6 7 8 9 10 11 [sql] select * from t_user t whe ...
- mysql分表的三种方法
先说一下为什么要分表当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间.根据个人经验,mysql执行一 ...
- Eclipse插件安装的三种方法
转自:http://www.blogjava.net/tangzurui/archive/2008/06/30/211669.html 整理了一下格式. (前两种安装方式以多国语言包的安装为例) 1 ...
- java 获取随机数的三种方法
方法1(数据类型)(最小值+Math.random()*(最大值-最小值+1))例:(int)(1+Math.random()*(10-1+1))从1到10的int型随数 方法2获得随机数for (i ...
- 【转】css清除浮动float的三种方法总结,为什么清浮动?浮动会有那些影响?
摘要: css清除浮动float的三种方法总结,为什么清浮动?浮动会有那些影响? 一.抛一块问题砖(display: block)先看现象: 分析HTML代码结构: <div class ...
- 三种方法实现PCA算法(Python)
主成分分析,即Principal Component Analysis(PCA),是多元统计中的重要内容,也广泛应用于机器学习和其它领域.它的主要作用是对高维数据进行降维.PCA把原先的n个特征用数目 ...
随机推荐
- hdu 4501三重包问题
好好理解一下背包问题 从01包入手 内层的循环 是为了以后求解记录数据 因为只有一个取舍问题 所以只需要一层循环就可以 这里有三个背包 钱 积分 以及免费物品 那么 就需要三重循环 #include& ...
- (一)shiro简介和用户登录demo及角色管理
一.shiro简介 Apache Shiro是Java的一个安全框架.Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境.Shiro可以帮助我们完成 ...
- JAVA的转义字符
一.常见的转义字符 转移字符对应的英文是escape character , 转义字符串(Escape Sequence) 字母前面加上捺斜线"\"来表示常见的那些不能显示的AS ...
- sys.dm_exec_query_stats的total_worker_time的单位是微秒还是毫秒
该视图sys.dm_exec_query_stats存放的就是当前所有执行计划的详细信息,比如某条执行计划共占CPU多少等等.因为该视图对编译次数.占用CPU资源总量.执行次数等都进行了详细的记录,所 ...
- Tomcat服务器的数字证书 HTTPS 连接!
SUN公司提供了制作证书的工具keytool, 在JDK 1.4以后的版本中都包含了这一工具,它的位置为\bin\keytool.exe 注意要使用一下 cmd命令,请确认jdk环境变量可以使用,可以 ...
- tasklist、taskkill命令使用
tasklist.taskkill命令使用 在Windows XP中新增了两个命令行工具“tasklist.taskkill”.通过“Ctrl+Alt+Del”组合键,打开“任务管理器”就可以查看到本 ...
- Django2.0 开始一个项目
python项目运行环境: 安装虚拟环境工具 pip install virtualenv 使用虚拟环境: 创建虚拟环境: virtualenv <虚拟环境名称> 进去虚拟环境: S ...
- iframe内嵌页面——跨域通讯
<template> <div class="act-form"> <iframe :src="src" ref=" ...
- [LeetCode] 328. Odd Even Linked List ☆☆☆(奇偶节点分别放一起)
每天一算:Odd Even Linked List 描述 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起.请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性. 请尝 ...
- coding++ :MySQL函数——FIND_IN_SET()
语法:FIND_IN_SET(str,strlist) 定义: 1). 假如字符串 str 在由N子链组成的字符串列表 strlist 中,则返回值的范围在1到N之间. 2). 一个字符串列表就是一个 ...