废话不多说,直接进入正题。

今天我要爬取的网站是起点中文网,内容是一部小说。

首先是引入库

from urllib.request import urlopen
from bs4 import BeautifulSoup

然后将网址赋值

html=urlopen("http://read.qidian.com/chapter/dVQvL2RfE4I1/hJBflakKUDMex0RJOkJclQ2.html")  //小说的第一章的网址
bsObj=BeautifulSoup(html) //创建beautifulsoup对象

首先尝试爬取该页的小说内容

firstChapter=bsObj.find("div",{"class","read-content"})                                 //find方法是beautifulsoup对象拥有的函数,
print (firstChapter.read_text())

find方法也可以和正则表达式搭配使用,并且多用于图片,视频等资源的爬取

由于本次爬取内容全在一个class属性值为read-content的盒子中,所以采用了find方法,如果该网页中,文字被放在多个盒子里,则应采用findAll方法,并且返回值为一个集合,需要用循环遍历输出。

将代码整合运行,发现可以实现文章的爬取,但是现在的问题是,爬取了该小说的一章,那么,往后的几章该如何爬取呢?

由前面步骤可以得出,只要得知下一章的网址,即可进行爬取。首先,将打印文字的部分封装为函数,那么,每次取得新的地址,即可打印出对应文本

def writeNovel(html):
bsObj=BeautifulSoup(html)
chapter=bsObj.find("div",{"class","read-content"})
print (chapter.get_text())

现在的问题是如何爬取下一章的网址,观察网页结构可得知,下一章的按钮实质是一个id为j_chapterNext的a标签,那么,可由这个标签获得下一章的网址

重新包装函数,整理得:

from urllib.request import urlopen
from bs4 import BeautifulSoup
def writeNovel(html):
bsObj=BeautifulSoup(html)
chapter=bsObj.find("div",{"class","read-content"})
print (chapter.get_text())
bsoup=bsObj.find("",{"id":"j_chapterNext"})
html2="http:"+bsoup.get('href')+".html"
return (urlopen(html2))

html=urlopen("http://read.qidian.com/chapter/dVQvL2RfE4I1/hJBflakKUDMex0RJOkJclQ2.html")

i=1
while(i<10):
   html=writeNovel(html)
   i=i+1

将文本写入text文件中

from urllib.request import urlopen
from bs4 import BeautifulSoup
def writeNovel(html):
bsObj=BeautifulSoup(html)
chapter=bsObj.find("div",{"class","read-content"})
print (chapter.get_text())
fo=open("novel.text","a")
fo.write(chapter.get_text())
fo.close
bsoup=bsObj.find("",{"id":"j_chapterNext"})
html2="http:"+bsoup.get('href')+".html"
return (urlopen(html2)) html=urlopen("http://read.qidian.com/chapter/dVQvL2RfE4I1/hJBflakKUDMex0RJOkJclQ2.html") i=1
while(i<8):
html=writeNovel(html)
i=i+1

最新文章

  1. BZOJ 3223: Tyvj 1729 文艺平衡树
  2. 使用bootstrap 弹出效果演示
  3. MessageClient
  4. java提高篇(十)-----详解匿名内部类
  5. mac 下搭建php 编程环境全过程
  6. C语言共用体内存计算
  7. 【转】IOS高级教程1:处理1000张图片的内存优化
  8. UVa 12230 (期望) Crossing Rivers
  9. java Socket的怪异之处
  10. 三个JS函数闭包(closure)例子
  11. 移动端H5页面遇到的问题总结
  12. (5)java中的常用API,其实就是一些常见类的使用
  13. Java: private、protected、public和default的区别
  14. golang 数组反转
  15. 2019-4-25 html学习笔记
  16. python中的swapcase
  17. iview框架select默认选择一个option的值
  18. Redis之无序集合类型命令
  19. An internal error occurred during: &quot;Updating status for Tomcat v7.0 Server at localhost...&quot;
  20. Mysql基本操作(远程登陆,启动,停止,重启,授权)

热门文章

  1. 在地铁上看了zabbix 的书发现 &quot;报警执行远程命令&quot;
  2. .net 平台下, Socket通讯协议中间件设计思路(附源码)
  3. Java集合干货——LinkedList源码分析
  4. 前端构建工具gulp之基本介绍
  5. Arch Linux安装记录
  6. NPOI操作Excel 踩坑记
  7. cain使用方法
  8. Codeforces 626G Raffles(贪心+线段树)
  9. noip2015 提高组 解题报告
  10. 【Zigbee技术入门教程-号外】基于Z-Stack协议栈的抢答系统