利用python爬取散文网的文章实例教程


Posted in Python onJune 18, 2017

本文主要给大家介绍的是关于python爬取散文网文章的相关内容,分享出来供大家参考学习,下面一起来看看详细的介绍:

效果图如下:

利用python爬取散文网的文章实例教程

配置python 2.7

bs4

 requests

安装 用pip进行安装 sudo pip install bs4

sudo pip install requests

简要说明一下bs4的使用因为是爬取网页 所以就介绍find 跟find_all

find跟find_all的不同在于返回的东西不同 find返回的是匹配到的第一个标签及标签里的内容

find_all返回的是一个列表

比如我们写一个test.html 用来测试find跟find_all的区别。

内容是:

<html>
<head>
</head>
<body>
<div id="one"><a></a></div>
<div id="two"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >abc</a></div>
<div id="three"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >three a</a><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >three a</a><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >three a</a></div>
<div id="four"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >four<p>four p</p><p>four p</p><p>four p</p> a</a></div>
</body>
</html>

然后test.py的代码为:

from bs4 import BeautifulSoup
import lxml

if __name__=='__main__':
 s = BeautifulSoup(open('test.html'),'lxml')
 print s.prettify()
 print "------------------------------"
 print s.find('div')
 print s.find_all('div')
 print "------------------------------"
 print s.find('div',id='one')
 print s.find_all('div',id='one')
 print "------------------------------"
 print s.find('div',id="two")
 print s.find_all('div',id="two")
 print "------------------------------"
 print s.find('div',id="three")
 print s.find_all('div',id="three")
 print "------------------------------"
 print s.find('div',id="four")
 print s.find_all('div',id="four")
 print "------------------------------"

运行以后我们可以看到结果当获取指定标签时候两者区别不大当获取一组标签的时候两者的区别就会显示出来

利用python爬取散文网的文章实例教程

所以我们在使用时候要注意到底要的是什么,否则会出现报错

接下来就是通过requests 获取网页信息了,我不太懂别人为什么要写heard跟其他的东西

我直接进行网页访问,通过get方式获取散文网几个分类的二级网页然后通过一个组的测试,把所有的网页爬取一遍

def get_html():
 url = "https://www.sanwen.net/"
 two_html = ['sanwen','shige','zawen','suibi','rizhi','novel']
 for doc in two_html:
 i=1
  if doc=='sanwen':
  print "running sanwen -----------------------------"
  if doc=='shige':
  print "running shige ------------------------------"
  if doc=='zawen':
  print 'running zawen -------------------------------'
  if doc=='suibi':
  print 'running suibi -------------------------------'
  if doc=='rizhi':
  print 'running ruzhi -------------------------------'
  if doc=='nove':
  print 'running xiaoxiaoshuo -------------------------'
 while(i<10):
 par = {'p':i}
 res = requests.get(url+doc+'/',params=par)
 if res.status_code==200:
  soup(res.text)
  i+=i

这部分的代码中我没有对res.status_code不是200的进行处理,导致的问题是会不显示错误,爬取的内容会有丢失。然后分析散文网的网页,发现是www.sanwen.net/rizhi/&p=1

p最大值是10这个不太懂,上次爬盘多多是100页,算了算了以后再分析。然后就通过get方法获取每页的内容。

获取每页内容以后就是分析作者跟题目了代码是这样的

def soup(html_text):
 s = BeautifulSoup(html_text,'lxml')
 link = s.find('div',class_='categorylist').find_all('li')
 for i in link:
 if i!=s.find('li',class_='page'):
 title = i.find_all('a')[1]
 author = i.find_all('a')[2].text
 url = title.attrs['href']
 sign = re.compile(r'(//)|/')
 match = sign.search(title.text)
 file_name = title.text
 if match:
 file_name = sign.sub('a',str(title.text))

获取标题的时候出现坑爹的事,请问大佬们写散文你标题加斜杠干嘛,不光加一个还有加两个的,这个问题直接导致我后面写入文件的时候文件名出现错误,于是写正则表达式,我给你改行了吧。

最后就是获取散文内容了,通过每页的分析,获得文章地址,然后直接获取内容,本来还想直接通过改网页地址一个一个的获得呢,这样也省事了。

def get_content(url):
 res = requests.get('https://www.sanwen.net'+url)
 if res.status_code==200:
 soup = BeautifulSoup(res.text,'lxml')
 contents = soup.find('div',class_='content').find_all('p')
 content = ''
 for i in contents:
 content+=i.text+'\n'
 return content

最后就是写入文件保存ok

f = open(file_name+'.txt','w')

 print 'running w txt'+file_name+'.txt'
 f.write(title.text+'\n')
 f.write(author+'\n')
 content=get_content(url) 
 f.write(content)
 f.close()

三个函数获取散文网的散文,不过有问题,问题在于不知道为什么有些散文丢失了我只能获取到大概400多篇文章,这跟散文网的文章是差很多很多的,但是确实是一页一页的获取来的,这个问题希望大佬帮忙看看。可能应该做网页无法访问的处理,当然我觉得跟我宿舍这个破网有关系

f = open(file_name+'.txt','w')
 print 'running w txt'+file_name+'.txt'
 f.write(title.text+'\n')
 f.write(author+'\n')
 content=get_content(url) 
 f.write(content)
 f.close()

差点忘了效果图

利用python爬取散文网的文章实例教程

能会出现timeout现象吧,只能说上大学一定要选网好的啊!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
从零学python系列之数据处理编程实例(一)
May 22 Python
python实现验证码识别功能
Jun 07 Python
python 用lambda函数替换for循环的方法
Jun 09 Python
python爬虫获取百度首页内容教学
Dec 23 Python
python实现AES加密与解密
Mar 28 Python
python+selenium实现简历自动刷新的示例代码
May 20 Python
Python 运行.py文件和交互式运行代码的区别详解
Jul 02 Python
python爬虫之快速对js内容进行破解
Jul 09 Python
Django Python 获取请求头信息Content-Range的方法
Aug 06 Python
Python 下载及安装详细步骤
Nov 04 Python
Python文件操作及内置函数flush原理解析
Oct 13 Python
Django项目如何正确配置日志(logging)
Apr 29 Python
Python3中简单的文件操作及两个简单小实例分享
Jun 18 #Python
python实现各进制转换的总结大全
Jun 18 #Python
Mac 上切换Python多版本
Jun 17 #Python
利用python实现xml与数据库读取转换的方法
Jun 17 #Python
用python写个自动SSH登录远程服务器的小工具(实例)
Jun 17 #Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
Jun 16 #Python
Python生成随机密码的方法
Jun 16 #Python
You might like
header跳转和include包含问题详解
2012/09/08 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
PHP+FastCGI+Nginx配置PHP运行环境
2014/08/07 PHP
PHP实现上传多图即时显示与即时删除的方法
2017/05/09 PHP
php app支付宝回调(异步通知)详解
2018/07/25 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
短信提示使用 特效
2007/01/19 Javascript
从面试题学习Javascript 面向对象(创建对象)
2012/03/30 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
Javascript限制网页只能在微信内置浏览器中访问
2014/11/09 Javascript
javascript实现获取浏览器版本、浏览器类型
2015/12/02 Javascript
通过node-mysql搭建Windows+Node.js+MySQL环境的教程
2016/03/01 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
jQuery实现对象转为url参数的方法
2017/01/11 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
2017/08/15 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
浅谈angular2子组件的事件传递(任意组件事件传递)
2018/09/30 Javascript
微信小程序入门之广告条实现方法示例
2018/12/05 Javascript
JS为什么说async/await是generator的语法糖详解
2019/07/11 Javascript
vue router返回到指定的路由的场景分析
2020/11/10 Javascript
vue 插槽简介及使用示例
2020/11/19 Vue.js
Python3实现连接SQLite数据库的方法
2014/08/23 Python
python动态网页批量爬取
2016/02/14 Python
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
python实现机器学习之多元线性回归
2018/09/06 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
python实现简单颜色识别程序
2020/02/19 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
澳洲CFL商城:CHEMIST FOR LESS(中文)
2021/02/28 全球购物
abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
2012/10/15 面试题
综治目标管理责任书
2015/05/11 职场文书
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android
Elasticsearch 聚合查询和排序
2022/04/19 Python