#-*-coding:utf-8-*-
 import urllib2
 from bs4 import BeautifulSoup

 class dbxs:

     def __init__(self):
         self.pageIndex = 0
         self.enable = True
         self.file = None
         self.content = []

     #获取html页面的内容
     def getPage(self, pageIndex):
         try:
             #设置代理ip
             enable_proxy = True
             proxy_handler = urllib2.ProxyHandler({'Http': '113.118.170.230:808'})
             null_proxy_handler = urllib2.ProxyHandler({})
             if enable_proxy:
                 opener = urllib2.build_opener(proxy_handler)
             else:
                 opener = urllib2.build_opener(null_proxy_handler)
             urllib2.install_opener(opener)
             #获得页面响应的内容
             url = 'https://www.douban.com/tag/%E5%B0%8F%E8%AF%B4/book' + "?start=" + str(pageIndex)
             #设置请求头部信息,模拟浏览器的行为
             my_headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:55.0)'}
             request =   urllib2.Request(url, headers = my_headers)
             response = urllib2.urlopen(request)
             return response.read()
         except urllib2.URLError, e:
             if hasattr(e, "code"):
                 print e.code
             if hasattr(e, "reason"):
                 print e.reason
                 return None

     #过滤查找这一页的小说名字,信息和评分
     def getContent(self, pageIndex, content):
         pageCode = self.getPage(pageIndex)
         soup = BeautifulSoup(pageCode, 'html.parser')
         #在获得相应的内容中找出所有标签为<dd>的内容(里面包含了我们需要的小说信息)
         contents = soup.find_all('dd')

         if contents:
             for item in contents:
                 title = item.find(class_ = 'title').string.encode('utf-8')
                 info = item.find(class_ = 'desc').string.strip().encode('utf-8')
                 rate = item.find(class_ = 'rating_nums')
                 #通过试验,我们发现某一页可能存在小说没有评分,如果我们不判断rate,那么可能就出现报错
                 if rate:
                     rates = rate.string.encode('utf-8')
                     content.append([title, info, rates])

                 else:
                     content.append([title, info])
         #如果页面不包含<dd>标签,我们应该停止
         else:
             print u"所有页面已加载完"
             self.enable = False

         return content

     #写入文件
     def writeData(self, content):
         self.file = open("bdxs.txt", "w+")   #必须在for循环外面,不然每一次写入都会覆盖之前的数据
         for item in content:
             if len(item) == 3:
                 self.file.write(item[0] + "\n")
                 self.file.write(item[1] + "\n")
                 self.file.write(u"评分:" + item[2] + "\n\n")
             else:
                 self.file.write(item[0] + "\n")
                 self.file.write(item[1] + "\n")
             self.file.write("========================================\n\n")

     #创建一个开始方法
     def start(self):
         x = 1
         while self.enable == True:
             content = self.getContent(self.pageIndex, self.content)
             if self.enable == True:
                 print "正在写入第%s页..." %x
             self.writeData(content)
             self.pageIndex += 15
             x += 1

 DBXS = dbxs()
 DBXS.start()

这段代码我还没理解透彻,比如每一页的小说信息写入完成后,怎么在后面加上第几页,后期我将继续完善它。

Python爬虫之利用BeautifulSoup爬取豆瓣小说(三)——将小说信息写入文件的更多相关文章

  1. Python爬虫之利用BeautifulSoup爬取豆瓣小说(一)——设置代理IP

    自己写了一个爬虫爬取豆瓣小说,后来为了应对请求不到数据,增加了请求的头部信息headers,为了应对豆瓣服务器的反爬虫机制:防止请求频率过快而造成“403 forbidden”,乃至封禁本机ip的情况 ...

  2. Python爬虫之利用BeautifulSoup爬取豆瓣小说(二)——回车分段打印小说信息

    在上一篇文章中,我主要是设置了代理IP,虽然得到了相关的信息,但是打印出来的信息量有点多,要知道每打印一页,15个小说的信息全部会显示而过,有时因为屏幕太小,无法显示全所有的小说信息,那么,在这篇文章 ...

  3. python爬虫:利用正则表达式爬取豆瓣读书首页的book

    1.问题描述: 爬取豆瓣读书首页的图书的名称.链接.作者.出版日期,并将爬取的数据存储到Excel表格Douban_I.xlsx中 2.思路分析: 发送请求--获取数据--解析数据--存储数据 1.目 ...

  4. python爬虫:利用BeautifulSoup爬取链家深圳二手房首页的详细信息

    1.问题描述: 爬取链家深圳二手房的详细信息,并将爬取的数据存储到Excel表 2.思路分析: 发送请求--获取数据--解析数据--存储数据 1.目标网址:https://sz.lianjia.com ...

  5. Python爬虫使用lxml模块爬取豆瓣读书排行榜并分析

    上次使用了BeautifulSoup库爬取电影排行榜,爬取相对来说有点麻烦,爬取的速度也较慢.本次使用的lxml库,我个人是最喜欢的,爬取的语法很简单,爬取速度也快. 本次爬取的豆瓣书籍排行榜的首页地 ...

  6. Python爬虫之利用正则表达式爬取内涵吧

    首先,我们来看一下,爬虫前基本的知识点概括 一. match()方法: 这个方法会从字符串的开头去匹配(也可以指定开始的位置),如果在开始没有找到,立即返回None,匹配到一个结果,就不再匹配. 我们 ...

  7. Python爬虫实战二之爬取百度贴吧帖子

    大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不 ...

  8. Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  9. 转 Python爬虫实战二之爬取百度贴吧帖子

    静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 ...

随机推荐

  1. PAT 1072. 开学寄语(20) JAVA

    下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其QQ,封其电脑,夺其手机,收其ipad,断其wifi,使其百无聊赖,然后,净面.理发.整衣,然后思过.读书.锻炼.明智.开悟.精进 ...

  2. PAT 1067. 试密码(20)

    当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度不超过20的.不包含空格.Ta ...

  3. java基础:父类与子类之间变量和方法的调用

    1)父类构造函数 java中当调用某个类的构造方法的时候,系统总会调用父类的非静态初始化块进行初始化,这个调用是隐式的,而且父类的静态初始化代码 块总是会被执行,接着调用父类的一个或者多个构造器执行初 ...

  4. CentOS中yum安装Java

    查看CentOS自带JDK是否已安装.◆输入:yum list installed |grep java. 若有自带安装的JDK,如何卸载CentOS系统自带Java环境?◆卸载JDK相关文件输入:y ...

  5. 1.3 使用电脑测试MC20的电话语音功能

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  6. IT basic knowledge

    LAMP: Linux Apache MySQL PHP URL & URI: 统一资源定位符是统一资源标志符的一个下种.统一资源标志符确定一个资源,而统一资源定位符不但确定一个资源, 而且还 ...

  7. 十位用户唯一ID生成策略

    新浪微博和twitter 等系统都有一窜数字ID来标示一个唯一的用户,这篇文章就是记录如何实现这种唯一数字ID 原理:使用MYSQL 自增ID 拼接任意字符..然后使用进制转换打乱规则 一般来说实现唯 ...

  8. iOS 根据农历日期 获取当前的农历年份 即 干支纪年法算农历年

    前言:我国古代是用干支纪年的,近代史上提到的甲午战争.戊戌变法.辛亥革命等名词就是干支纪年.所谓干支就是十天干和十二地支的简称.天干.地支按照一定规则(单配单,双配双)可以搭配成60对,也就是一个甲子 ...

  9. Zuul

    一.zuul是什么 zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用. Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架. ...

  10. yuv转opencv中的IplImage

    http://www.2cto.com/kf/201208/145559.html http://www.opencv.org.cn/forum.php?mod=viewthread&tid= ...