Python网络爬虫

Python网络爬虫是利用Python编程语言编写的自动化程序,用于从互联网上抓取数据。这些程序可以模拟人类的行为,自动访问网页并从中提取所需的信息。Python因其丰富的库支持和易用性,成为了构建网络爬虫的流行选择。

Python网络爬虫的基础知识点

Python基础知识

模块的导入和使用

python 复制代码
import requests
from bs4 import BeautifulSoup

变量作用域

python 复制代码
def example():
    x = 10  # 局部变量
    print(x)

example()
# print(x)  # 会报错,因为x是局部变量

类型转换

python 复制代码
int_value = int("123")
str_value = str(123)
float_value = float("123.45")

对象的概念

python 复制代码
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person = Person("Alice", 30)
print(person.name)

Tuple/List/Dict/Set 的操作

python 复制代码
my_tuple = (1, 2, 3)
my_list = [1, 2, 3]
my_dict = {'name': 'Alice', 'age': 30}
my_set = {1, 2, 3}

字符串操作

python 复制代码
my_string = "Hello World"
print(my_string.upper())
print(my_string.split(" "))

控制结构(for/while/break/continue)

python 复制代码
for i in range(5):
    print(i)

while True:
    break  # 终止循环

for i in range(5):
    if i == 3:
        continue  # 跳过本次循环
    print(i)

字符编码

python 复制代码
# 字符串的编码与解码
encoded_str = "hello".encode("utf-8")
decoded_str = encoded_str.decode("utf-8")
print(decoded_str)

Unicode与ASCII、utf-8等编码的区别

python 复制代码
# Unicode是一种字符集标准,包含了世界上大多数语言的字符。
# ASCII是一种较早的编码方式,只包含英文字符,共128个字符。
# UTF-8是一种可变长度的编码方式,兼容ASCII,支持全球各种语言的字符。
unicode_str = u"hello"  # Unicode字符串
ascii_str = "hello"     # ASCII字符串
utf8_str = "hello".encode("utf-8")  # UTF-8编码的字符串

字符串的编码与解码

python 复制代码
# 对字符串进行编码
encoded_str = "你好".encode("utf-8")
# 对编码后的字符串进行解码
decoded_str = encoded_str.decode("utf-8")
print(decoded_str)  # 输出: 你好

常见的中文编码如GBK、GB18030等

python 复制代码
gbk_encoded_str = "你好".encode("gbk")  # GBK编码的字符串
gb18030_encoded_str = "你好".encode("gb18030")  # GB18030编码的字符串

HTTP协议

HTTP请求与响应

python 复制代码
response = requests.get('http://example.com')  # 发送GET请求

常见HTTP头信息(如User-Agent、Accept-Encoding、Authorization等)

python 复制代码
headers = {
    'User-Agent': 'Mozilla/5.0',  # 模拟浏览器用户代理
    'Accept-Encoding': 'gzip, deflate',  # 接受压缩类型
    'Authorization': 'Bearer token'  # 认证令牌
}

HTTP状态码的理解

python 复制代码
if response.status_code == 200:
    print("请求成功")
elif response.status_code == 404:
    print("未找到页面")

HTML/CSS/JavaScript基础

网页结构的理解

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>Page Title</title>
</head>
<body>
    <h1>Heading</h1>
    <p>Paragraph</p>
</body>
</html>

如何使用BeautifulSoup或lxml等库解析HTML

python 复制代码
soup = BeautifulSoup(html_content, 'html.parser')  # 解析HTML内容
title = soup.title.string  # 获取<title>标签中的文本

处理JavaScript渲染的页面(如使用Selenium)

python 复制代码
from selenium import webdriver

driver = webdriver.Chrome()  # 初始化Chrome WebDriver
driver.get('http://example.com')  # 访问指定网址
page_source = driver.page_source  # 获取渲染后的页面源码

爬虫道德

尊重robots.txt文件

python 复制代码
# 检查是否允许爬取
robot_url = "http://example.com/robots.txt"
robot_response = requests.get(robot_url)
print(robot_response.text)

控制请求频率,避免给目标网站造成过大负担

python 复制代码
import time

time.sleep(1)  # 控制请求频率,休眠一秒

不滥用爬虫获取敏感信息

python 复制代码
# 不抓取个人隐私信息

构建基础网络爬虫的步骤

获取网页

python 复制代码
# 使用requests库发送HTTP请求
response = requests.get('http://example.com')

获取网页的HTML内容

python 复制代码
html_content = response.text  # 获取HTML文本内容

提取信息

python 复制代码
# 使用BeautifulSoup或lxml解析HTML
soup = BeautifulSoup(html_content, 'html.parser')

# 提取所需的数据(如标题、链接、图片等)
title = soup.title.string
links = [a['href'] for a in soup.find_all('a', href=True)]  # 提取所有<a>标签的链接

数据存储

存储数据到文件(如CSV、JSON)

python 复制代码
import json

data = {'title': title, 'links': links}  # 将数据组织成字典形式
with open('data.json', 'w') as f:
    json.dump(data, f)  # 将数据写入JSON文件

存储数据到数据库(如MySQL、MongoDB)

python 复制代码
# 示例代码假定已经连接好了数据库
db = connect_to_database()
collection = db['data']
collection.insert_one(data)  # 插入数据到数据库集合

数据清洗与处理

python 复制代码
# 清洗数据(去除噪声、格式化)
cleaned_title = title.strip()  # 去除标题两端的空白字符

数据分析(统计、可视化等)

python 复制代码
# 可以使用pandas等库进行数据分析
import pandas as pd

df = pd.DataFrame(data)  # 创建DataFrame
print(df.describe())  # 输出描述性统计信息

数据可视化

python 复制代码
# 使用matplotlib绘制图表
import matplotlib.pyplot as plt

df['Salary'].hist(bins=10)  # 绘制工资分布直方图
plt.title('Salary Distribution')  # 设置图表标题
plt.xlabel('Salary')  # 设置X轴标签
plt.ylabel('Frequency')  # 设置Y轴标签
plt.show()  # 显示图表

示例代码

以下是一个简单的Python网络爬虫示例,用于从一个网站抓取数据:

python 复制代码
import requests
from bs4 import BeautifulSoup

# 发送GET请求
response = requests.get('http://example.com')
# 检查请求是否成功
if response.status_code == 200:
    # 使用BeautifulSoup解析HTML
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # 提取页面标题
    title = soup.title.string
    
    # 输出标题
    print(f'The title of the page is: {title}')
else:
    print(f'Request failed with status code {response.status_code}')

更高级的网络爬虫技术

Scrapy框架

用途: Scrapy是一个用于Python的开源网络爬虫框架,它非常适合用来构建复杂的爬虫项目。

特点:

  • 异步处理: 支持异步请求处理,可以同时处理多个请求,提高爬取效率。
  • 项目管理: 提供了项目管理和数据提取的功能,使得爬虫项目更加模块化和易于维护。
  • 数据提取: 内置强大的选择器引擎,支持CSS和XPath表达式来精确提取网页上的数据。

示例代码:

python 复制代码
import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'example'
    start_urls = ['http://example.com']

    def parse(self, response):
        for item in response.css('div.item'):
            yield {
                'title': item.css('h2::text').get(),
                'link': item.css('a::attr(href)').get(),
            }

Selenium

用途: 当需要爬取的网页是由JavaScript动态生成的,普通的HTTP请求无法获得完整的内容,这时可以使用Selenium来模拟浏览器行为。

特点:

  • 模拟真实用户行为: 可以执行如点击、滚动等操作,从而获取动态加载的内容。
  • 浏览器驱动: 需要安装对应浏览器的WebDriver,并在代码中初始化WebDriver实例。

示例代码:

python 复制代码
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://example.com')
driver.find_element_by_id('some_button').click()
page_source = driver.page_source

异步IO

用途: 在处理大量请求时,使用异步IO可以显著提高爬虫的速度。

技术:

  • asyncio: Python内置的异步IO框架,适用于编写并发应用程序。
  • aiohttp: 一个基于asyncio的HTTP客户端/服务器框架,适用于构建高性能的服务端和客户端应用。

示例代码:

python 复制代码
import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://example.com')
        print(html)

asyncio.run(main())

反反爬虫策略

  • 用途: 在爬虫过程中可能会遇到目标网站采取的各种反爬措施,因此需要采取一定的策略来应对。

  • 策略:

  • 使用代理IP池: 通过轮换使用不同的代理IP地址来防止被封禁。

  • 设置合理的请求间隔: 控制请求频率,避免短时间内发送过多请求导致被检测为爬虫。

  • 模拟真实用户行为: 包括但不限于设置合理的User-Agent、随机化请求间隔、模仿用户的浏览行为等。

示例代码:

python 复制代码
import requests
import random
import time

proxies = [
    'http://proxy1.example.com:8080',
    'http://proxy2.example.com:8080',
]

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

proxy = random.choice(proxies)
response = requests.get('http://example.com', headers=headers, proxies={'http': proxy, 'https': proxy})
time.sleep(random.uniform(1, 3))  # 模拟真实的请求间隔

通过上述介绍,可以了解到构建Python网络爬虫的基础知识和技术,以及如何构建一个简单的爬虫程序。随着实践经验的积累,可以逐渐过渡到更复杂的项目和技术。

一个完整的Python网络爬虫示例,它展示了如何使用requests和BeautifulSoup库来爬取网页数据,并将数据存储到SQLite数据库中。

python 复制代码
# 导入必要的库
import requests
from bs4 import BeautifulSoup
import sqlite3

# 创建数据库连接
conn = sqlite3.connect('dd_articles.db')
c = conn.cursor()

# 创建表
# 表名为 dd_articles,包含 id、product_name、price 和 comments_count 字段
c.execute('''CREATE TABLE IF NOT EXISTS dd_articles (
             id INTEGER PRIMARY KEY AUTOINCREMENT,
             product_name TEXT,
             price TEXT,
             comments_count TEXT)''')

# 定义请求页面的函数
def fetch_page(url):
    try:
        # 设置请求头,模拟浏览器访问
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
        }
        # 发送GET请求
        response = requests.get(url, headers=headers)
        
        # 检查请求是否成功
        response.raise_for_status()  # 抛出HTTP错误
        
        # 返回页面的HTML内容
        return response.text
    except requests.RequestException as e:
        # 打印请求失败的信息
        print(f"Request failed: {e}")
        return None

# 定义解析HTML页面的函数
def parse_html(html):
    try:
        # 使用BeautifulSoup解析HTML
        soup = BeautifulSoup(html, 'html.parser')
        
        # 初始化列表来存储商品信息
        products = []
        
        # 寻找所有的商品元素,这里假设商品信息是在<li>标签内
        items = soup.find_all('li', class_='item')  # 根据实际网站结构调整class名
        
        for item in items:
            # 商品名称
            name = item.find('div', class_='product-name').text.strip()
            
            # 商品价格
            price = item.find('span', class_='price').text.strip()
            
            # 评论数
            comments = item.find('span', class_='comments-count').text.strip()
            
            # 将数据添加到列表中
            products.append({
                'product_name': name,
                'price': price,
                'comments_count': comments
            })
        
        # 返回所有商品的信息
        return products
    except Exception as e:
        # 打印解析HTML时发生的错误
        print(f"Error parsing HTML: {e}")
        return []

# 定义存储数据到数据库的函数
def store_data(data):
    try:
        # 插入数据到数据库
        c.executemany('INSERT INTO dd_articles (product_name, price, comments_count) VALUES (?, ?, ?)', 
                      [(d['product_name'], d['price'], d['comments_count']) for d in data])
        # 提交事务
        conn.commit()
    except sqlite3.Error as e:
        # 打印数据库操作时发生的错误
        print(f"Database error: {e}")

# 主函数
def main():
    # 设置要爬取的网页URL
    url = "http://dddddd.com/products"  # 替换为你想要爬取的网页URL
    # 获取页面内容
    html_content = fetch_page(url)
    
    if html_content:
        # 解析HTML并获取商品信息
        products = parse_html(html_content)
        
        # 存储数据到数据库
        store_data(products)
        
        # 输出结果
        for item in products:
            print(f"Product Name: {item['product_name']}\nPrice: {item['price']}\nComments Count: {item['comments_count']}\n")
    
    # 关闭数据库连接
    conn.close()

# 如果是直接运行此脚本
if __name__ == "__main__":
    # 调用主函数
    main()

这个脚本实现了以下几个功能:

  1. 创建数据库连接:连接到SQLite数据库,并创建一个用于存储商品信息的表。
  2. 请求页面:定义了一个函数fetch_page来发送HTTP GET请求,并返回HTML内容。
  3. 解析HTML:定义了一个函数parse_html来解析HTML内容,并提取出商品的名称、价格和评论数。
  4. 存储数据:定义了一个函数store_data来将提取的数据存储到数据库中。
  5. 主函数:定义了一个main函数来调用上述函数,并输出结果。

请确保在实际使用时替换URL和类名以匹配你要爬取的具体网站。此外,在运行爬虫之前,请确认所爬取的数据符合网站的robots.txt规则,并且不会侵犯任何隐私或版权法律。

相关推荐
cwj&xyp4 分钟前
Python(二)str、list、tuple、dict、set
前端·python·算法
是十一月末8 分钟前
Opencv实现图片的边界填充和阈值处理
人工智能·python·opencv·计算机视觉
Amarantine、沐风倩✨10 分钟前
设计一个监控摄像头物联网IOT(webRTC、音视频、文件存储)
java·物联网·音视频·webrtc·html5·视频编解码·七牛云存储
路在脚下@1 小时前
spring boot的配置文件属性注入到类的静态属性
java·spring boot·sql
森屿Serien1 小时前
Spring Boot常用注解
java·spring boot·后端
苹果醋32 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
Hello.Reader3 小时前
深入解析 Apache APISIX
java·apache
菠萝蚊鸭3 小时前
Dhatim FastExcel 读写 Excel 文件
java·excel·fastexcel
算法小白(真小白)3 小时前
低代码软件搭建自学第二天——构建拖拽功能
python·低代码·pyqt
唐小旭3 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python