Python学习(2) — 报错的代码
出差了几天,回来继续撸代码,这次必须要坚持下来,从实战出发的好处就是每次小项目成功都会由一份小激动,不过今天的学习并不顺利,想来前两次的学习都不算顺利,上次也是因为运行的目录问题折腾了好久都没搞定,这次是按照教程代码敲出来的代码总是报错,反复修改后仍然是报错的,这其中也修正了很多问题,除了一些写代码的生疏导致的意外错误之外,一些基本功的问题也开始暴露出来,不过好消息是之前系统学习的python课程也回忆起来了一部分了,在屡次尝试运行都报错,并且反复检查没有问题之后,不得以复制教程代码另建了一个py文件运行,结果非常尴尬地也报错了,想来今天估计也就暂时只能接受这个报错地代码了。
Code
# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests, sys
"""
download biquge novel
Modify:
2019-03-26
"""
class downloader(object):
def __init__(self):
self.server = 'http://www.biqukan.com/'
self.target = 'http://www.biqukan.com/1_1094/'
self.names = [] #Storage chapter names
self.urls = [] #Storage chapter urls
self.nums = 0 #Storage chapter nums
"""
Function: get the download urls
Parameters:
None
Returns:
None
Modify:
2019-03-26
"""
def get_download_url(self):
req = requests.get(url = self.target)
html = req.text
div_bf = BeautifulSoup(html)
div = div_bf.find_all('div', class_ = 'listmain')
a_bf = BeautifulSoup(str(div[0]))
a = a_bf.find_all('a')
self.nums = len(a[15:]) #del the unnecessary
for each in a[15:]:
self.names.append(each.string)
self.urls.append(self.server + each.get('href'))
"""
Function:get the chapter content
Parameters:
target - Download link(string)
Returns:
texts - Chapters content(string)
Modify:
2019-03-26
"""
def get_content(self, target):
req = requests.get(url = target)
html = req.text
bf = BeautifulSoup(html)
texts = bf.find_all('div', class_ = 'showtxt')
text = texts[0].text.replace('\xa0'*8,'\n\n')
return texts
"""
Funtions:rewrite the content into file
Parameters:
name - chapter name(string)
path - string
text - chapter content(string)
Returns:
none
Modify:
2019-03-26
"""
def writer(self, name, path, text):
write_flag = True
with open(path, 'a', encoding='utf-8') as f:
f.write(name + '\n')
f.writelines(text)
f.write('\n\n')
if __name__ == "__main__":
dl = downloader()
dl.get_download_url()
print('《一年永恒》开始下载:')
for i in range(dl,nums):
dl.writer(dl.names[i], '一念永恒.txt', dl.get_contents(dl.urls[i]))
sys.stdout.write(" 已下载:%.3f%%" % float(i/dl.nums) + '\r')
sys.stdout.flush()
print('《一年永恒》下载完成')
Note
1、 缩进
很关键,Python是一个非常注重书写习惯地代码语言,之前自己写 HTML+CSS
走地野路子,养成了不规范写代码地习惯,包括缩进和备注等这些,不过缩进在这些网页样式上是不存在任何实际意义的,除了代码的美观度之外,不过最开始报错 Undefined
就让我比较诧异,最终经过几番折腾才意识到可能是因为对齐的原因,python代码里的对齐是具有包含属性的,这也就是为什么我明明在前面定义了函数后面仍然显示未定义的原因。包括后面复制教程代码都因为全代码缩进一个 TAB
而报错 Unexpected Indent
。
2、同样一份爬虫代码运行起来可能结果会由不同,比如我修改缩进后就首先出现了 python内部错误
,错误文件指向了python安装目录,在比较困惑的未改动代码的前提下再次运行了一次,之前显示的内部错误就不复存在了,当然出现了另外一个错误 IndexError: List index out of range
,看上去问题可能处在列表抓取这块,明天花点实际继续研究一下,直接再将项目拆解开来,看看问题出在哪个环节。
3、虽然最终没有下载成功,不过从目前单线程的下载情况来看,效率是非常低的,考虑到后续的多线程和反爬虫技巧,python爬虫
这块的学习任务还是比较大的,也许还是应了那句话,python语言入门容易,精通并不容易;即使还只是其中非常小的一个分支应用领域。