《新笔趣阁》之全站爬虫
身为十年老书虫,学习爬虫不爬取全站小说网都对不起这个身份。我相信,对于很多人来说,小说是人的第二精神世界,是某些时刻精神慰问的佳肴。小编最喜欢的作者是实验小白鼠的作品,鼠大的作品主打玄幻和都市,若碰巧遇到鼠哥的粉丝可私信闲聊,哈哈。扯远了,回归正题,这次对《新笔趣阁》全站爬取小说并存入txt文件!!!
操作环境: Windows10、Python3.6、Pycharm、谷歌浏览器
目标网址: http://www.xbiquge.la/xiaoshuodaquan/ (新笔趣阁)
爬虫目录
================================================
1、分析网页
首先对目标网站进行分析你需要爬取的内容。
从图片可看出此属性mian标签下包含了六对同等级标签,经过分析了解clear属性的div标签是空白符,然而novellist属性的div标签才是包含各类小说信息的主要标签。每本小说对应着一个 li 标签,本站共有3000本小说。如下图:
2、编码方式
网页的编码方式品种多样,但主流还是utf-8,gbk,gb2312等等,如果源网页是GBK字节流,在程序端接收时的inputstream得到的字节数组的编码方式肯定是GBK字节流,即源网页是什么编码方式的字节流,程序端接收到的字节流的编码方式肯定是相同的。因此,只要在程序端解析出该流实际的编码方式即可将该流获得的源网页的字节数组转化成正常的编码显示形式。即算“解码–解析编码”的过程。
查看字节流编码的方式这里介绍两种:
一:通过F12或者右键点击检查进入开发者模式,进入控制台(console)下面输入document.charset,回车即可查看。如下图:
二:右键点击“查看网页源码”,在源码网页的最上面找到meta的charset来获得编码。如下图:
请求目的网站:
headers = {
# 请求头,伪造身份
"Content-Encoding":"gzip",
"Content-Type":"text/html",
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'
}
# 目标链接
url = 'http://www.xbiquge.la/xiaoshuodaquan/'
response = requests.get(url=url,headers=headers) # 请求目的网址
print(response) # <Response [200]>
print(response.status_code) # 返回状态码 200
2.1、两种解码类型
一、response.text
类型: 返回str
作用: 主要用于网页字符串的编码
二、response.content
类型: 返回bytes
作用: 主要用于二进制数据类型,例:音频、视频、图片等
2.2、万能编码
自动识别网页的编码格式,但不建议使用这个。
response.encoding = response.apparent_encoding # 万能编码
2.3、指定编码
手动查看网页编码格式,并写入代码中,建议使用这种方法。
text = response.content.decode('utf-8') # 指定编码格式
print(text)
三种编码格式输出结果都是一致:
3、xpath提取数据
导入解析库parsel:import parsel #pip install 库名 (下载安装第三方库)
import random
import requests
import parsel
import os
import time
headers = {
# 请求头,伪造身份
"Content-Encoding":"gzip",
"Content-Type":"text/html",
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'
}
# 目标链接
url = 'http://www.xbiquge.la/xiaoshuodaquan/'
response = requests.get(url=url,headers=headers) # 请求目的网址
text = response.content.decode('utf-8') # 指定编码格式
# parsel将网页源码转化为Selector对象,以便后续的语法提取数据
selector = parsel.Selector(text)
lis = selector.xpath('//div[@i