系列文章目录
python爬虫系列:Xpath下载图片讲解(零基础向)传送门
python爬虫系列:requests下载音乐讲解(零基础向)(正在筹划)
目录
目录
先放上代码
import requests #引入request库
from bs4 import BeautifulSoup
###以笔趣阁《圣域》为目标的爬取
url = "https://www.xbiquge.la/13/13959/"
#UA伪装 让浏览器识别为用户而非爬虫
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
#通过F12来查看是get还是post等
page_res = requests.get(url,headers=headers).text.encode("ISO-8859-1")
#lxml 需要用pip来安装 lxml是关于python的BeautifSoup的解释器
soup = BeautifulSoup(page_res,"lxml") #这是使用的浏览器的源代码,也可使用本地的上传
list = soup.select(".box_con dl dd ") #一步一步拿到url 和 名称,这个时候还没有转码
f = open("./xs.text","w",encoding="utf-8") #关于文件操作可以去这个网站看https://www.liaoxuefeng.com/wiki/1016959663602400/1017607179232640
#再通过循环获取全部章节的url
for li in list :
title = li.a.string
title_url = "https://www.xbiquge.la"+li.a["href"] #主要分析目录的url和点击章节后章节的url li.a["href"]就是获取<a>之间的href的
title_url_text = requests.get(url=title_url,headers=headers).text.encode("ISO-8859-1")
title_pupli = BeautifulSoup(title_url_text,"lxml")
title_text = title_pupli.find("div",id="content")
content = title_text.text
f.write(title+":"+content+"\n")
print(title,"爬取成功......")
第一步:思路
希望大家可以来我的博客网站,这样大家可以第一时间获取我的爬虫代码等,我也会及时在博客网站进行技术分享:个人博客 (ximenxiaoxue.github.io)
个人博客中对代码进行了修改,并且使用了多线程,推荐大家去我的个人博客(绝对免费),而且进行了优化,许多不能发的东西也都在博客中
做任何事情前都应该有一个清晰的思路思路(我做什么都没思路,不过思路是最重要的)。
- 首先,要明确自己要干什么。(我们的任务是爬取一部小说)
- 其次,分析你所要做的事情。(我们要爬取整步小说,要获取全部章节的url和网页的内容,并保存下来)
- 最后,进行我们所要做的事
第二步:代码
通过使用pip来进行安装,除了bs4以外还要安装它的解释器lxml,这两个东西要同时用到。
我相信你们应该安装了requests(来自萌新的肯定)。
pip install beautifulsoup4
pip install lxml
pip install requests
接下来通过F12进入开发者工具(应该是,不过感觉记错了)进行页面分析。
这样就可以看见我们需要什么来进行爬取,网页允许我们使用get来请求。headers这个东西可以进行UA伪装,让浏览器判定我们的爬虫是个用户,而非爬虫。在这里有时候还有坑,坑了我好几次,当你复制下面的内容时,可能会连空格也复制上,记得进行UA伪装时要检查一下有没有空格,如果有空格时,运行是会报错的。
我们现在来敲下代码。
先导入requests和BeautifulSoup,再进行UA伪装,在这里要看清了进行UA伪装时 : 两边要同时用" "。我在这里说一下这里面的所有的下划线什么的都是自己取的名字,不必那么纠结(写这个的原因是我之前就纠结这个,我就在想这写的都是什么东西,带下划线不是一些特别的词吗?,害)。
import requests #引入request库
from bs4 import BeautifulSoup
###以笔趣阁《圣域》为目标的爬取
url = "https://www.xbiquge.la/13/13959/"
#UA伪装 让浏览器识别为用户而非爬虫
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
page_res = requests.get(url,headers=headers).text.encode("ISO-8859-1")
大家也应该注意到了 .encode("ISO-8859-1") 关于这个是个中文转码,要不然你获取的都是乱码,到时候你爬到的就不是小说了,是乱码。 还有这个 .text 是相当于以文本形式的输出(应该是吧,我是个萌新,啥也不知道)。
接下来,就应该使用BeautifulSoup来进行了。
soup = BeautifulSoup(page_res,"lxml") #这是使用的浏览器的源代码,也可使用本地的上传
list = soup.select(".box_con dl dd ")
想要使用BeautifulSoup,就应该这样使用,不过这是使用BeautifulSoup的一种,也可以使用本地保存的HTML来进行爬取,这个"lxml"是BeautifulSoup的解释器,所以要去使用它。
再讲下这个第二行的东西是个啥 ,是获取关于章节的那一行。
我们先用这个去看章节在的地方。
我们点的是一个章节
这个 .select() 可以一步一步爬到章节的我们也可以通过 > 一级一级爬过去,由于我不会一步一步爬过去,干脆直接跳过一级一级的爬,通过空格来实现跳级,空格就表示跳级。div后面的那个class="box_con",在使用 .select() 的时候只需要写class=后面的就行了,记得要加点就像写的这个 .box_con 。刚才所写的是获取
之间的内容。
我们爬完不是要保存吗?我们就先写个保存的地方。
f = open("./xs.text","w",encoding="utf-8")
在本目录下再创建一个text,在通过encoding="utf-8"来进行中文转码,不过我感觉这个地方我写的有点多余。这个w的意思是写入,我建议去大佬的文章去学传送门(萌新一枚,啥也不会)。
我们也是要获取全部章节的url,我们也总不能一个一个的看,一个一个的写吧。我们就可以用一个循环来写出全部的url,上一步我们也获取了
之间的内容,里面就有每个章节的url。请看下面的代码。
for li in list :
title = li.a.string
title_url = "https://www.xbiquge.la"+li.a["href"] #主要分析目录的url和点击章节后章节的url li.a["href"]就是获取<a>之间的href的
看到这个 title = li.a.string 你可能就又不墩了,这又是个什么玩意。
上面我们的list获取了
之间的内容,而之间还有点东西。
list.a就是获取包含的标签 ,而list.a.string就是获取中间的内容,也就是说,在这个时候我们就拿到了章节的名称(感觉打字有点累)。不过光拿到章节名称可不行,我们还要拿到章节的url以便来拿到章节的内容。
关于这个 li.a["href"] 就是拿到里面的url,大家也应该看到了 href 后面带有url,通过这个写法就拿到了url,不过这个url可是不全的,怎么才能拿到全部的url呢,我们再去分析一下它的网页。
上面的是你没点击章节前的。
当你点击第二章后。
分析一下,你看你得到了什么。
这个是正常的目录 ,而第二章是 ,我们拿到的url是:/13/13959/5939025.html。所以你蹲怎么变成正常的url了吗?就是通过 "https://www.xbiquge.la"+li.a["href"]
既然通过循环拿到了所有的url,那我们接下来就是获取url中的内容了。虽然看似很难其实很简单。先上代码吧。
title_url_text = requests.get(url=title_url,headers=headers).text.encode("ISO-8859-1")
title_pupli = BeautifulSoup(title_url_text,"lxml")
这个我该咋说就和没写循环前的那个方法一样。
title_text = title_pupli.find("div",id="content")
content = title_text.text
你可能又又又不墩了,这又是个什么鬼,先看下网页。
可见在这里面有小说的内容那怎么获取呢?
通过BeautifulSoup中的 .find 的用法来获取内容,fing可以寻找网页源码中的数据(是叫网页源码吧?),比如:所写的那个就是可以寻找整个网页源码中关于
id="content" 下的内容,这样就获取了里面的内容。关于BeautifulSoup用法可以去这里看 传送门。第二行代码的意思就是获取内容,也可以通过 .get_text 或 .string (没记错的话应该是)。
这样我们就只剩下保存在text中了 。
f.write(title+":"+content+"\n") print(title,"爬取成功......")
通过 .write 来进行保存,这些应该可以自己悟了,f是刚开始时的代码。
总结
思路是最重要的。我们也要善于去分析,灵活运用各个库的使用方法,以达到自己的目的
文章有不对的地方请大佬指正 。