Python爬虫——网站基本信息
在智能时代,数据是新的石油。Python爬虫技术赋予了我们成为数据猎人的能力,让我们能够在网络的广袤土地上狩猎,为机器学习和人工智能的发展提供燃料
目录
一、介绍——Python
二、介绍——Python爬虫
1.请求库
2.解析库
3.数据存储
4.多线程/多进程
5.异步编程
6.代理和反爬虫
7.爬虫框架
8.爬虫的法律和道德问题
9.异常处理
10.日志记录
三、爬虫示例代码
一、介绍——Python
Python是一种广泛使用的高级编程语言,它以其清晰的语法和代码可读性而闻名。Python支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。
Python特点:
- 易于学习和使用:Python 有一个非常简洁的语法,这使得它成为初学者学习编程的理想选择。
- 可移植性:Python 程序可以在多种操作系统上运行,包括 Windows、Mac OS X、Linux 等。
- 强大的标准库:Python 有一个庞大的标准库,提供了许多用于处理文件、系统调用、网络通信等的模块。
- 开源:Python 是一个开源项目,拥有活跃的社区,这意味着它不断得到改进,并且有大量的第三方库和框架可供使用。
- 自动内存管理:Python 有自动内存管理和垃圾回收功能,这减少了内存泄漏和其他内存管理错误的可能性。
- 多范式编程:Python 支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。
- 广泛的应用领域:Python 在数据科学、机器学习、网络服务器、桌面和网络应用程序开发、自动化脚本等领域都有广泛的应用。
- 交互式解释器:Python 有一个交互式解释器,允许用户逐行执行代码,这对于测试和快速原型开发非常有用。
- 良好的文档:Python 有详尽的官方文档,这使得学习和解决问题变得更加容易。
- 跨平台开发:Python 允许开发者编写一次代码,然后在不同的平台上运行,这减少了跨平台开发的复杂性。
二、介绍——Python爬虫
Python爬虫,通常指的是使用Python语言编写的网络爬虫程序,用于从互联网上自动获取网页内容。爬虫可以用于数据采集、信息抽取、内容监控等多种场景。以下是Python爬虫的一些基础知识和组成部分:
1.请求库
requests
:一个简单易用的HTTP库,用于发送网络请求。aiohttp
:一个异步HTTP网络库,适用于异步编程。
2.解析库
BeautifulSoup
:一个可以从HTML或XML文件中提取数据的Python库。lxml
:一个高效的XML和HTML解析库。pyquery
:一个类似jQuery的库,用于解析HTML文档。
3.数据存储
- 数据库:如MySQL、MongoDB等,用于存储爬取的数据。
- 文件:如CSV、JSON、Excel等格式,用于存储数据。
4.多线程/多进程
threading
:Python标准库中的线程模块。multiprocessing
:Python标准库中的进程模块。concurrent.futures
:一个更高级别的异步执行模块。
5.异步编程
asyncio
:Python的异步I/O框架。aiohttp
:结合asyncio
使用,进行异步HTTP请求。
6.代理和反爬虫
- 使用代理服务器来隐藏爬虫的真实IP地址。
- 设置请求头(User-Agent、Cookies等),模拟浏览器行为。
- 处理JavaScript渲染的页面,可能需要使用Selenium或Pyppeteer。
7.爬虫框架
Scrapy
:一个快速的高级爬虫框架,用于爬取网站并从页面中提取结构化的数据。Crawley
:一个基于Twisted的Python网络爬虫框架。
8.爬虫的法律和道德问题
- 遵守
robots.txt
协议,尊重网站的爬虫政策。 - 避免对网站服务器造成过大压力,合理安排爬取频率。
- 遵守相关法律法规,不爬取受版权保护的内容。
9.异常处理
- 处理网络请求中的异常,如超时、连接错误等。
- 处理数据解析中的异常,确保程序的健壮性。
10.日志记录
- 使用
logging
模块记录爬虫的运行状态,方便调试和监控。
三、爬虫示例代码
import subprocess
import sys
import socket
import requests
from bs4 import BeautifulSoup
from colorama import Fore, Style, init
from prettytable import PrettyTable
import geocoder
from urllib.parse import urlparse
import time
def install_libraries(libraries):
for library in libraries:
try:
__import__(library)
print(f"{library} 已安装.")
except ImportError:
print(f"{library} 未安装,正在安装...")
try:
subprocess.check_call([sys.executable, "-m", "pip", "install", "--quiet", library])
print(f"{library} 安装成功.")
except subprocess.CalledProcessError:
print(f"{library} 安装失败.")
required_libraries = ["requests", "beautifulsoup4", "colorama", "prettytable", "geocoder"]
install_libraries(required_libraries)
init(autoreset=True)
def print_divider():
print("\n" + "=" * 50 + "\n")
def get_server_ip(url):
parsed_url = urlparse(url)
return socket.gethostbyname(parsed_url.netloc)
def get_server_location(ip_address):
g = geocoder.ip(ip_address)
return g.city, g.country
def crawl_website(url):
try:
ip_address = get_server_ip(url)
city, country = get_server_location(ip_address)
print(f"{Fore.CYAN}服务器 IP 地址: {Fore.GREEN}{ip_address}{Style.RESET_ALL}")
print(f"{Fore.CYAN}服务器所在地: {Fore.GREEN}{city}, {country}{Style.RESET_ALL}")
print_divider()
start_time = time.time()
response = requests.get(url)
response.raise_for_status()
latency = (time.time() - start_time) * 1000
print(f"{Fore.CYAN}连接延迟: {Fore.GREEN}{latency:.2f} 毫秒{Style.RESET_ALL}")
print(f"{Fore.CYAN}响应状态码: {Fore.GREEN}{response.status_code}{Style.RESET_ALL}")
print(f"{Fore.CYAN}内容类型: {Fore.GREEN}{response.headers.get('Content-Type', '未知')}{Style.RESET_ALL}")
print_divider()
response.encoding = response.apparent_encoding
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.title.string if soup.title else '无标题'
print(f"{Fore.CYAN}网页标题: {Fore.GREEN}{title}{Style.RESET_ALL}")
print_divider()
meta_description = soup.find("meta", attrs={"name": "description"})
description = meta_description['content'] if meta_description else '无描述'
print(f"{Fore.YELLOW}网页描述: {Fore.GREEN}{description}{Style.RESET_ALL}")
print_divider()
links = soup.find_all('a', href=True)
print(f"{Fore.GREEN}所有链接:{Style.RESET_ALL}")
for link in links:
print(f" - {link['href']}")
print_divider()
paragraphs = soup.find_all('p')
print(f"{Fore.MAGENTA}所有段落文本:{Style.RESET_ALL}")
for para in paragraphs:
print(f" - {para.get_text()}")
print_divider()
images = soup.find_all('img', src=True)
print(f"{Fore.BLUE}所有图片链接:{Style.RESET_ALL}")
for img in images:
print(f" - {img['src']}")
print_divider()
print(f"{Fore.YELLOW}所有 meta 标签:{Style.RESET_ALL}")
meta_tags = soup.find_all('meta')
for meta in meta_tags:
print(f" - {meta}")
print_divider()
scripts = soup.find_all('script', src=True)
styles = soup.find_all('link', rel='stylesheet')
print(f"{Fore.GREEN}所有脚本链接:{Style.RESET_ALL}")
for script in scripts:
print(f" - {script['src']}")
print_divider()
print(f"{Fore.MAGENTA}所有样式链接:{Style.RESET_ALL}")
for style in styles:
print(f" - {style['href']}")
print_divider()
for i in range(1, 7):
headers = soup.find_all(f'h{i}')
if headers:
print(f"{Fore.CYAN}所有 h{i} 标签:{Style.RESET_ALL}")
for header in headers:
print(f" - {header.get_text()}")
print_divider()
lists = soup.find_all(['ul', 'ol'])
print(f"{Fore.GREEN}所有列表项:{Style.RESET_ALL}")
for lst in lists:
items = lst.find_all('li')
for item in items:
print(f" - {item.get_text()}")
print_divider()
tables = soup.find_all('table')
for idx, table in enumerate(tables):
print(f"{Fore.BLUE}表格 {idx + 1}:{Style.RESET_ALL}")
x = PrettyTable()
rows = table.find_all('tr')
for row in rows:
cols = row.find_all(['td', 'th'])
x.add_row([col.get_text().strip() for col in cols])
print(x)
print_divider()
total_chars = len(response.text)
print(f"{Fore.YELLOW}网页字符总数: {Fore.GREEN}{total_chars}{Style.RESET_ALL}")
except requests.exceptions.RequestException as e:
print(f"{Fore.RED}请求错误: {str(e)}{Style.RESET_ALL}")
if __name__ == "__main__":
url = input("请输入要爬取的网址: ")
# 检查并添加协议
if not (url.startswith("http://") or url.startswith("https://")):
url = "http://" + url
crawl_website(url)
不需要手动安装额外的库,代码中会自动检测并安装所需库。这只是一个爬取基础信息的示例爬虫代码,还可以爬取视频、音频等,也可以把爬取的数据存入数据库中
进群一起交流https://qm.qq.com/q/r35e6DoVK8