今天刚完成老师的作业,没有事情做,然后就来写一篇博客。这次我们来聊一聊如何爬取一部小说(因为我是初学者,现在就会爬取静态网站,对于大型网站,我还是有点困难的)
正如我们前一篇博客所讲到的爬虫的基本框架
import request def gtehtml(url): try: response = requests.get(url) response.raise_for_status() response.encoding = response.apparent_encoding return response.text except: return "爬取失败" if __name__ == "__main__": url = "http://www.baidu.com" page = gethtml(url) print(page)
关于这个框架的解释请大家看我的上一篇博客
接下来我们要爬取的网站是:
http://www.bjkgjlu.com
我随便从网上找的一个小说网站,我感觉挺好爬的,毕竟刚刚会一点爬虫,就先找简单的网站练练手
程序的具体思路如下:
1:选择一部小说,找到这部小说的目录,利用爬虫把所有的章节的来链接保存下来,并且把每一个章节的名字也保存下来,这样有利于爬取下来的文字存入文件时的命名.
2:做完上面一步,然后就是根据上面保存的每一项章节的链接,爬取每一章节的内容,然后就是把章节存入文件.
然后要查看网页的源代码
这一部分参考代码(大家有什么好的方法可以给我留言,谢谢!)
url = "http://www.bjkgjlu.com/303618kyi/catalog" zhangjie_name_list = []#每一章的名字 zhangjie_url_list = []#每一章的url地址 html = gethtml(url) soup = bs4.BeautifulSoup(html,"html.parser") #获取每一章的链接并提取name和url for i in soup.findAll("div",attrs={"class":"col-xs-120 col-sm-60 col-md-40 col-lg-30"}): for j in i.children: zhangjie_name_list.append(j.text) zhangjie_url_list.append(j.get("href")) print(len(zhangjie_name_list)) for j in range(len(zhangjie_name_list)): zhangjie(zhangjie_url_list[j],zhangjie_name_list[j])
当我们把这些链接和章节名称爬取下来之后,就开始我们的最后一步了,爬取每一章节的内容,并清洗数据,数据清洗我认为是最爬虫比较难的难的部分,要找到对应的文字所在的标签和要考虑一些编码的问题。
接下来看每一章节的网页的源代码:
这样只要把所有的爬下来的内容分别存入对应的文件就行了
最后给出全部的代码
import requests
import bs4
import json
#获取网页代码
def gethtml(url):
try:
response = requests.get(url)
response.raise_for_status()
response.encoding = response.apparent_encoding
return response.text
except:
return "爬取失败"
#提取每一页中的文字并存入文件
def zhangjie(url,name):
html = gethtml("http://www.bjkgjlu.com" + url)
soup = bs4.BeautifulSoup(html,"html.parser")
for i in soup.findAll("div", attrs={"class": "chapter_content"}):
with open(name+".txt","wb") as f:
f.write(i.text.split("<")[0].encode("utf-8"))
print(name+"爬取结束,并存入文件")
if __name__=="__main__":
url = "http://www.bjkgjlu.com/303618kyi/catalog"
zhangjie_name_list = []#每一章的名字
zhangjie_url_list = []#每一章的url地址
html = gethtml(url)
soup = bs4.BeautifulSoup(html,"html.parser")
#获取每一章的链接并提取name和url
for i in soup.findAll("div",attrs={"class":"col-xs-120 col-sm-60 col-md-40 col-lg-30"}):
for j in i.children:
zhangjie_name_list.append(j.text)
zhangjie_url_list.append(j.get("href"))
print(len(zhangjie_name_list))
for j in range(len(zhangjie_name_list)):
zhangjie(zhangjie_url_list[j],zhangjie_name_list[j])
好了,今天就到这了,谢谢!