自己学习了大半年python,但是大部分时间在用Django搞web开发。今天忽然被boss cue到说给公司同事稍微讲讲python(公司主业为erp,使用python较少),带他们入门吧。
可我自己就是个刚入门的,还是半瓶子晃荡呢。但是我都答应了,那么就得想办法搞个demo来,起码给他们看看python的厉害之处吧,正发愁的时候,无意间打开了w3c的python3教程,看到了爬虫实战,我觉得这个应该可以引起一些人的兴趣,说不定就拐一个同事走上python的贼船呢。
之前我没有接触过任何的爬虫知识,搞了一下午后,跟着教程完成了这个程序。用很短的时间就可以自己实现一个小任务,这也是python一个很大的优点吧。
原文为W3C-python3教程-python3爬虫实战教程,第一个教程就是了。(原文的原文是本站的大佬Jack-Cui ~)仅为自己的结果展示,不用作任何用途。
当然了,直接copy大佬的程序肯定是不行滴,一是时间久远,笔趣看网站有了反爬机制了,在想爬就不是我现在这点三脚猫功夫能搞定的了,所以我换了无反爬的全书网 ;二是网站编码问题,不知道为什么大佬没遇到,但是我遇到了,解决方法学习自 这里。
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import sys
'''
类注释:爬取‘全书网’(http://www.quanshuwang.com/)小说《盗墓笔记》
input:none
return: none
author: wxy
last change: 2019/03/22
'''
class Downloader():
def __init__(self):
self.server = 'http://www.quanshuwang.com/'
self.target = 'http://www.quanshuwang.com/book/9/9055/'
self.header = {
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)',
}
self.names = [] #章节名
self.urls = [] #章节链接
self.nums = 0 #章节数
# 获取章节标题、下载链接
def get_download_url(self):
req = requests.get(url=self.target)
req.encoding = 'GBK'
html = req.text
div_bf = BeautifulSoup(html)
div = div_bf.find_all('div', class_='dirconone')
a_bf = BeautifulSoup(str(div[0]))
a = a_bf.find_all('a')
self.nums = len(a) # 统计章节数
for item in a: # 记录章节标题和url
self.names.append(item.string)
self.urls.append(item.get('href'))
# 获取章节内容:
# target:章节路径
def get_contents(self,target):
req = requests.get(url=target)
req.encoding = 'GBK'
html = req.text
bf = BeautifulSoup(html)
texts = bf.find_all('div', class_='mainContenr')
texts = texts[0].text
return texts
# 将爬取的内容写入本地文件
# name:章节名称
# path:当前路径下,小说文件名
# text:章节内容
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__':
header = {
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)',
}
# ##爬取单章
# target = 'http://www.quanshuwang.com/book/9/9055/9674263.html'
# req = requests.get(url=target,headers=header)
# req.encoding = 'GBK'
# html = req.text
# bf = BeautifulSoup(html)
# texts = bf.find_all('div', class_='mainContenr')
# print(texts[0].text)
# # 爬取目录页:
# target = 'http://www.quanshuwang.com/book/9/9055/'
# req = requests.get(url=target)
# req.encoding = 'GBK'
# html = req.text
# div_bf = BeautifulSoup(html)
# div = div_bf.find_all('div', class_='dirconone')
# print(div[0])
# # 提取目录url:
# target = 'http://www.quanshuwang.com/book/9/9055/'
# req = requests.get(url=target)
# req.encoding = 'GBK'
# html = req.text
# div_bf = BeautifulSoup(html)
# div = div_bf.find_all('div', class_='dirconone')
# a_bf = BeautifulSoup(str(div[0]))
# a = a_bf.find_all('a')
# for item in a:
# print(item.string,item.get('href'))
# 爬取整本:
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('《盗墓笔记》下载完成')