各位老少爷们儿们好啊。
不知道你们有没有这种感觉——看到一半的小说突然要付费,或者网站直接凉了,那叫一个难受。昨晚我失眠了,突发奇想写了个小说爬虫,结果一发不可收拾。
今天就把这个神器分享给大家,白嫖党的福音来了。
很多人觉得爬虫多神秘,其实说白了就是三步走:
就这。没听错,就是这么简单粗暴。
import requests
from bs4 import BeautifulSoup
import re
import os
import time
classNovelCrawler:
def__init__(self, headers=None):
self.headers = headers or {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
self.session = requests.Session()
defget_chapter_content(self, url):
resp = self.session.get(url, headers=self.headers, timeout=10)
resp.encoding = 'utf-8'
soup = BeautifulSoup(resp.text, 'html.parser')
content = soup.select_one('#content, .chapter-content, .book-content')
if content:
return content.get_text(strip=True, separator='\n')
returnNone
defget_chapter_list(self, catalog_url):
resp = self.session.get(catalog_url, headers=self.headers, timeout=10)
resp.encoding = 'utf-8'
soup = BeautifulSoup(resp.text, 'html.parser')
links = soup.select('a[href*="/chapter"], a[href*="/read"]')
return [(link.get_text(strip=True), link['href']) for link in links]
defsave_novel(self, title, chapters):
os.makedirs('novels', exist_ok=True)
filename = f'novels/{re.sub(r"[^\w\s]", "", title)}.txt'
with open(filename, 'w', encoding='utf-8') as f:
f.write(f"{title}\n{'='*50}\n\n")
for i, (name, content) in enumerate(chapters, 1):
f.write(f"第{i}章 {name}\n\n{content}\n\n")
if i % 10 == 0:
print(f"已保存 {i} 章...")
return filename
defcrawl(self, catalog_url, start=0, end=None):
print("正在获取章节列表...")
chapters = self.get_chapter_list(catalog_url)[start:end]
print(f"共找到 {len(chapters)} 章,开始抓取...")
results = []
for i, (name, url) in enumerate(chapters):
content = self.get_chapter_content(url)
if content:
results.append((name, content))
print(f"第{i+1}章: {name}")
time.sleep(0.5)
title = f"小说_{int(time.time())}"
return self.save_novel(title, results)
crawler = NovelCrawler()
url = "https://example.com/novel/12345/catalog"
filepath = crawler.crawl(url, start=0, end=100)
print(f"小说已保存到: {filepath}")
输出大概是这样的:
正在获取章节列表...
共找到 100 章,开始抓取...
第1章: 第一章 穿越了
第2章: 第二章 系统激活
第3章: 第三章 走上人生巅峰
...
小说已保存到: novels/小说_1234567890.txt
看到没。全自动一条龙服务。
网站不是傻子,人家也要活下去。所以遇到反爬很正常,别慌。
# 招数1:随机UA
import random
USER_AGENTS = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36...',
'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15...',
]
defget_random_headers():
return {'User-Agent': random.choice(USER_AGENTS)}
# 招数2:代理IP池
proxies = {
'http': 'http://user:pass@proxy.com:8080',
'https': 'https://user:pass@proxy.com:8080'
}
# 招数3:Cookie绕过
cookies = {'session_id': 'xxxxx'}
法律风险说三遍:
我一直的理念是——技术无罪,但用法有道。用技术来学习研究没问题,拿去干坏事就呵呵了。
第一层:BeautifulSoup够用了,新手友好 第二层:Scrapy框架了解一下,专业的爬虫框架 第三层:Selenium配合浏览器,JS渲染的页面也能爬 第四层:分布式爬虫集群,大爷级别玩家的选择
好了,今天的分享就到这里。技术是用来解决问题的,不是用来作恶的。各位且爬且珍惜。
我是混子哥,我们下期见。