利用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 Web服务器Tornado使用小结
May 06 Python
在Python的Bottle框架中使用微信API的示例
Apr 23 Python
python 时间戳与格式化时间的转化实现代码
Mar 23 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
Apr 19 Python
Python3.6 Schedule模块定时任务(实例讲解)
Nov 09 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
Python3 SSH远程连接服务器的方法示例
Dec 29 Python
Python Selenium 之关闭窗口close与quit的方法
Feb 13 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
Feb 22 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
Jan 25 Python
十个Python自动化常用操作,即拿即用
May 10 Python
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
Jun 07 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
PHP的可变变量名的使用方法分享
2012/02/05 PHP
php数组一对一替换实现代码
2012/08/31 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
2013/01/19 PHP
PHP中对于浮点型的数据需要用不同的方法解决
2014/03/11 PHP
分享3个php获取日历的函数
2015/09/25 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
jquery中添加属性和删除属性
2015/06/03 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
2016/01/21 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
js简单时间比较的方法
2016/08/02 Javascript
浅谈jquery高级方法描述与应用
2016/10/04 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
谈谈jQuery之Deferred源码剖析
2016/12/19 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
详解Vue.js和layui日期控件冲突问题解决办法
2019/07/25 Javascript
[10:07]2014DOTA2国际邀请赛 实拍选手现场观战DK对阵Titan
2014/07/12 DOTA
python实现将汉字转换成汉语拼音的库
2015/05/05 Python
在python中bool函数的取值方法
2018/11/01 Python
Python3爬虫之自动查询天气并实现语音播报
2019/02/21 Python
jupyter notebook运行命令显示[*](解决办法)
2020/05/18 Python
同步和异步有何异同,在什么情况下分别使用他们?举例说明
2014/02/27 面试题
J2EE面试题大全
2016/08/06 面试题
数控专业个人求职信范例
2013/11/29 职场文书
表彰大会策划方案
2014/05/13 职场文书
销售类求职信
2014/06/13 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
Python+Appium新手教程
2021/04/17 Python
go结构体嵌套的切片数组操作
2021/04/28 Golang
【海涛教你打DOTA】黑鸟第一视角解说
2022/04/01 DOTA