最近闲着无聊开始翻看之前看了一半的小说《明朝那些事儿》,天天用网络看好麻烦就写了个爬虫下载下来放到手机上看,下面把写爬虫的过程遇到的问题记录一下,方便以后再来找,写这个爬虫碰到的问题总共就3个,第一个是爬取到的文字是乱码怎么办;第二是xpath语法,在谷歌浏览器的插件中能找到自己需要的信息,放到爬虫中运行就什么也获取不到;第三是去掉爬到的文字中多余的部分。下面开始正文
首先还是上目标网址,经过百度发现下面网站有我需要的全文明朝那些事儿-明朝那些事儿全集在线阅读www.mingchaonaxieshier.com
然后分析网站,思路很简单,在首页获取所有章节的url然后在到对应章节中获取自己需要的文本信息,最后保存就大功告成,按照这个思路,我们先定义三个方法
然后再来完善方法中的详细内容,第一步获取url
爬虫第一部导库就不多说了,我们用requests库来访问这个网站发现没有任何反扒措施,开开心心就拿到了所需要的网页信息,不过问题是文字部分都是乱码
这个问题好解决,只要按照网页头部信息给的编码来重新编码就可以了,所以我们的代码是下面这样
resp = requests.get(url)
resp.encoding = 'utf-8'
print(resp.text)
下面就能正常显示文字了
然后就是通过xpath来获取我们需要的url并放到一个列表里,后面遍历获取文本信息,打开开发者工具查看
所有的url信息都是在这个标签的href属性里面,然后我们的xpath语法就是这样//tbody/tr/td/a/@href
在我们的插件里面也能正确获取到信息,然后我们到程序里面试一下就懵逼了,因为获取的信息是空的
抓耳挠腮的我机智的打开了网页源代码看了起来,发现了问题所在,在网页源代码中是没有tbody这个标签的
这个标签应该是浏览器自己加上的,而源码中并没有,所以我们获取是获取不到的,这里提供给我们一个解决xpath语法无法获取信息的思路—多看看网页源码
经过一番调整获取url的函数我们最终搞定了是这样
def get_url(url):
url_list = []
resp = requests.get(url)
resp.encoding = 'utf-8'
e = etree.HTML(resp.text)
data_list = e.xpath('//table')
for data in data_list:
# print(data)
url = data.xpath('./tr/td//a/@href')[1:]
url_list.extend(url)
return url_list
如此我们就获取了所有的URL,然后就是到分章节里获取文本信息了,这个相对容易就不拿出来单写了,只说碰到的问题:在文本信息前面有个\u3000的字符是我们不要的,直接用正则替换掉,完整代码截图奉上
有问题的可以私信问我,如果需要源码也可以找我要,如果你也是小白正在学习咱们一起交流呀