python实现一个简单的爬虫脚本
OS库
import os
检测目录存在,不存在则创建输出目录
output_dir = '...'
if not os.path.exists(output_dir):
os.makedirs(output_dir)
保存内容到文件
content = 'xxx'
// 将output_dir与文件名拼接
filename = os.path.join(output_dir, f'page_1.txt')
with open(filename, 'w', encoding='utf-8') as f:
f.write(content)
requests
使用requests与BeautifulSoup实现一个简单的爬虫 爬取html页面中静态div中的文本内容
安装BeautifulSoup
> pip install -r requirements.txt
import requests
from bs4 import BeautifulSoup
实现一个获取指定网页中特定class=xx的div中的内容
def get_page_content(page_num):
url = f'https://....?p={page_num}'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status() # 检查请求是否成功
soup = BeautifulSoup(response.text, 'html.parser')
# 找到指定class的div
content_div = soup.find('div', class_='xxx')
if content_div:
return content_div.get_text(strip=True)
return None
except Exception as e:
print(f"获取第{page_num}页时发生错误: {str(e)}")
return None
完整代码
time
添加延迟 避免请求过快
import time
time.sleep(2)
完整脚本代码
import requests
from bs4 import BeautifulSoup
import time
import os
def get_page_content(page_num):
url = f'https://www.doyo.cn/article/243714?p={page_num}'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status() # 检查请求是否成功
soup = BeautifulSoup(response.text, 'html.parser')
# 找到指定class的div
content_div = soup.find('div', class_='CH243714PsfiiY01QjM3f')
if content_div:
return content_div.get_text(strip=True)
return None
except Exception as e:
print(f"获取第{page_num}页时发生错误: {str(e)}")
return None
def save_content(content, page_num):
# 创建输出目录
output_dir = 'output'
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 保存内容到文件
filename = os.path.join(output_dir, f'page_{page_num}.txt')
with open(filename, 'w', encoding='utf-8') as f:
f.write(content)
print(f"第{page_num}页内容已保存到 {filename}")
def main():
print("开始爬取内容...")
for page_num in range(1, 12): # 1到11页
print(f"正在获取第{page_num}页...")
content = get_page_content(page_num)
if content:
save_content(content, page_num)
else:
print(f"第{page_num}页内容获取失败")
# 添加延时,避免请求过快
time.sleep(2)
print("爬取完成!")
if __name__ == '__main__':
main()
get_page_content这个函数还可以再优化下,根据div中的p标签,对文字内容进行换行
def get_page_content(page_num):
url = f'https://www.doyo.cn/article/243714?p={page_num}'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status() # 检查请求是否成功
soup = BeautifulSoup(response.text, 'html.parser')
# 找到指定class的div
content_div = soup.find('div', class_='CH243714PsfiiY01QjM3f')
if content_div:
# 获取所有段落
paragraphs = content_div.find_all('p')
# 将每个段落的文本连接起来,用换行符分隔
content = '\n\n'.join([p.get_text(strip=True) for p in paragraphs if p.get_text(strip=True)])
return content
return None
except Exception as e:
print(f"获取第{page_num}页时发生错误: {str(e)}")
return None
关于__name__
if __name__ == '__main__':
main()
这段代码的意思是:只有当文件被直接运行时,才会执行main()
函数;如果这个文件被其他文件导入,main()
函数就不会被执行。这样可以让你的代码更加灵活和可重用。
直接运行与导入的区别:
- 当你直接运行一个Python文件时,Python会将特殊变量
__name__
设置为'__main__'
- 当你将这个文件作为模块导入到其他文件时,
__name__
会被设置为模块的名称
- 当你直接运行一个Python文件时,Python会将特殊变量
主要用途:
- 可以防止代码被导入时自动执行
- 可以控制代码的执行逻辑
- 是一种代码组织的最佳实践
实际应用场景:
- 当你的Python文件既可以作为脚本直接运行,又可以作为模块被导入时
- 用于测试代码,测试代码只在直接运行文件时执行,而在导入时不执行
- 可以把主要的程序逻辑放在
main()
函数中,更好地组织代码结构