Python 爬虫 之 阅读呼叫转移(三)
尽管上一篇博客中我们能够连续地阅读章节了,可是。难道每一次看小说都执行一下我们的 Python 程序?连记录看到哪里都不行,每次都是又一次来过?当然不能这样,改!
如今这么多小说阅读器,我们仅仅须要把我们要的小说抓取到本地的 txt 文件中就好了,然后自己选个阅读器看。怎么整都看你了。
事实上上个程序我们已经完毕了大部分逻辑,我们接下来的修改仅仅须要把抓取到每一章的时候不用显示出来,而是存入 txt 文件之中。另外一个是程序是不断地依据下一页的 Url 进行抓取的,那么什么时候结束呢?注意当到达小说的最后一章时下一页的链接是和返回文件夹的链接是一样的。所以我们抓取一个网页的时候就把这两个链接拿出来,仅仅要出现两个链接一样的时候。就停止抓取。最后就是我们这个程序不须要多线程了,我们仅仅要一个不断在抓取小说页面的线程即可了。
只是,小说章节多一点时候,等待完毕的时间会有点久。眼下就不考虑这么多了,基本功能完毕就 OK....
基础知识:前面的基础知识 - 多线程知识 + 文件操作知识。
源码:
# -*- coding:utf-8 -*- import urllib2
import urllib
import re
import thread
import chardet class Book_Spider: def __init__(self):
self.pages = []
self.page = 1
self.flag = True
self.url = "http://www.quanben.com/xiaoshuo/0/910/59302.html" # 将抓取一个章节
def GetPage(self):
myUrl = self.url
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
req = urllib2.Request(myUrl, headers = headers)
myResponse = urllib2.urlopen(req)
myPage = myResponse.read() charset = chardet.detect(myPage)
charset = charset['encoding']
if charset == 'utf-8' or charset == 'UTF-8':
myPage = myPage
else:
myPage = myPage.decode('gb2312','ignore').encode('utf-8')
unicodePage = myPage.decode("utf-8") # 找出 id="content"的div标记
try:
#抓取标题
my_title = re.search('<h1>(.*? )</h1>',unicodePage,re.S)
my_title = my_title.group(1)
except:
print '标题 HTML 变化。请又一次分析!'
return False try:
#抓取章节内容
my_content = re.search('<div.*? id="htmlContent" class="contentbox">(.*?)<div',unicodePage,re.S)
my_content = my_content.group(1)
except:
print "内容 HTML 变化,请又一次分析。"
return False my_content = my_content.replace("<br />","\n")
my_content = my_content.replace(" "," ") #用字典存储一章的标题和内容
onePage = {'title':my_title,'content':my_content} try:
#找到页面下方的连接区域
foot_link = re.search('<div.*?class="chapter_Turnpage">(.*?)</div>',unicodePage,re.S)
foot_link = foot_link.group(1)
#在连接的区域找下一页的连接,依据网页特点为第三个
nextUrl = re.findall(u'<a.*?href="(.*? )".*?>(.*?)</a>',foot_link,re.S)
#文件夹链接
dir_url = nextUrl[1][0]
nextUrl = nextUrl[2][0]
# 更新下一次进行抓取的链接
self.url = nextUrl if(dir_url == nextUrl):
self.flag = False return onePage
except:
print "底部链接变化。请又一次分析!"
return False # 用于载入章节
def downloadPage(self): f_txt = open(u"斗罗大陆.txt",'w+')
while self.flag:
try:
# 获取新的页面
myPage = self.GetPage() if myPage == False:
print '抓取失败! '
self.flag = False title = myPage['title'].encode('utf-8')
content = myPage['content'].encode('utf-8') f_txt.write(title + '\n\n')
f_txt.write(content)
f_txt.write('\n\n\n') print "已下载 ",myPage['title'] except:
print '无法连接server!'
self.flag = False f_txt.close() def Start(self):
print u'開始下载......\n' self.downloadPage() print u"下载完毕" #----------- 程序的入口处 -----------
print u"""
---------------------------------------
程序:阅读呼叫转移
版本号:0.3
作者:angryrookie
日期:2014-07-08
语言:Python 2.7
功能:按下回车開始下载
---------------------------------------
""" print u'请按下回车:'
raw_input(' ')
myBook = Book_Spider()
myBook.Start()
效果见图:
Python 爬虫 之 阅读呼叫转移(三)的更多相关文章
- Python 爬虫 之 阅读呼叫转移(一)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/jcjc918/article/details/37533073 你是否苦恼于网上无法下载的& ...
- Python爬虫框架Scrapy实例(三)数据存储到MongoDB
Python爬虫框架Scrapy实例(三)数据存储到MongoDB任务目标:爬取豆瓣电影top250,将数据存储到MongoDB中. items.py文件复制代码# -*- coding: utf-8 ...
- python爬虫之urllib库(三)
python爬虫之urllib库(三) urllib库 访问网页都是通过HTTP协议进行的,而HTTP协议是一种无状态的协议,即记不住来者何人.举个栗子,天猫上买东西,需要先登录天猫账号进入主页,再去 ...
- Python爬虫学习笔记——豆瓣登陆(三)
之前是不会想到登陆一个豆瓣会需要写三次博客,修改三次代码的. 本来昨天上午之前的代码用的挺好的,下午时候,我重新注册了一个号,怕豆瓣大号被封,想用小号爬,然后就开始出问题了,发现无法模拟登陆豆瓣了,开 ...
- python爬虫解析页面数据的三种方式
re模块 re.S表示匹配单行 re.M表示匹配多行 使用re模块提取图片url,下载所有糗事百科中的图片 普通版 import requests import re import os if not ...
- python爬虫-提取网页数据的三种武器
常用的提取网页数据的工具有三种xpath.css选择器.正则表达式 1.xpath 1.1在python中使用xpath必须要下载lxml模块: lxml官方文档 :https://lxml.de/i ...
- Python爬虫与一汽项目【三】爬取中国五矿集团采购平台
网站地址:http://ec.mcc.com.cn/b2b/web/two/indexinfoAction.do?actionType=showMoreCgxx&xxposition=cgxx ...
- Python 爬虫js加密破解(三) 百度翻译 sign
第一步: 模拟抓包分析加密参数 第二步: 找到加密字段 调试出来的sign和抓取得到的数据一致,都是 275626.55195 第三部: 分析js加密方法 第四部:运行js代码: 仅供交流学习使用
- Python爬虫个人记录(三)爬取妹子图
这此教程可能会比较简洁,具体细节可参考我的第一篇教程: Python爬虫个人记录(一)豆瓣250 Python爬虫个人记录(二)fishc爬虫 一.目的分析 获取煎蛋妹子图并下载 http://jan ...
随机推荐
- 深入理解Java引用类型
深入理解Java引用类型 在Java中类型可分为两大类:值类型与引用类型.值类型就是基本数据类型(如int ,double 等),而引用类型,是指除了基本的变量类型之外的所有类型(如通过 class ...
- CF614A【签到题】
题目链接[http://codeforces.com/problemset/problem/614/A] 题意:输入三个数l.r.k(1 ≤ l ≤ r ≤ 1018, 2 ≤ k ≤ 109),输出 ...
- PHP 笔记——PDO操作数据库
一.简介 PHP 5.1可使用轻量级的统一接口 PDO(PHP Data Object,PHP数据对象)来访问各种常见的数据库.而使用PDO只需要指定不同的 DSN(数据源名称)即可访问不同的数据 ...
- codevs 1044 拦截导弹 1999年NOIP全国联赛提高组
1044 拦截导弹 1999年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 某国为 ...
- [BZOJ4870][六省联考2017]组合数问题(组合数动规)
4870: [Shoi2017]组合数问题 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 748 Solved: 398[Submit][Statu ...
- 【四边形不等式】POJ1160[IOI2000]-Post Office
[题目大意] v个村庄p个邮局,邮局在村庄里,给出村庄的位置,求每个村庄到最近邮局距离之和的最小值. [思路] 四边形不等式,虽然我并不会证明:( dp[i][j]表示前i个村庄建j个邮局的最小值,w ...
- 【四边形不等式】noi95- 合并石子
[题目大意] 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分.试设计出1个算法,计算出将N堆石子合并成 ...
- bzoj 3172
收获:AC自动机定数组大小时,如果不确定,就定10^6(极限了) /************************************************************** Pro ...
- 密码加密_md5
md5加密 package com.fh.util; import java.security.MessageDigest; public class MD5 { public static Stri ...
- hdu 4111 Alice and Bob 记忆化搜索 博弈论
Alice and Bob Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...