在上一篇文章中,我主要是设置了代理IP,虽然得到了相关的信息,但是打印出来的信息量有点多,要知道每打印一页,15个小说的信息全部会显示而过,有时因为屏幕太小,无法显示全所有的小说信息,那么,在这篇文章中,我主要想通过设置回车来控制每一条小说信息的输出,当我按下回车时,会显示下一条小说的信息,按“Q”时,会退出程序,同时,这个方法还会根据包含小说信息的页面数量来决定是否加载新的一页。
首先,我们导入一些模块,定义一个类,初始化方法,定义一些变量:
self.Novels里存放的是小说信息的变量,每一个元素是每一页的小说信息们
self.load决定程序是否继续运行的变量
#-*-coding:utf-8-*- import urllib2 from bs4 import BeautifulSoup class dbxs: def __init__(self): self.pageIndex = 0 self.Novels = [] self.load = False
然后,我们获得html页面的内容,在这里,我们为了能够得到信息,而不让豆瓣服务器查封我们的IP,我们设置了请求的头部信息headers和代理IP。
def getPage(self, pageIndex): #设置代理IP enable_proxy = True proxy_handler = urllib2.ProxyHandler({'Http': '116.30.251.210:8118'}) 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) #设置headers,模拟浏览器登录 try: 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() 19 except urllib2.URLError, e: if hasattr(e, "code"): print e.code if hasattr(e, "reason"): print e.reason return None
我们获得的是html源码,源码里有包含我们想要的元素,但是为了方便抓取数据,利用BeautifulSoup解析文档,这里我们用的解析器是html.parser。
这里的pageNovels是一个列表,存放的是每一页的所有小说信息,当某一小说信息没有rate一项时,这一条小说信息没有rates。
def getPageItems(self, pageIndex): pageCode = self.getPage(pageIndex) soup = BeautifulSoup(pageCode, 'html.parser') contents = soup.find_all('dd') pageNovels = [] if contents: for item in contents: title = item.find(class_ = 'title').string info = item.find(class_ = 'desc').string.strip() rate = item.find(class_ = 'rating_nums') #这里不能加string,如果rate不存在,那么程序会报错:NoneType没有.string属性 if rate: rates = rate.string pageNovels.append([title, info, rates]) else: pageNovels.append([title, info]) return pageNovels else: pageNovels.append('end') return pageNovels
需要定义一个加载页,当self.Novels里的页数小于2,则程序加载下一页
def loadPage(self): if self.load == True: if len(self.Novels) < 2: pageNovels = self.getPageItems(self.pageIndex) if pageNovels: self.Novels.append(pageNovels) self.pageIndex += 15
为了获得每一页的每一条小说信息,我们需要定义一个getOneContent的方法
def getOneContent(self, pageNovels, page): for item in pageNovels: input = raw_input() self.loadPage() if input == "Q": self.load = False print u"已退出查看" return None #if item[2]: #这里不能用if itme[2],当item[2]不存在时,会报错 if len(item) == 3: print u"第%d页 %s\n%s\n评分:%s\n" %(page, item[0], item[1], item[2]) else: print u"第%d页 %s\n%s\n" %(page, item[0], item[1])
最后,我们得定义一个开始方法
def start(self): print u"正在读取豆瓣小说信息,按回车查看新内容,Q退出" self.load = True self.loadPage() nowPage = 0 while self.load: if len(self.Novels) > 0: pageNovels = self.Novels[0] nowPage += 1 del self.Novels[0] self.getOneContent(pageNovels, nowPage) if self.Novels[0] == ['end']: self.load = False print u'所有页面已加载完'
整理一下,最后的总代码:
#-*-coding:utf-8-*- import urllib2 from bs4 import BeautifulSoup import time import random class dbxs: def __init__(self): self.pageIndex = 0 self.Novels = [] self.load = False #获取html页面的内容 def getPage(self, pageIndex): #设置代理ip enable_proxy = True proxy_handler = urllib2.ProxyHandler({'Http': '116.30.251.210:8118'}) 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) try: 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 getPageItems(self, pageIndex): pageCode = self.getPage(pageIndex) soup = BeautifulSoup(pageCode, 'html.parser') contents = soup.find_all('dd') pageNovels = [] if contents: for item in contents: title = item.find(class_ = 'title').string info = item.find(class_ = 'desc').string.strip() rate = item.find(class_ = 'rating_nums') #这里不能加string,如果rate不存在,那么程序会报错:NoneType没有.string属性 if rate: rates = rate.string pageNovels.append([title, info, rates]) else: pageNovels.append([title, info]) return pageNovels else: pageNovels.append('end') return pageNovels def loadPage(self): if self.load == True: if len(self.Novels) < 2: pageNovels = self.getPageItems(self.pageIndex) if pageNovels: self.Novels.append(pageNovels) self.pageIndex += 15 #打印每一个小说的信息 def getOneContent(self, pageNovels, page): for item in pageNovels: input = raw_input() self.loadPage() if input == "Q": self.load = False print u"已退出查看" return None #if item[2]: #这里不能用if itme[2],当item[2]不存在时,会报错 if len(item) == 3: print u"第%d页 %s\n%s\n评分:%s\n" %(page, item[0], item[1], item[2]) else: print u"第%d页 %s\n%s\n" %(page, item[0], item[1]) #创建一个开始方法 def start(self): print u"正在读取豆瓣小说信息,按回车查看新内容,Q退出" self.load = True self.loadPage() nowPage = 0 while self.load: if len(self.Novels) > 0: pageNovels = self.Novels[0] nowPage += 1 del self.Novels[0] self.getOneContent(pageNovels, nowPage) if self.Novels[0] == ['end']: self.load = False print u'所有页面已加载完' DBXS = dbxs() DBXS.start()
有必要解释一下self.Novels和PageNovels
Python爬虫之利用BeautifulSoup爬取豆瓣小说(二)——回车分段打印小说信息的更多相关文章
-
Python爬虫之利用BeautifulSoup爬取豆瓣小说(一)——设置代理IP
自己写了一个爬虫爬取豆瓣小说,后来为了应对请求不到数据,增加了请求的头部信息headers,为了应对豆瓣服务器的反爬虫机制:防止请求频率过快而造成“403 forbidden”,乃至封禁本机ip的情况 ...
-
python爬虫:利用BeautifulSoup爬取链家深圳二手房首页的详细信息
1.问题描述: 爬取链家深圳二手房的详细信息,并将爬取的数据存储到Excel表 2.思路分析: 发送请求--获取数据--解析数据--存储数据 1.目标网址:https://sz.lianjia.com ...
-
Python爬虫之利用BeautifulSoup爬取豆瓣小说(三)——将小说信息写入文件
#-*-coding:utf-8-*- import urllib2 from bs4 import BeautifulSoup class dbxs: def __init__(self): sel ...
-
python爬虫:利用正则表达式爬取豆瓣读书首页的book
1.问题描述: 爬取豆瓣读书首页的图书的名称.链接.作者.出版日期,并将爬取的数据存储到Excel表格Douban_I.xlsx中 2.思路分析: 发送请求--获取数据--解析数据--存储数据 1.目 ...
-
Python爬虫使用lxml模块爬取豆瓣读书排行榜并分析
上次使用了BeautifulSoup库爬取电影排行榜,爬取相对来说有点麻烦,爬取的速度也较慢.本次使用的lxml库,我个人是最喜欢的,爬取的语法很简单,爬取速度也快. 本次爬取的豆瓣书籍排行榜的首页地 ...
-
Python爬虫之利用正则表达式爬取内涵吧
首先,我们来看一下,爬虫前基本的知识点概括 一. match()方法: 这个方法会从字符串的开头去匹配(也可以指定开始的位置),如果在开始没有找到,立即返回None,匹配到一个结果,就不再匹配. 我们 ...
-
Python爬虫实战一之爬取糗事百科段子
大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...
-
python爬虫学习01--电子书爬取
python爬虫学习01--电子书爬取 1.获取网页信息 import requests #导入requests库 ''' 获取网页信息 ''' if __name__ == '__main__': ...
-
转 Python爬虫实战一之爬取糗事百科段子
静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...
随机推荐
-
关于JQuery的一些知识点
1.jQuery的入口函数 1.1 语法jQuery(document).read(function(){ }); $(function(){ });// ** window.onlaod = fun ...
-
delphi 文件夹权限设置(执行一个小脚本的笨办法)
如题,研究了一天,也没再网上找到比较好的方式,自己做了一个.方法如下: 1.创建一个 cmd 命令文件.2.调用该命令. 代码如下: S:='echo y|cacls h: /t /c /g ev ...
-
springCloud Hystrix 断路由
第一步加入依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId& ...
-
Python_对Excel表进行操作
1.使用Python统计Excel表中的行数 import xlrd # 计算一个工作簿中所有Sheet表的行数 def count_book(work_book): workbook = xlrd. ...
-
Django 项目连接数据库Mysql要安装mysqlclient驱动出错 : Failed building wheel for mysqlclient:
1,如果直接用 CMD命令:pip install mysqlclient ,会安装出错. 2,解决问题,参考了这个博友的帖子:https://blog.csdn.net/qq_29784441/ar ...
-
intelliJ IDEA之使用svn或git管理代码
intelliJ IDEA之使用svn管理代码 1.VCS—>import into Version Control—>Share Project(Subversion) 2.点击+ ...
-
(二)收集的MongoDB命令集合
一:针对整个数据库的 1."show dbs" 命令可以显示所有数据的列表. 2. "db" 命令可以显示当前数据库对象或集合. 3."use&quo ...
-
2017ACM暑期多校联合训练 - Team 2 1008 HDU 6052 To my boyfriend (数学 模拟)
题目链接 Problem Description Dear Liao I never forget the moment I met with you. You carefully asked me: ...
-
【BZOJ 2007】 2007: [Noi2010]海拔 (平面图转对偶图+spfa)
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2504 Solved: 1195 Description YT市 ...
-
网络请求工具 cURL
网络请求工具 cURL 2017-08-16 cRUL 是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在“标准输出”(stdout)上面. 查看网页源码 1 $ curl baidu. ...