本帖最后由 txq0211 于 2022-4-6 00:38 编辑
《菜鸟心法》
复杂的问题简单化,
简单的问题标准化,
标准的问题流程化,
流程化迭代程序化,
程序化迭代自动化。
(多多包涵啊,站在小白的角度,先不管反爬和语法标不标准,先用中文用最简洁的代码写出来再说)
一、继续试着用中文写一个小说爬虫
在帖子爬虫之如何引导(忽悠)小白学爬虫的基础上,试着抓抓任意小说的内容。
如果出现乱码,问题,可以尝试用加入一段代码:
响应.encoding = 响应.apparent_encoding
来处理乱码问题。
[Python] 纯文本查看 复制代码 import requests
网址 = 'https://www.vipxs.la/8_8698/4392152.html'
响应 = requests.get(网址)
响应.encoding = 响应.apparent_encoding
内容 = 响应.text
print(内容)
好吧,到了这里,就需要一些自学能力了,遇到不懂的,
自己要百度去了解,就像学生时代遇到不懂的翻字典,
作为菜鸟,我也只是想着最简单的方式去理解,用中文来写也是全新的尝试。
parsel库的便捷在于学起来简单,了解一点点CSS知识就能写简单的内容提取了。
[Python] 纯文本查看 复制代码 import requests
from parsel import Selector
网址 = 'https://www.vipxs.la/8_8698/4392152.html'
响应 = requests.get(网址)
响应.encoding = 响应.apparent_encoding
页面 = Selector(响应.text)
标题 = 页面.css('.bookname h1::text').get()
内容 = 页面.css('#content::text').getall()
文字 = ''.join(内容)
print(标题,文字)
二、尝试保存内容
跑一跑,不懂的尝试百度,自己主动学习的印象更深
没想到中文可以做到这一步。
[Python] 纯文本查看 复制代码 import requests
from parsel import Selector
网址 = 'https://www.vipxs.la/8_8698/4392152.html'
响应 = requests.get(网址)
响应.encoding = 响应.apparent_encoding
页面 = Selector(响应.text)
标题 = 页面.css('.bookname h1::text').get()
内容 = 页面.css('#content::text').getall()
文字 = ''.join(内容)
文件 = f'{标题}.txt'
# a 是追加保存 encoding 保存编码
with open(文件, mode='a', encoding='utf-8') as f:
f.write(文字)
三、如何简单化
看过很多爬虫,都是代码从上往下一摞的。
如何才能简单理解?
于是,尝试定义一个个函数。可以重复利用的,通过def定义函数,
需要的时候再调用,上述的代码优化分一分累先。
继续改造,改造后跑一跑,没问题。
[Python] 纯文本查看 复制代码 import requests
from parsel import Selector
def 请求(网址):
响应 = requests.get(网址)
响应.encoding = 响应.apparent_encoding
return 响应
def 获取文本(网址):
页面 = Selector(请求(网址).text)
标题 = 页面.css('.bookname h1::text').get()
内容 = 页面.css('#content::text').getall()
文字 = ''.join(内容)
文件 = f'{标题}.txt'
保存内容(文件,文字)
def 保存内容(文件,文字):
# a 是追加保存 encoding 保存编码
with open(文件, mode='a', encoding='utf-8') as f:
f.write(文字)
网址 = 'https://www.vipxs.la/8_8698/4392152.html'
获取文本(网址)
四、接下来重复上面思路,我们来获取所有的列表
打开目录页,尝试用同样的方式,抓取所以链接。
[Python] 纯文本查看 复制代码 import requests
from parsel import Selector
def 请求(网址):
响应 = requests.get(网址)
响应.encoding = 响应.apparent_encoding
return 响应
def 获取文本(小说标题,章节链接):
页面 = Selector(请求(章节链接).text)
标题 = 页面.css('.bookname h1::text').get()
内容 = 页面.css('#content::text').getall()
文字 = ''.join(内容)
文件 = f'{小说标题}.txt'
保存内容(文件, 标题, 文字)
def 保存内容(文件, 标题, 文字):
# a 是追加保存 encoding 保存编码
with open(文件, mode='a', encoding='utf-8') as f:
# 写入标题
f.write(标题)
# 换行
f.write('\n')
# 写入小说内容
f.write(文字)
def 获取章节(链接):
列表页 = Selector(请求(链接).text)
所有链接 = 列表页.css('#list dd a::attr(href)').getall()
小说标题 = 列表页.css('#info h1::text').get()
# print(小说标题)
for 章节链接 in 所有链接:
章节链接 = 'https://www.vipxs.la%s' % 章节链接
获取文本(小说标题,章节链接)
# print(章节链接)
链接 = 'https://www.vipxs.la/8_8698/'
获取章节(链接)
代码到这里就告一段落了,老铁们可以尝试用抄几遍,然后自己改成拼音或者英文试试。
中文最终版,再加个进度条吧。
[Python] 纯文本查看 复制代码 import requests
from parsel import Selector
from tqdm import tqdm
def 请求(网址):
请求头 = {'User-Agent':'Mozilla/5.0 (Macintosh Intel Mac OS X 10.15 rv: 98.0) Gecko/20100101 Firefox/98.0'}
响应 = requests.get(url=网址,headers=请求头)
响应.encoding = 响应.apparent_encoding
return 响应
def 获取文本(小说标题,章节链接):
页面 = Selector(请求(章节链接).text)
标题 = 页面.css('.bookname h1::text').get()
内容 = 页面.css('#content::text').getall()
文字 = ''.join(内容)
文件 = f'{小说标题}.txt'
保存内容(文件, 标题, 文字)
def 保存内容(文件, 标题, 文字):
# a 是追加保存 encoding 保存编码
with open(文件, mode='a', encoding='utf-8') as f:
# 写入标题
f.write(标题)
# 换行
f.write('\n')
# 写入小说内容
f.write(文字)
def 获取章节(链接):
列表页 = Selector(请求(链接).text)
所有链接 = 列表页.css('#list dd a::attr(href)').getall()
小说标题 = 列表页.css('#info h1::text').get()
for 章节链接 in tqdm(所有链接[12:]):
章节链接 = 'https://www.vipxs.la%s' % 章节链接
获取文本(小说标题,章节链接)
链接 = 'https://www.vipxs.la/8_8698/'
获取章节(链接)
三十几行代码,尤其还是洋不洋土不土的半中文写一个小说爬虫,感觉还是挺简单的。
思考,每一个def函数写一个功能,这样似乎便于理解。
欢迎感兴趣的伙伴们提建议。
|