Python爬虫基础教程(1)Python爬虫常用模块:Python爬虫摸鱼指南:解锁数据冲浪的十八般武艺,附完整代码带你飞!

嘿,各位数据侠客们,是不是经常眼巴巴地看着别人家的数据报表、自动化的信息聚合,心里痒痒的?别急,今天咱就把这层神秘面纱给你掀了,让你看看Python爬虫到底有多好玩、多强大!

说白了,爬虫就是个“互联网复制粘贴小能手”,只不过咱们玩的是自动化、批量化。而Python之所以能成为爬虫界的“扛把子”,全靠它背后那一大堆好用又免费的“兵器库”——也就是我们今天要重点介绍的常用模块

准备好了吗?系好安全带,咱们发车了!

第一站:requests —— 你的网络“瑞士军刀”

如果说爬虫是去别人家“串门”,那 requests 库就是你敲门的那个“手”。它简单、优雅,是HTTP请求的绝对主力。

它能干啥?
简单说,就是你告诉它一个网址(URL),它就能帮你把网页的源代码“拿”回来,就像你在浏览器里按F12看到的那些HTML代码一样。

为啥是它?
因为它比Python自带的 urllib 库不知道高到哪里去了,代码写起来那叫一个清爽!

来,上硬菜!(完整示例)

假设咱们想偷偷去看看豆瓣读书上《三体》的页面长啥样(学习交流,绝无恶意!)。

import requests

# 目标URL,也就是我们要“敲门”的地址
url = 'https://book.douban.com/subject/2567698/'

# 非常重要的步骤:设置请求头,把自己伪装成一个“浏览器”,避免被网站直接拒之门外
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'
}

# 用requests的get方法,轻轻敲一下门
response = requests.get(url, headers=headers)

# 检查一下门开了没有(状态码200表示成功)
if response.status_code == 200:
    # 把门后的“风景”(网页源代码)打印出来
    print(response.text)
else:
    print(f'哎呀,门没开!状态码:{response.status_code}')

看,就这么几行代码,一个最简单的爬虫就诞生了! 是不是感觉已经摸到爬虫的门槛了?

第二站:BeautifulSoup —— 你的“信息提炼师”

requests 拿回来的是一大锅“原材料”(HTML代码),里面什么都有,标签、属性、文本混在一起。这时候,你就需要一个“厨师”来帮你把里面的“肉”挑出来。这个厨师就是 BeautifulSoup

它能干啥?
它能够解析HTML/XML文档,并提供了非常简单易用的方法来查找、遍历和修改文档树,帮你精准定位并提取你想要的那部分数据。

为啥是它?
语法接近人类语言,学习成本极低,对新手极其友好,堪称“爬虫界的良心”。

接着炖肉!(完整示例)

接着上面的例子,现在我们拿到了《三体》页面的HTML,我们想提取出它的书名评分

from bs4 import BeautifulSoup
import requests

url = 'https://book.douban.com/subject/2567698/'
headers = {
    'User-Agent': '你的浏览器User-Agent'
}

response = requests.get(url, headers=headers)

if response.status_code == 200:
    # 创建BeautifulSoup对象,指定解析器为'lxml'(需要额外安装:pip install lxml)
    soup = BeautifulSoup(response.text, 'lxml')

    # 找书名。通过F12检查元素,发现书名在 <h1> 标签里
    # find() 方法找到第一个匹配的标签
    title_tag = soup.find('h1')
    # 获取标签内的文本内容
    title = title_tag.get_text().strip() if title_tag else '未找到书名'
    
    # 找评分。发现评分在一个 class 为 ‘rating_num’ 的 strong 标签里
    # 可以用 .find() 配合 class_ 参数
    rating_tag = soup.find('strong', class_='rating_num')
    rating = rating_tag.get_text().strip() if rating_tag else '暂无评分'

    print(f'书名:《{title}》')
    print(f'评分:{rating}')
else:
    print('请求失败')

运行一下,你是不是就能看到《三体》的书名和评分被完美地“提炼”出来了?这种感觉,就像在沙滩上捡到了闪闪发光的贝壳,爽不爽?

第三站:lxml & XPath —— 快就一个字!

BeautifulSoup 虽然好用,但在处理超大型文档时,速度可能会稍慢。这时候,lxml 和它的好搭档 XPath 就闪亮登场了。

它能干啥?
lxml 是一个高性能的HTML/XML解析器。而 XPath 则是一门在XML文档中查找信息的语言,它路径表达式非常强大,能像定位文件路径一样精准定位节点。

为啥是它?
速度飞快,定位精准,尤其适合处理复杂结构和大量数据。

上高速了!(完整示例)

还是同样的目标,我们用 lxmlXPath 来抓取一次。

import requests
from lxml import etree

url = 'https://book.douban.com/subject/2567698/'
headers = {
    'User-Agent': '你的浏览器User-Agent'
}

response = requests.get(url, headers=headers)

if response.status_code == 200:
    # 用 lxml 的 etree 来解析HTML
    html = etree.HTML(response.text)
    
    # 使用XPath表达式来定位元素
    # 书名:在唯一的 h1 标签里
    title = html.xpath('//h1/text()')[0].strip()
    # 评分:在class为‘rating_num’的strong标签的文本里
    rating = html.xpath('//strong[@class="rating_num"]/text()')[0].strip()

    print(f'书名:《{title}》')
    print(f'评分:{rating}')
else:
    print('请求失败')

看,代码同样简洁!XPath//strong[@class="rating_num"]/text() 意思就是:“在整个文档里,找到所有 class 属性为 rating_numstrong 标签,并获取它的文本内容。” 是不是有种指哪打哪的爽快感?

第四站:Selenium —— 当爬虫“活了”

有些网站,它的数据不是一开始就躺在HTML里的,而是通过JavaScript代码动态加载的。你用 requests 直接请求,拿到的是个“空壳”。这时候,前三位大哥就有点力不从心了。

怎么办?请出我们的“影帝”—— Selenium

它能干啥?
它可以直接操控浏览器(如Chrome, Firefox),模拟真人的点击、滚动、输入等操作。能看到JS动态生成的内容,能搞定复杂的登录验证,几乎无所不能。

为啥是它?
因为它不是一个人在战斗,它背后有一个真正的浏览器!能解决最棘手的动态内容问题。

见证奇迹的时刻!(完整示例)

假设我们要爬取一个需要滚动到底部才会加载更多内容的网站。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 创建一个Chrome浏览器驱动对象
# 注意:你需要先下载对应浏览器版本的WebDriver,并放在系统路径或代码指定路径
driver = webdriver.Chrome() 

try:
    # 打开目标网址
    driver.get('https://某个动态加载的网站.com')
    
    # 等待页面某个关键元素加载完成(更智能的方式)
    # WebDriverWait(driver, 10).until(
    #     EC.presence_of_element_located((By.TAG_NAME, "body"))
    # )
    
    # 模拟滚动到页面底部,以触发加载
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)  # 等待2秒,让新内容加载
    
    # 现在,页面的所有内容(包括JS生成的)都在这里了
    page_source = driver.page_source
    
    # 接下来,你就可以用BeautifulSoup或者lxml来解析 page_source 了!
    # soup = BeautifulSoup(page_source, 'lxml')
    # ... (你的提取逻辑)

    print("动态内容获取成功!")

finally:
    # 最后一定要关闭浏览器,不然它会在后台一直开着
    driver.quit()

Selenium 就像给你的爬虫装上了眼睛和手,让它从“脚本”升级成了“机器人”。当然,威力越大,责任也越大,它的速度相对较慢,资源消耗也大,算是你的“核武器”,关键时刻再用。

综合实战:打造你的第一个迷你爬虫项目

理论说得再多,不如亲手干一票!我们来个综合小案例:爬取某个技术博客网站(假设为 example-tech-blog.com)首页的文章标题和链接。

这个案例会用到 requests + BeautifulSoup 这对黄金搭档。

import requests
from bs4 import BeautifulSoup

def scrape_tech_blog():
    url = 'https://example-tech-blog.com'  # 请替换为真实且允许爬取的网站
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
    }

    try:
        response = requests.get(url, headers=headers, timeout=5)  # 设置超时时间
        response.raise_for_status()  # 如果状态码不是200,抛出异常

        soup = BeautifulSoup(response.content, 'lxml')  # 用 response.content 获取字节内容,避免编码问题

        # 假设文章列表在 class 为 ‘post-list’ 的div里,每个文章标题都在 h2 > a 标签里
        # **重点:这里的选择器需要你根据目标网站的实际结构进行调整!**
        articles = soup.find_all('div', class_='post-list')  # 可能需要调整

        blog_posts = []
        for article in articles:
            # 在每个文章块里找 h2 标签下的 a 标签
            title_link = article.find('h2').find('a') if article.find('h2') else None
            if title_link:
                title = title_link.get_text().strip()
                link = title_link.get('href')  # 获取href属性,即链接

                # 处理相对链接(如果链接不是以http开头)
                if link and not link.startswith('http'):
                    link = requests.compat.urljoin(url, link)  # 拼接成绝对链接

                blog_posts.append({'title': title, 'link': link})

        # 打印结果
        for idx, post in enumerate(blog_posts, 1):
            print(f"{idx}. {post['title']}")
            print(f"   链接:{post['link']}\n")

    except requests.exceptions.RequestException as e:
        print(f"网络请求出错啦:{e}")
    except Exception as e:
        print(f"解析过程中出现未知错误:{e}")

if __name__ == '__main__':
    scrape_tech_blog()

运行这个脚本前,请务必:

  1. url 替换成一个真实存在的、并且允许爬取的网站。
  2. 通过浏览器F12工具,仔细分析该网站的结构,修改 soup.find_all 和后续的查找逻辑,使其匹配目标网站。
  3. 遵守网站的 robots.txt 协议,做个有道德的爬虫玩家!

结语:授人以渔,送你几条“军规”

恭喜你,看到这里,你已经不再是爬虫小白了!你已经掌握了四大神器的基本用法。但在你兴冲冲地去“浪”之前,老司机还得再啰嗦几句:

  1. 遵守规则(Robots.txt):爬之前,先看看网站根目录下的 /robots.txt 文件,人家不让爬的地方,千万别硬闯。
  2. 温柔一点(设置延迟):别用你的脚本对别人网站发起每秒几百次的疯狂请求,那叫攻击,不叫爬虫。用 time.sleep() 歇一歇,做个有礼貌的访客。
  3. 伪装到位(User-Agent & Headers):一定要设置请求头,把自己伪装成浏览器,这是最基本的“社交礼仪”。
  4. 法律与道德:爬取的数据请用于学习和合法用途,尊重版权和用户隐私,不要触碰法律红线。

爬虫的世界广阔无边,还有 Scrapy 这样的专业框架,有IP代理、验证码识别等高级话题等着你去探索。但万变不离其宗,掌握了这几个核心模块,你就已经拿到了入场券。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值