本章学习内容:
1、网页编码还原读取
2、功能设计
stuep1:网页编码还原读取
本次抓取对象:
http://www.cuiweijuxs.com/jingpinxiaoshuo/

按照第一篇的代码来进行抓取:
# -*- coding: UTF-8 -*-
from urllib import request if __name__ == "__main__":
chaper_url = "http://www.cuiweijuxs.com/jingpinxiaoshuo/"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req = request.Request(url=chaper_url, headers=headers)
response = request.urlopen(req)
html = response.read()
print(html)

  打印出

b'<!doctype html>\r\n<html>\r\n<head>\r\n<title>\xbe\xab\xc6\xb7\xd0\xa1\xcb\xb5_………………

这样的内容,这个是编码格式的问题,在zipfile解压乱码的文章中已经说过了,所以需要先看下这个html网页的头部,看到编码格式是gbk

具体看http://www.cnblogs.com/yaoshen/p/8671344.html

另外一种程序检测方法是使用chardet(非原生库,需要安装),

charset = chardet.detect(html)
print(charset)
检测内容:{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}

如果使用GB2312来解码是有问题的,尝试过后发现还是gbk比较有效,包含字符多一点

改写代码如下:

    html = html.decode('GBK')
#except:
# html = html.decode('utf-8')
print(html)

完整代码如下:

# -*- coding: UTF-8 -*-
from urllib import request
import chardet if __name__ == "__main__":
chaper_url = "http://www.cuiweijuxs.com/jingpinxiaoshuo/"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req = request.Request(url=chaper_url, headers=headers)
response = request.urlopen(req)
html = response.read()
print(html) # 查看网页编码格式
charset = chardet.detect(html)
print(charset) # 查看网页内容
#try:
html = html.decode('GBK')
#except:
# html = html.decode('utf-8')
print(html)

stuep2:基础功能设计

建立class:Capture,定义初始化(__init__)、读取(readHtml)、保存(saveHtml)等基础功能函数,然后创建一个run函数来集成运行功能,
最后使用Capture().run()来运行
(1) __init__方法(双下划线),初始化参数
    def __init__(self):
# 定义抓取网址
self.init_url = 'http://www.cuiweijuxs.com/jingpinxiaoshuo/'
# 定义headers
self.head = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'}

 (2)将读取网页包装为一个方法,并返回解析后等html对象

    def readHtml(self):
# 以CSDN为例,CSDN不更改User Agent是无法访问的
# 创建Request对象
print(self.init_url)
req = request.Request(self.init_url, headers=self.head)
# 传入创建好的Request对象
response = request.urlopen(req)
# 读取响应信息并解码
html = response.read().decode('GBK')
# 打印信息
print(html)
return html

(3)将读取的网页以utf-8的方式写入到文件中

    def saveHtml(self, file_name, file_content):
file_object = open(file_name, 'w', encoding='utf-8')
file_object.write(file_content)
file_object.close()

(4)调用run方法,读取网页,再保存

    def run(self):
try:
html = self.readHtml()
self.saveHtml('test.html', html)
except BaseException as error:
print(error) Capture().run()

完整代码如下:

 # -*- coding: UTF-8 -*-
from urllib import request class Capture: def __init__(self):
# 定义抓取网址
self.init_url = 'http://www.cuiweijuxs.com/jingpinxiaoshuo/'
# 定义headers
self.head = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'} def readHtml(self):
# 以CSDN为例,CSDN不更改User Agent是无法访问的
# 创建Request对象
print(self.init_url)
req = request.Request(self.init_url, headers=self.head)
# 传入创建好的Request对象
response = request.urlopen(req)
# 读取响应信息并解码
html = response.read().decode('GBK')
# 打印信息
print(html)
return html def saveHtml(self, file_name, file_content):
file_object = open(file_name, 'w', encoding='utf-8')
file_object.write(file_content)
file_object.close() def run(self):
try:
html = self.readHtml()
self.saveHtml('test.html', html)
except BaseException as error:
print(error) Capture().run()
												

python3+beautifulSoup4.6抓取某网站小说(二)基础功能设计的更多相关文章

  1. python3+beautifulSoup4.6抓取某网站小说(四)多线程抓取

    上一篇多文章,是二级目录,根目录"小说",二级目录"作品名称",之后就是小说文件. 本篇改造了部分代码,将目录设置为根目录->作者目录->作品目录- ...

  2. python3+beautifulSoup4.6抓取某网站小说(三)网页分析,BeautifulSoup解析

    本章学习内容:将网站上的小说都爬下来,存储到本地. 目标网站:www.cuiweijuxs.com 分析页面,发现一共4步:从主页进入分版打开分页列表.打开分页下所有链接.打开作品页面.打开单章内容. ...

  3. python3+beautifulSoup4.6抓取某网站小说(一)爬虫初探

    本次学习重点: 1.使用urllib的request进行网页请求,获取当前url整版网页内容 2.对于多级抓取,先想好抓取思路,再动手 3.BeautifulSoup获取html网页中的指定内容 4. ...

  4. Python3.x+Fiddler抓取APP数据

    随着移动互联网的市场份额逐步扩大,手机APP已经占据我们的生活,以往的数据分析都借助于爬虫爬取网页数据进行分析,但是新兴的产品有的只有APP,并没有网页端这对于想要提取数据的我们就遇到了些问题,本章以 ...

  5. Python3.x:抓取百事糗科段子

    Python3.x:抓取百事糗科段子 实现代码: #Python3.6 获取糗事百科的段子 import urllib.request #导入各类要用到的包 import urllib import ...

  6. Python多进程方式抓取基金网站内容的方法分析

    因为进程也不是越多越好,我们计划分3个进程执行.意思就是 :把总共要抓取的28页分成三部分. 怎么分呢? # 初始range r = range(1,29) # 步长 step = 10 myList ...

  7. 使用BurpSuite抓取HTTPS网站的数据包

    昨天面试,技术官问到了我如何使用BurpSuite抓取https网站的数据包,一时间没能回答上来(尴尬!).因为以前https网站的数据包我都是用Fiddler抓取的,Fiddlert自动帮我们配置好 ...

  8. Python3利用BeautifulSoup4批量抓取站点图片的代码

    边学边写代码,记录下来.这段代码用于批量抓取主站下所有子网页中符合特定尺寸要求的的图片文件,支持中断. 原理很简单:使用BeautifulSoup4分析网页,获取网页<a/>和<im ...

  9. 用python抓取求职网站信息

    本次抓取的是智联招聘网站搜索“数据分析师”之后的信息. python版本: python3.5. 我用的主要package是 Beautifulsoup + Requests+csv 另外,我将招聘内 ...

随机推荐

  1. bzoj1861 [Zjoi2006]Book 书架——splay

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1861 发现自己想splay的时候总是纠结那个点权是什么,因为splay原本是二分查找树... ...

  2. .NETFramework-Drawing:Font

    ylbtech-.NETFramework-Drawing:Font 1.返回顶部 1. #region 程序集 System.Drawing, Version=4.0.0.0, Culture=ne ...

  3. STM32:获取复位源,软件复位

    RCC CSR寄存器会存储复位标示,可通过它来知道复位原因,来源: if(RCC_GetFlagStatus(RCC_FLAG_PINRST)) printf("PINRST\r\n&quo ...

  4. Identity 使用的命名空间

    必须在视图或控制器类中引用 了using Microsoft.AspNet.Identity 这个命名空间. using Microsoft.AspNet.Identity; 才能使用它User.Id ...

  5. PCB CAM自动化后台配置说明

    CAM自动化项目经历9个月时间里,在我们IT团队与工程部深入合作下,依据PCB各种场景定制特定功能,且这几个月里在不断的改进与迭代脚本功能,在此期间攻破了一个又一个难题,最终项目第一阶段已顺立上线运行 ...

  6. 洛谷 P4552 [Poetize6] IncDec Sequence【差分+脑洞】

    一看区间操作,很容易想到差分 所以就是先差分,然后为了保证最小步数,把政府差分抵消,也就相当于原数组区间加减 第二问,因为差分数组抵消之后不为0就需要使用n+1的虚拟位置,而这个的值其实没有,所以我们 ...

  7. bzoj 3979: [WF2012]infiltration【瞎搞+随机化】

    参考:https://www.cnblogs.com/ccz181078/p/5622200.html 非常服气.jpg 就是random_shuffle几次然后顺着找,ans取min... #inc ...

  8. 进击的Python【第十三章】:Web前端基础之HTML与CSS样式

    进击的Python[第十四章]:Web前端基础之HTML与CSS样式 一.web框架的本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客 ...

  9. [BZOJ3245]最快路线

    Description 精明的小R每每开车出行总是喜欢走最快路线,而不是最短路线.很明显,每条道路的限速是小R需要考虑的关键问题.不过有一些限速标志丢失了,于是小R将不知道能开多快.不过有一个合理的方 ...

  10. VS2010中使用命令行参数 分类: c/c++ 2014-07-11 22:24 634人阅读 评论(0) 收藏

    在Linux下编程习惯了使用命令行参数,故使用VS2010时也尝试了一下. 新建项目,c++编写程序如下: #include<iostream> #include<fstream&g ...