python是一门优秀的计算机编程语言,两年前曾因为动过自动化交易的念头而关注过它。前几天在微信上点了个python教学的广告,听了两堂课,所以现在又热心了起来,照葫芦画瓢写了一段简单的网络爬虫代码,感受了一番python的强大,和需要的朋友们分享一下。提醒注意的是,由于版权的原因,网络爬虫一定要注意道德和法律的风险,千万不要去做违法的事情,本代码仅用于交流和学习,不得用于商业谋利。为了版面简洁一些,逐条的注释放在文未了。
python开发环境的安装以及标准库的部署自己百度一下,哥也是一枚小小白,我们遇到的问题可能不一样,所以也指导不了你,反正网上有很多前辈大佬们的经验可以参考,聪明的你肯定能搞定!废话不多说,先把以下的代码抄写下来:
import requests,sys
from bs4 import BeautifulSoup
import time
import socket
以上源代码不解释,多抄几遍就知道了,呵呵呵……然后打开目标网页(本博文纯属交流学习,这个网页是随便找的一个不出名的小说站。),分析一下结构,这个需要有点HTML基础,实在不懂网上随便找个教程看看就行,看图:
我们现在要做的是把这篇名为《大主宰》的网络小说爬下来存储为一个TXT的文本,放到移动设备上阅读,当然我们可以一篇篇的打开复制粘贴,一千多章,呵呵,想想就脑壳疼。其实,python就是代替这种重复机械性工作的好工具。
用谷歌的Chrome,或者遨游浏览器什么的都可以,只要不是IE,按F12键打开如图所示的开发者模式,第一个红色框里是小说的名字,这个我们会用到。第二个红色框里是该小说章节列表,它被放在一个
target="https://xxxxxx.xxx/xxx/2788.html"
print('页面抓取中……')
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
mypath='D:\\TXT小说\\'
bookserver='https://www.xxx.xxx'
html=requests.get(target,headers=headers)
time.sleep(1)
html.encoding="GBK"
texts=BeautifulSoup(html.text,'lxml')
bookname=texts.find('h1').get_text()
booklinks=texts.find('div',class_='zjbox').find('dl',class_='zjlist').find_all('a')
booknum=len(booklinks)'
print('开始下载小说:《'+bookname+'》,共有 '+str(booknum)+' 章节。')'
上面的python网页爬虫源代码爬取了小说的名字,知道了有多少章节,以及每一章节的链接地址,下面用循环开始一章章的爬取小说内容,然后继续抄代码:
i=0
with open(mypath+bookname+'.txt','a+',encoding='GBK') as ok:
ok.write(bookname+'\n=====================================\n')
ok.close()
接下来是最主要的代码,爬取每一章节的内容页面,把小说内容抓下来,存入TXT文件。源代码和上面类似的地方我就不再一一注释了,另外,因为python有严格的缩进格式,以此来区分逻辑结构,但网页排版是可能会出现一些小的差异,直接复制的朋友注意修正。继续抄代码:
for zjlink in booklinks:
html2=requests.get(bookserver+zjlink['href'],headers=headers)
time.sleep(2)
html2.encoding='GBK'
texts2=BeautifulSoup(html2.text,'lxml')
mytext=texts2.find('div',id='content')
mytext=mytext.text.replace('\xa0'*4,'\n')
mytext=mytext.replace('\n\n','\n')
mytext=mytext.replace('X小说网 WWW.XX,最快更新'+bookname+'最新章节!','')
with open(mypath+bookname+'.txt','a+', encoding='GBK') as ok:
ok.write('-----------------------\n'+zjlink.string+'\n--------------------')
try:
ok.writelines(mytext)
ok.write('\n')
i+=1
sys.stdout.write("已下载:%.2f%%" % float(i/booknum*100) + '\r')
sys.stdout.flush()
#print(bookname+':'+zjlink.string+'下载完成!')
except:
ok.writelines(zjlink.string+'下载失败!')
ok.write('\n')
i+=1
sys.stdout.write("已下载:%.2f%%" % float(i/booknum*100) + '\r')
sys.stdout.flush()
print(bookname+':'+zjlink.string+'下载失败!XXXXXXXXXXX')
print('-------------------\n'+bookname+'下载完成!\n-----------------')
#注释:定义目标页面网址。
#注释:输出页面开始抓取的提示。
#注释:编造一个假的浏览器头部,欺骗目标网站,让它以为这是一个真实的访问。
#注释:该小说站的域名。
#注释:你下载小说的存储目录。
#注释:访问小说《大主宰》的目录页面,把其内容加载给变量html。
#注释:休息一秒钟,第一,给点时间加载内容,第二,不间断的访问容易被反爬。
#注释:设置编码为GBK中文,这个一般以源网页为准。
#注释:按LXML规则编译网页内容并存入变量texts。
#注释:从texts里找第一个
标签,并获取里面的内容,这个就是小说的名字了。
#注释:从texts里找第一个
#注释:获取这个数组的个数,也即该小说有多少章节。
#注释:输出。
#注释:定义一个变量,用于下面的循环计数。
#注释:在你的存储目录下生成一个以小说名命名的TXT文件,以追加方式写入,编码GBK。
#注释:在TXT文本里写入小说的名字,换行再写一排等号分割,再换行。
#注释:先关闭这个TXT文件。
#注释:我们之前把小说章节的所有链接地址存入了booklinks这个变量里,现在我把这些链接一个一个地取出来,每取出一个就打开一个,打开一个就爬取该章节的内容,追加存入TXT里,zjlink['href']就是小说章节的链接地址。
#注释:休息两秒钟,指定编码,获取页面。
#注释:mytext=texts2.find('div',id='content')这句与上边一样,就是从章节内容也里面看小说内容是放在哪个容器里的。
#注释:mytext=mytext.text.replace('\xa0'*4,'\n')把连续的四个空格转换为一个换行符。下边两句也是一样的功能,就是把内容页面一些特殊的东西转化一下,比如删除一些与内容无关的广告词等等,使之在TXT里正常显示。
#注释:打开TXT文件,一章章地写入,爬完一章,换行,显示爬取进度。
#注释:因为一些特殊原因,比如非GBK编码等导致写入失败,显示下载失败,跳过错误继续爬取下一章,全部章节爬取完成后输出成功提示。
终于弄完了,好累,一句句的注释,都是为了照顾白生生的朋友们啊,排版也很丑,下次的python源代码直接上了,有看不明白的朋友留言吧,我再解释。