纪念我的第一个爬虫程序,一共写了三个白天,其中有两个上午没有看,中途遇到了各种奇怪的问题,伴随着他们的解决,对于一些基本的操作也弄清楚了。果然,对于这些东西的最号的学习方式,就是在使用中学习,通过解决问题的方式来搞定这些知识。按需索取,才能更有针对性。

大体记录下整个过程。
--------------------------------------------------------------------------------
准备构思
出于对于python的热爱,想要尝试一些练手的项目,但是不论是看书,还是直接尝试别人的项目,到最后都会沦为不停地复制粘贴...最实际的就是自己来上手亲自写代码。思路都是一样的,但是具体的实现还得靠自己。
以前的复制粘贴给我的帮助也就是告诉了我大致的流程。
确定目标网址
目标网址是关键。我梦想中的爬虫是那种偏向于更智能的,直接给他一个想要获取的关键词,一步步的流程直接自己完成,可以自己给定范围,也可以直接爬取整个互联网或者更实际的就是整个百度上的内容,但是,目前就我而言,见到的爬虫,都是给定目标网址,通过目标页面上的内容进一步执行规定的操作,所以现在来看,我们在写爬虫之前,需要确定一个基准页面,这个是需要我们事先制定的。在考虑我们需要程序完成怎样的功能,获取页面文本还是相关链接内容还是其他的目的。
我这个程序想要获取的是《剑来》小说,把各个章节的内容爬去下载存储到文件里。
编程只是实现目的的工具。
所以重点是分析我们的需求。
获取小说目录页面是基本。这里有各个章节的链接,标题等等内容。这是我们需要的。
有了各个章节的链接,就需要进入其中获得各个章节的内容。
所以,我们需要获得页面内容,需要从中获得目标内容。
所以使用 urllib.request,re 库。
前者用来获得网页内容,后者获得目标信息。
headers
直接使用urllib.request的urlopen(),read()方法是会报以下错误:
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) HTTPError: HTTP Error 403: Forbidden
出现urllib2.HTTPError: HTTP Error 403: Forbidden错误是由于网站禁止爬虫,可以在请求加上头信息,伪装成浏览器。
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0'}
request = url_req.Request(url, headers=headers)
response = url_req.urlopen(request, data=None, timeout=3)
html = response.read().decode('GBK')
注意:这里存在两个容易出问题的地方。
•编码:编码问题是使用爬虫中有时候会很头痛的问题,由于网页源代码编码格式不明确,所以这里尝试了许久。
使用chardet库的detect()方法可以检测字节字符串的编码。所以直接检测这里的html(先不要解码)。输出的是GB2312,但是在后面页面的爬取中,会出现提示有的字符的编码异常,所以这里采取了比其范围更广的中文字符集GBK,解决了这个问题。
•设置超时范围:由于频繁的获取网页内容,目标网站有时候会出现没有响应的问题。
(这个问题可以见我在CSDN上的提问:关于python爬虫程序中途停止的问题)
于是我采取了捕获 urlopen()的socket.timeout异常,并在出现异常的时候再循环访问,直到获得目标页面。
获得目标内容
这里使用的是正则表达式。re模块。这里的使用并不复杂。
首先需要一个模式字符串。以re.I指定忽略大小写,编译后的对象拥有本身匹配的方法,这里使用的是findall(),返回一个所有结果组成的列表。可以及时返回输出其内容,进而选择合适的部分进行处理。
python 正则表达式
通过查看相关的符号,这里使用(.+?)来实现匹配非贪婪模式(尽量少的)下任意无限字符,对之使用(),进而匹配括号内的模式。
文件写入
使用with open() as file:,进而可以处理文件。并且可以自动执行打开和关闭文件,更为便捷安全。
with open(findall_title[0] + '.txt', 'w+', encoding='utf-8') as open_file:
•这里也要注意编码的问题,指定utf-8。会避免一些问题。
•这里使用w+模式,追加写文件。
完整代码
# -*- coding: utf-8 -*-
"""
Created on Fri Aug 11 16:31:42 2017
@author: lart
"""
import urllib.request as url_req
import re, socket, time
def r_o_html(url):
print('r_o_html begin')
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0'}
request = url_req.Request(url, headers=headers)
NET_STATUS = False
while not NET_STATUS:
try:
response = url_req.urlopen(request, data=None, timeout=3)
html = response.read().decode('GBK')
print('NET_STATUS is good')
print('r_o_html end')
return html
except socket.timeout:
print('NET_STATUS is not good')
NET_STATUS = False
def re_findall(re_string, operation, html):
print('re_findall begin')
pattern = re.compile(re_string, re.I)
if operation == 'findall':
result = pattern.findall(html)
else:
print('this operation is invalid')
exit(-1)
print('re_findall end')
return result
if __name__ == '__main__':
url_base = 'http://www.7kankan.la/book/1/'
html = r_o_html(url_base)
findall_title = re_findall(r'<title>(.+?)</title>', 'findall', html)
findall_chapter = re_findall(r'<dd class="col-md-3"><a href=[\',"](.+?)[\',"] title=[\',"](.+?)[\',"]>', 'findall', html)
with open(findall_title[0] + '.txt', 'w+', encoding='utf-8') as open_file:
print('article文件打开', findall_chapter)
for i in range(len(findall_chapter)):
print('第' + str(i) + '章')
open_file.write('\n\n\t' + findall_chapter[i][1] + '\n --------------------------------------------------------------------- \n')
url_chapter = url_base + findall_chapter[i][0]
html_chapter = r_o_html(url_chapter)
findall_article = re_findall(r' (.+?)<br />', 'findall', html_chapter)
findall_article_next = findall_chapter[i][0].replace('.html', '_2.html')
url_nextchapter = url_base + findall_article_next
html_nextchapter = r_o_html(url_nextchapter)
if html_nextchapter:
findall_article.extend(re_findall(r' (.+?)<br />', 'findall', html_nextchapter))
for text in findall_article:
open_file.write(text + '\n')
time.sleep(1)
print('文件写入完毕')
# python爬虫爬小说
# python
# 爬虫抓取小说
# 小说爬虫
# 编写Python脚本抓取网络小说来制作自己的阅读器
# Python实现的爬取小说爬虫功能示例
# Python制作爬虫采集小说
# 简单的抓取淘宝图片的Python爬虫
# 零基础写python爬虫之抓取糗事百科代码分享
# 实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
# Python制作爬虫抓取美女图
# 编写Python爬虫抓取暴走漫画上gif图片的实例分享
# Python爬虫之网页图片抓取的方法
# python实现爬虫抓取小说功能示例【抓取金庸小说】
# 关键词
# 的是
# 这个问题
# 会报
# 中途
# 都是
# 这是
# 他们的
# 互联网
# 第一个
# 也要
# 给他
# 中有
# 其他的
# 并在
# 更有
# 问题是
# 可以直接
# 写了
# 正则表达式
相关文章:
建站主机功能解析:服务器选择与快速搭建指南
建站之星安装失败:服务器环境不兼容?
网站制作的步骤包括,正确网址格式怎么写?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
C++时间戳转换成日期时间的步骤和示例代码
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
名字制作网站免费,所有小说网站的名字?
如何安全更换建站之星模板并保留数据?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
网站制作软件有哪些,制图软件有哪些?
,怎么用自己头像做动态表情包?
如何选择高效可靠的多用户建站源码资源?
如何选择域名并搭建高效网站?
如何用虚拟主机快速搭建网站?详细步骤解析
建站之星后台密码遗忘或太弱?如何重置与强化?
大同网页,大同瑞慈医院官网?
如何快速选择适合个人网站的云服务器配置?
如何通过建站之星自助学习解决操作问题?
上海网站制作开发公司,上海买房比较好的网站有哪些?
网站按钮制作软件,如何实现网页中按钮的自动点击?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
如何基于云服务器快速搭建个人网站?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
全景视频制作网站有哪些,全景图怎么做成网页?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
免费视频制作网站,更新又快又好的免费电影网站?
常州自助建站费用包含哪些项目?
长沙做网站要多少钱,长沙国安网络怎么样?
微信小程序 五星评分(包括半颗星评分)实例代码
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
如何正确选择百度移动适配建站域名?
如何在VPS电脑上快速搭建网站?
黑客如何利用漏洞与弱口令入侵网站服务器?
建站主机服务器选型指南与性能优化方案解析
香港服务器WordPress建站指南:SEO优化与高效部署策略
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
如何用y主机助手快速搭建网站?
ppt制作免费网站有哪些,ppt模板免费下载网站?
金*站制作公司有哪些,金华教育集团官网?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
,制作一个手机app网站要多少钱?
外贸公司网站制作哪家好,maersk船公司官网?
大型企业网站制作流程,做网站需要注册公司吗?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
*请认真填写需求信息,我们会在24小时内与您取得联系。