任务
- 爬取起点中文网前5页(页数可改)完本小说
- 将爬取到的小说名字、作者、链接以及相关简介保存到一个excel表格中
分析
通过检查网页的源码可知,浏览器发起的是get请求,返回的数据类型是text/html。因此可以调用requests模块中的get() 函数得到页面源码数据
headers = {
'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 86.0.4240.198Safari / 537.36'
}
param = {
'page': page_num
}
url = 'https://www.qidian.com/finish?action=hidden&orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=2&'
response = requests.get(url=url, params=param, headers=headers)
page_data = response.text
(由于刚刚接触爬虫,这里遇到了一个问题:
当得到page_data数据后,对其进行打印显示,发现页面源码缺少本次任务的关键内容,即小说的所有数据都不在页面源码中。但是当将其保存为一个html文件,再打开,并创建一个BeautifulSoup对象后,再对其进行打印,小说的有关数据又会显示出来,这一点不是太明白,希望看到此文的朋友可以讲解一下原理。)
file = open('qidian.html', 'r', encoding='utf-8')
soup = BeautifulSoup(file, 'lxml')
得到BeautifulSoup对象soup后,就可以用正则表达式对要爬取的内容进行提取。每得到一个数据,就将其保存在一个列表中,最后对excel表格进行操作,就可将数据进行永久化存储。
完整代码
# -*- coding = utf-8 -*-
# @Time : 2020/12/27 11:17
# @author: 农夫三犭
# @File : main.py
# @Software:PyCharm
import requests
import re
from bs4 import BeautifulSoup
import xlwt
# 小说链接
findLink = re.compile(r'<a data-bid=.*? data-eid=.*? href="(.*?)"', re.S) # 选取的内容要用括号括起来
# 小说名字
findName = re.compile(r'<a data-bid=.*? data-eid=.*? href=.*? target=.*?>(.*)</a></h4>')
# 小说作者
findAuthor = re.compile(r'a class="name" data-eid=.*? href=.*? target="_blank">(.*?)</a><em>|</em>')
# 小说简介
findIntroduce = re.compile(r'<p class="intro">(.*?)</p>', re.S)
if __name__ == '__main__':
savepath = "起点小说完结.xls"
datalist = []
headers = {
'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 86.0.4240.198Safari / 537.36'
}
url = 'https://www.qidian.com/finish?action=hidden&orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=2&'
for page_num in range(1, 6): # 前5页内容
page_num = str(page_num)
param = {
'page': page_num
}
response = requests.get(url=url, params=param, headers=headers)
page_data = response.text
with open('./qidian.html', 'w', encoding='utf-8') as fp:
fp.write(page_data)
file = open('qidian.html', 'r', encoding='utf-8')
soup = BeautifulSoup(file, 'lxml')
for item in soup.find_all('div', class_='book-mid-info'):
data = []
item = str(item) # 必须先转换为字符串
# 小说名字
name = re.findall(findName, item)[0]
data.append(name)
# 小说作者
author = re.findall(findAuthor, item)[0]
data.append(author)
# 小说链接
link = re.findall(findLink, item)[0]
link = 'https' + link
data.append(link)
# 小说简介
introduce = re.findall(findIntroduce, item)
introduce = [x.strip() for x in introduce if x.strip() != ''][0] # 去除列表中的空格和换行
data.append(introduce)
datalist.append(data)
book = xlwt.Workbook(encoding="utf-8") # 创建workbook对象
sheet = book.add_sheet('起点小说完本', cell_overwrite_ok=True) # 创建工作表
column = ("小说名字", "小说作者", "小说链接", "小说简介") # 元组
for i in range(0, 4):
sheet.write(0, i, column[i]) # 列名
for i in range(0, len(datalist)):
print(f"第{i + 1}条写入成功")
datas = datalist[i]
for j in range(0, 4):
sheet.write(i + 1, j, datas[j]) # 数据
book.save(savepath)
(刚开始学爬虫,不足之处还请大家多多指教)