一、爬虫基础概念​

  1. 什么是爬虫?​

    • 自动化程序,模拟浏览器行为,从网页中提取目标数据。

    • 应用场景:搜索引擎、数据分析、价格监控等。

  2. 法律与道德

    • 遵守目标网站的 robots.txt 协议(如禁止爬取的路径)。

    • 避免高频访问导致服务器压力,尊重隐私和数据版权。


​二、核心技术与库​

1. ​HTTP请求​

  • ​:requests(推荐)、urllib

  • 关键点​:

    • GET/POST请求方法

    • 请求头(Headers):User-AgentCookieReferer

    • 响应状态码(200成功,404未找到等)

    import requests
    headers = {'User-Agent': 'Mozilla/5.0'}
    response = requests.get('https://example.com', headers=headers)
    print(response.text)  # 获取HTML内容

2. ​解析HTML​

  • ​:BeautifulSoup(简单易用)、lxml(高效)、re(正则表达式)

  • 示例​:

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(response.text, 'html.parser')
    titles = soup.find_all('h1', class_='title')

3. ​动态页面处理​

  • ​:Selenium(模拟浏览器)、Playwright(更现代化)

  • 适用场景​:JavaScript渲染的页面(如单页应用SPA)。

    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get('https://example.com')
    content = driver.page_source

4. ​数据存储​

  • 文本文件(.txt.csv.json

  • 数据库:sqlite3(轻量)、MySQLMongoDB

  • 示例(CSV)​​:

    import csv
    with open('data.csv', 'w', newline='') as f:
        writer = csv.writer(f)
        writer.writerow(['标题', '价格'])

​三、反爬机制与应对​

  1. 常见反爬手段

    • User-Agent检测、IP封禁、验证码、动态参数(如Token)。

  2. 应对策略

    • 设置随机User-Agent:使用 fake_useragent 库。

    • 使用代理IP:通过服务商或自建代理池。

    • 延迟请求:time.sleep(random.uniform(1,3))

    • 处理验证码:OCR识别(如pytesseract)或第三方打码平台。


​四、Scrapy框架​

  • 优势​:异步处理、中间件扩展、自动化管道。

  • 快速入门​:

    1. 安装:pip install scrapy

    2. 创建项目:scrapy startproject project_name

    3. 编写Spider:

    import scrapy
    class MySpider(scrapy.Spider):
        name = 'myspider'
        start_urls = ['https://example.com']
        def parse(self, response):
            title = response.css('h1::text').get()
            yield {'title': title}

​五、实战案例​

案例1:爬取豆瓣电影Top250

import requests
from bs4 import BeautifulSoup

url = 'https://movie.douban.com/top250'
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')

for movie in soup.select('.item'):
    title = movie.select_one('.title').text
    rating = movie.select_one('.rating_num').text
    print(f'电影:{title},评分:{rating}')

案例2:动态页面爬取(使用Selenium)

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://www.jd.com/search?q=手机')

products = driver.find_elements(By.CSS_SELECTOR, '.gl-item')
for product in products:
    name = product.find_element(By.CSS_SELECTOR, '.p-name').text
    price = product.find_element(By.CSS_SELECTOR, '.p-price').text
    print(f'商品:{name},价格:{price}')
driver.quit()

六、完整例子

# 爬虫
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
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'}


def get_html():
    url = 'https://www.baidu.com'
    response = requests.get(url, headers=headers)
    # print(response.text)  # 打印网页内容
    soup = BeautifulSoup(response.text, 'html.parser')
    # print(soup.prettify())  # 打印网页内容格式化后
    print(soup.title)  # 打印网页标题
    # 使用find_all方法找到所有a标签
    # hrefs = soup.find_all('a', class_='text-color')  # 找到所有链接
    # for href in hrefs:
    #     print(href['href'], href.text)  # 打印链接地址

    # 直接使用CSS选择器
    hrefs = soup.select('a.text-color')  # 找到所有链接
    for href in hrefs:
        print(href['href'], href.text)

# 使用 webdriver-manager 自动管理驱动
# pip install webdriver-manager
# 定义一个函数,使用selenium获取网页源代码
def get_html_selenium():
    # 使用ChromeDriverManager安装ChromeDriver
    service = Service(ChromeDriverManager().install())
    # 使用ChromeDriver创建一个webdriver对象
    driver = webdriver.Chrome(service=service)
    try:
        # 打开百度网页
        driver.get('https://www.baidu.com')
        # 打印网页源代码
        print(driver.page_source)
    finally:
        # 关闭webdriver对象
        driver.quit()


if __name__ == "__main__":
    # get_html()
    get_html_selenium()
​

七、注意事项​

  1. 频率控制​:添加延时(如 time.sleep(2)),避免被封IP。

  2. 异常处理​:捕获 requests.exceptions 中的超时、连接错误。

  3. 数据清洗​:去除HTML标签、处理编码问题(response.encoding = 'utf-8')。


通过以上步骤,你可以掌握Python爬虫的核心技术。如需更深入学习,可探索分布式爬虫(Scrapy-Redis)或逆向工程(如破解加密API参数)。