最近疫情猖獗,长假憋在家里实在无聊,早上突然看了一篇python爬虫文章,当场决定试验一下,参照了一下别人的案例,自己各种踩坑捣鼓了好几个小时,终于成功最后把具体步骤和注意点分享给大家:
1、Python爬虫关键的两个组件是requests和BeautifulSoup,特别是BeautifulSoup组件,认真学习好,会使你的爬取之路事半功倍。
2、初始化爬取需要的变量
# -*- coding:UTF-8 -*-
import requests, sys
import urllib3
from bs4 import BeautifulSoup
class downloader():
def __init__(self):
self.server = 'http://www.biqukan.com' #爬取的服务器地址(获取文章内容时用)
self.target = 'https://www.biqukan.com/73_73577/' #爬取的文章列表
self.names = [] #章节名
self.urls = [] #章节地址
self.nums = [] #章节数量
urllib3.disable_warnings() #禁用掉运行时报出的ssl警告
3、获取文章的各章节名称、总章节数和各章节内容地址,供下载章节内容时使用
def get_download_url(self):
req = requests.get(url=self.target, verify=False) #不使用https验证
req.encoding = 'gbk' #根据爬取页面的编码设置(目标页面F12查看)
text = req.text
soup = BeautifulSoup(text, 'html.parser') #不加参数html.parser也可以运行,但是有预警信息
div = soup.find_all('div', class_='listmain') #根据类型和class样式查找标签对象
a_bf = BeautifulSoup(str(div[0]), 'html.parser')
a = a_bf.find_all('a')
self.nums = len(a[12:]) #剔除不必要的章节,并统计章节数
for each in a[12:]:
self.names.append(each.string)
self.urls.append(self.server + each.get('href'))
4、根据章节地址,获取章节内容,并进行格式化处理
def get_contents(self, target):
req = requests.get(url = target, verify=False) #不使用https验证
req.encoding = 'gbk' #根据爬取页面的编码设置(目标页面F12查看)
text = req.text
soup = BeautifulSoup(text, 'html.parser') #不加参数html.parser也可以运行,但是有预警信息
texts = soup.find_all('div', class_='showtxt')
texts = texts[0].text.replace('\xa0'*8,'\n\n') #替换掉连续的 
texts = texts.replace('app2();','')
pos = texts.find('(https://www.biqukan.com/73_73577/')
texts = texts[:pos] #切除掉各章节内容最后无用的信息
return texts
5、获取的内容,输出到本地的硬盘文件中
def writer(self, name, path, text):
with open(path, 'a', encoding='gbk') as f: #和爬取页面内容的编码保持一致
f.write(name + '\n')
f.writelines(text)
f.write('\n\n') #换行显示
6、运行控制程序
if __name__ == '__main__':
dl = downloader()
dl.get_download_url()
for i in range(dl.nums):
dl.writer(dl.names[i], '神武斗圣.txt', dl.get_contents(dl.urls[i]))
print(dl.names[i] + ' ---- 下载完成!')
7、运行效果