user_agent [
Mozilla/5.0 (compatible; Baiduspider/2.0; http://www.baidu.com/search/spider.html) ,
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727) ,
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506) ,
Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) ,
Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US) ,
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0) ,
Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322) ,
Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30) ,
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30) ,
Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527 (KHTML, like Gecko, Safari/419.3) Arora/0.6 ,
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1 ,
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0 ,
Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5 ,
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6 ,
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11 ,
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20 ,
Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52 ]
url info_get.x
book_name info_get.y
r requests.get(url url,
headers headers,
timeout 20)
r.encoding r.apparent_encoding
html etree.HTML(r.text)
# 解析章节
li_list html.xpath( //*[ id list ]/dl//a/ href )[9:]
print( 共计 str(len(li_list)) 章 )
a,用于计数 成功请求到html并完成后续的存写数据才会继续请求下一个url
b,在循环中存放未经过信息返回存储判断的a 用于与下一次循环的a作比较 判断a是否有变化
c,若超过10次b a c会自增 则说明应该跳过此章节 同时d减一
d,章节长度
d len(li_list)
try:
path info_get.z
fp open(path / str(book_name) .txt , w , encoding utf-8 )
except:
fp open( ./ str(book_name) .txt , w , encoding utf-8 )
#这里循环了20倍次数的章节 防止无法爬取完所有的信息。
for i in range(20*len(li_list)):
url li_list[a]
#判断使用http还是https
if url[4:5] s :
proxies random.choice(ip_list[0])
else:
proxies random.choice(ip_list[1])
try:
r requests.get(url url,
headers { User-Agent : random.choice(user_agent)},
proxies proxies,
timeout 5
r.encoding r.apparent_encoding
r_text r.text
html etree.HTML(r_text)
try:
title html.xpath( /html/body/div/div/div/div/h1/text() )[0]
except:
title html.xpath( /html/body/div/div/div/div/h1/text() )
text html.xpath( //*[ id content ]/p/text() )
text1 []
for i in text:
text1.append(i[2:])
使用变量b来存放未变化的a 若下次循环b与a相等 说明此次请求没有成功 c 因为某些页面本身存在错误没有数据 则需要跳过。
若c大于10 说明超过十次的请求,都因为一些缘由失败了 则a 跳过这一章节 同时变量d减一 避免后续跳出循环时出现索引错误
if b a:
if c 10:
#a 1 跳到下一个url 若没有取出信息则a-1.再次请求,若有数据返回则保存
if len(text1) 0:
a- 1
else:
fp.write( 第 str(a) 章 str(title) :n t str( , .join(text1) nn ))
#print( 《 str(title) 》 , 下载成功 )
#print( 进度: str(int(100 * (a / d))) % )
root.update()
var3.set( 下载进度: str(int(100 * (a / d))) % )
l8 tk.Label(root, fg red , font 12, width 10, height 2, textvariable var3)
l8.place(x 5, y 320)
r.close()
except EnvironmentError as e:
pass
# a是作为索引在li_list中取出对应的url 所以最后a的值等于li_list长度-1 并以此为判断标准是否跳出循环。
if a d:
break
print(book_name 下载完成 )
var4.set(book_name 下载完成 )
fp.close()
def selectPath():
path_ askdirectory()
info_get.z path_