Python爬虫:开启数据抓取的奇幻之旅(一)

目录

一、爬虫初印象:揭开神秘面纱​

二、工欲善其事:前期准备​

(一)Python 环境搭建​

1.下载 Python 安装包:​

2.运行安装程序:​

3.配置环境变量(若自动添加失败):​

(二)开发工具推荐​

1.PyCharm:​

2.Jupyter Notebook:​

(三)必备库安装​

1.requests 库:​

2.BeautifulSoup4 库:​

3.Scrapy 框架:​

4.Selenium 库:​

三、爬虫原理剖析:探寻内在机制​

(一)发起请求​

(二)获取响应​

(三)解析内容​

(四)保存数据​


 

一、爬虫初印象:揭开神秘面纱​

在互联网这个广袤无垠的信息宇宙中,数据如同繁星般璀璨繁多。而 Python 网络爬虫,就像是一位神秘而强大的 “数据探险家”,能够按照既定规则,自动穿梭于网络世界,抓取我们所需的数据。​

从定义上来说,网络爬虫是一种自动化程序,它模仿人类在浏览器中的操作行为,向网页服务器发送请求,获取网页内容,并对这些内容进行解析和提取,从而获取有价值的数据。你可以把它想象成一个勤劳的小蜜蜂,在万维网这个大花园里,不知疲倦地采集着 “数据花蜜”。​

Python 作为当下最热门的编程语言之一,在爬虫领域有着无可比拟的优势。首先,Python 的语法简洁明了,就像一本通俗易懂的故事书,即使是编程小白也能轻松上手。相比其他编程语言,Python 代码量更少,结构更加清晰,这使得开发者能够更快速地编写和调试爬虫程序,大大提高了开发效率。例如,在 Python 中,使用requests库发送一个 HTTP 请求只需要短短一行代码:response = requests.get(url),简洁高效,一目了然。​

其次,Python 拥有丰富的爬虫库和框架,这些强大的工具就像是给爬虫配备了各种神奇的装备,让它在数据抓取的道路上如虎添翼。比如BeautifulSoup库,它可以轻松地解析 HTML 和 XML 文档,提取出我们需要的数据,就像一把精准的手术刀,能够在复杂的网页结构中准确地 “切割” 出所需信息;Scrapy框架则提供了更高级的功能,如分布式爬取、自动处理请求队列、中间件机制等,使得我们可以构建大规模、高性能的爬虫系统。​

此外,Python 还具备强大的数据处理和分析能力,这对于爬虫获取到的数据后续处理非常关键。借助Pandas和NumPy等库,我们可以对爬取到的数据进行清洗、筛选、聚合和可视化等操作,将原始数据转化为有价值的信息,为数据分析和决策提供有力支持。而且,Python 拥有庞大的开发者社区和丰富的资源,当我们在开发爬虫过程中遇到问题时,可以很容易地在社区中寻求帮助,借鉴其他开发者的经验和解决方案。​

二、工欲善其事:前期准备​

(一)Python 环境搭建​

在正式开启 Python 网络爬虫之旅前,我们首先得搭建好 Python 运行环境,这就好比为爬虫打造一个坚固的 “战车”。​

1.下载 Python 安装包:​

打开浏览器,访问 Python 官方网站(https://www.python.org/downloads/ )。在下载页面,你会看到不同版本的 Python 可供选择。强烈推荐下载最新的稳定版本,因为新版本通常会修复一些旧版本的漏洞,并且增加了新的功能。如果你不确定选择哪个版本,一般来说,选择带有 “Python 3.x” 字样的版本即可,目前 Python 3.10 及以上版本都是不错的选择 。根据你的操作系统(Windows、Mac OS 或 Linux),点击相应的下载链接。例如,在 Windows 系统下,你可以选择 “Windows installer (64-bit)” 下载 64 位的安装包,如果你的电脑是 32 位系统,则选择 “Windows installer (32-bit)” 。​

2.运行安装程序:​

下载完成后,找到下载的安装包,通常是一个以.exe结尾的文件,双击运行它。在安装向导界面,你会看到一些选项,务必勾选 “Add Python 3.x to PATH” 选项,这一步至关重要,它会自动将 Python 添加到系统的环境变量中,这样我们就可以在命令行中直接使用 Python 命令了。然后点击 “Install Now” 进行默认安装,如果你想自定义安装路径,也可以选择 “Customize installation” 来自行指定安装位置。安装过程可能需要一些时间,请耐心等待。​

3.配置环境变量(若自动添加失败):​

虽然在安装时勾选 “Add Python 3.x to PATH” 选项会自动配置环境变量,但有时可能会出现意外情况导致配置失败。这时,我们就需要手动配置环境变量。​

在 Windows 系统中,右键点击 “此电脑”,选择 “属性”,然后点击 “高级系统设置”,在弹出的窗口中点击 “环境变量” 按钮。在 “系统变量” 中找到 “Path” 变量,点击 “编辑”,在弹出的编辑环境变量窗口中,点击 “新建”,将 Python 的安装路径添加进去。例如,如果你的 Python 安装在 “C:\Python310”,就将 “C:\Python310” 和 “C:\Python310\Scripts” 添加到 Path 变量中(注意:如果你的安装路径不同,请根据实际情况修改)。添加完成后,一路点击 “确定” 保存设置。​

在 Mac OS 系统中,打开 “终端” 应用,编辑.bash_profile文件(如果没有该文件,可以创建一个)。在终端中输入nano ~/.bash_profile,然后在文件中添加export PATH="/Library/Frameworks/Python.framework/Versions/3.10/bin:$PATH"(同样,这里的路径要根据你实际安装的 Python 版本和路径进行修改),保存并退出文件(按Ctrl+X,然后按Y,最后按Enter)。最后,在终端中输入source ~/.bash_profile使配置生效。​

完成以上步骤后,打开命令行(Windows 下按Win+R,输入cmd并回车;Mac OS 下打开 “终端”),输入python --version,如果显示出你安装的 Python 版本号,恭喜你,Python 环境搭建成功!​

(二)开发工具推荐​

拥有了 Python 环境,还需要一款称手的开发工具,就像战士需要一把锋利的宝剑一样。以下两款工具在 Python 爬虫开发中备受青睐:​

1.PyCharm:​

PyCharm 是由 JetBrains 公司开发的一款专门针对 Python 的集成开发环境(IDE),功能强大到超乎想象,堪称 Python 开发者的 “瑞士军刀”。它拥有智能代码补全功能,当你输入代码时,它能自动提示可能的函数、变量和方法,大大提高了编码效率,就像有一个贴心的小助手在旁边随时提醒你一样。比如,当你输入requests.ge,它会自动提示requests.get方法,你只需按下回车键就能快速完成输入。​

它还具备强大的代码分析和调试工具。在调试爬虫程序时,你可以设置断点,逐行执行代码,观察变量的值和程序的执行流程,轻松找出代码中的问题。而且,PyCharm 支持多种 Python 框架和库,对于爬虫开发中常用的requests、BeautifulSoup等库都有很好的支持,让你可以无缝集成各种工具进行开发。此外,它还提供了丰富的插件市场,你可以根据自己的需求安装各种插件,进一步扩展其功能。​

PyCharm 适用于各种规模的项目开发,无论是小型的个人爬虫项目,还是大型的企业级数据采集系统,它都能游刃有余地应对。对于初学者来说,它友好的界面和详细的提示信息也能帮助快速上手。​

2.Jupyter Notebook:​

Jupyter Notebook 是一个开源的交互式计算环境,它以一种独特的方式展示代码和结果,就像是一个可以实时交互的笔记本。在 Jupyter Notebook 中,你可以将代码、文本、图像、数学公式等多种元素组合在一个文档中,并且可以逐行运行代码,立即看到结果,这种交互式的体验非常适合快速验证想法、进行数据分析和可视化,以及教学演示。​

例如,在进行爬虫开发时,你可以先在 Jupyter Notebook 中编写一小段代码来测试网页请求是否成功,然后逐步添加代码进行数据解析和提取,每一步的结果都能直观地展示出来,方便你随时调整和优化代码。它还支持多种编程语言,不过我们主要使用它来进行 Python 编程。​

Jupyter Notebook 特别适合数据科学和机器学习领域的项目,以及需要频繁进行代码测试和探索性开发的场景。它的分享和协作功能也非常强大,你可以将整个 Notebook 文件分享给他人,他人可以直接在自己的环境中打开并运行,方便团队之间的交流和合作。​

(三)必备库安装​

Python 的强大离不开各种丰富的库,对于网络爬虫来说,以下几个库是必不可少的 “秘密武器”:​

1.requests 库:​

requests 库是 Python 中最常用的 HTTP 请求库,它的使命就是让 HTTP 请求变得简单而优雅。使用它,你可以轻松地发送各种类型的 HTTP 请求,如 GET、POST、PUT、DELETE 等,就像给网页服务器发送一封简单的信件一样容易。例如,使用requests.get(url)就可以向指定的url发送一个 GET 请求,获取网页的内容,代码如下:

import requests

url = 'https://www.example.com'
response = requests.get(url)
if response.status_code == 200:
    print(response.text)
else:
    print(f"请求失败,状态码:{response.status_code}")

安装 requests 库非常简单,打开命令行,输入pip install requests即可完成安装。如果你的网络连接较慢,可能需要设置一下超时时间,比如pip --default-timeout=100 install requests 。​

2.BeautifulSoup4 库:​

BeautifulSoup4(简称bs4)是一个用于解析 HTML 和 XML 文档的库,它就像一把神奇的手术刀,能够将复杂的网页结构解析成一个易于操作的树形结构,让你可以轻松地提取出所需的数据。比如,你可以使用它来查找网页中的所有链接、提取特定标签的内容等。​

以下是一个简单的示例,使用BeautifulSoup4解析 HTML 文档并提取所有链接:

from bs4 import BeautifulSoup

html = """
<html>
<head>
    <title>示例网页</title>
</head>
<body>
    <a href="https://www.example1.com">链接1</a>
    <a href="https://www.example2.com">链接2</a>
</body>
</html>
"""

soup = BeautifulSoup(html, 'html.parser')
links = soup.find_all('a')
for link in links:
    print(link.get('href'))

安装BeautifulSoup4库同样使用 pip 命令:pip install beautifulsoup4 。此外,还需要安装一个解析器,常用的解析器有lxml和html.parser,可以通过pip install lxml或pip install html.parser来安装。​

3.Scrapy 框架:​

Scrapy 是一个功能强大的爬虫框架,它为我们提供了一套完整的爬虫解决方案,就像一个装备精良的战斗团队,能够帮助我们高效地构建大型、复杂的爬虫系统。Scrapy 具有分布式爬取的能力,可以利用多台计算机同时进行数据采集,大大提高了爬取效率;它还自带了自动处理请求队列、中间件机制等功能,使得爬虫的管理和扩展更加方便。​

使用 Scrapy 框架,你需要定义爬虫类,指定要爬取的网站、解析规则等。以下是一个简单的 Scrapy 爬虫示例:

import scrapy


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

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

安装 Scrapy 框架:pip install scrapy 。​

4.Selenium 库:​

Selenium 库主要用于自动化测试,但在爬虫领域也有着重要的应用。它可以模拟人类在浏览器中的操作,如点击按钮、输入文本、滚动页面等,这对于一些需要交互才能获取数据的网站非常有用。比如,有些网站的数据是通过 JavaScript 动态加载的,使用普通的爬虫库无法直接获取,这时就可以借助 Selenium 库来驱动浏览器,模拟用户操作,从而获取到完整的数据。​

使用 Selenium 库需要先安装浏览器驱动,例如 Chrome 浏览器需要下载 ChromeDriver。以下是一个使用 Selenium 打开网页并获取标题的示例:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.example.com')
print(driver.title)
driver.quit()

安装 Selenium 库:pip install selenium 。​

三、爬虫原理剖析:探寻内在机制​

(一)发起请求​

当我们使用爬虫获取网页数据时,首先要做的就是发起请求,这就好比我们去朋友家拜访,需要先敲敲门询问是否可以进入。爬虫通过 HTTP 协议向目标网站的服务器发送请求,请求中包含了很多信息,如请求的网址(URL)、请求方法(GET、POST 等)、请求头(Headers)等 。​

其中,URL 就像是朋友家的地址,明确告诉爬虫要访问哪个网页;请求方法则决定了我们以何种方式与服务器 “交流”,GET 方法通常用于获取网页的基本信息,就像我们简单地询问朋友家里的情况;POST 方法则更像是带着礼物去朋友家,它可以向服务器发送一些数据,比如登录表单中的用户名和密码等。请求头则包含了更多关于请求的细节信息,例如我们使用的浏览器类型、操作系统等,这些信息就像是我们去朋友家时的自我介绍,让服务器能够更好地 “了解” 我们的请求。​

以使用requests库发送 GET 请求为例,代码如下:

import requests

url = 'https://www.example.com'
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'
}
response = requests.get(url, headers=headers)

在这段代码中,我们定义了要访问的url,并设置了headers,模拟了一个 Chrome 浏览器的请求头,然后使用requests.get()方法发送请求,服务器会根据这个请求返回相应的内容。​

(二)获取响应​

当爬虫发送请求后,服务器会对这个请求进行处理,并返回一个响应(Response)。这个响应就像是朋友从房间里递给我们的东西,里面包含了我们请求的网页内容。响应内容可能是 HTML 格式的文本,这就像是一份详细的房屋布局图,描述了网页的结构和展示内容;也可能是 JSON 格式的数据,更像是一份简洁的物品清单,以一种结构化的方式存储着数据;还可能是二进制数据,比如图片、视频等,就像朋友给我们的一些实体物品。​

在 Python 中,使用requests库发送请求后,我们可以通过response对象来获取响应的各种信息。例如,通过response.status_code可以获取响应的状态码,200 表示请求成功,就像朋友愉快地开门迎接我们;404 表示页面未找到,意味着我们找错了地址;500 表示服务器内部错误,就像是朋友家里出了点状况。通过response.text可以获取响应的文本内容(如果是 HTML 页面,就是页面的源代码),通过response.json()可以将 JSON 格式的响应内容解析为 Python 的字典或列表对象。​

以下是获取响应内容并判断状态码的示例代码:

import requests

url = 'https://www.example.com'
response = requests.get(url)

if response.status_code == 200:
    print("请求成功,网页内容如下:")
    print(response.text)
else:
    print(f"请求失败,状态码:{response.status_code}")

(三)解析内容​

获取到响应内容后,我们需要从中提取出我们真正需要的数据,这就好比从朋友给的东西里挑选出我们感兴趣的物品。解析网页内容有多种方法,常用的有正则表达式、BeautifulSoup、XPath 等。​

1.正则表达式:正则表达式是一种强大的文本匹配工具,它使用特定的字符和规则来描述文本模式。在解析网页时,我们可以用正则表达式来匹配 HTML 文本中的特定内容。例如,要提取网页中所有的链接,可以使用类似r'href=["\'](.*?)["\']'的正则表达式。不过,正则表达式的语法相对复杂,对于复杂的网页结构,编写和调试正则表达式可能会比较困难,就像是在一堆杂乱的物品中寻找特定的东西,需要花费一些心思。​

以下是使用正则表达式提取网页链接的示例代码:

import re
import requests

url = 'https://www.example.com'
response = requests.get(url)

if response.status_code == 200:
    pattern = re.compile(r'href=["\'](.*?)["\']')
    links = pattern.findall(response.text)
    for link in links:
        print(link)
else:
    print(f"请求失败,状态码:{response.status_code}")

2.BeautifulSoup:BeautifulSoup 是一个专门用于解析 HTML 和 XML 文档的库,它将复杂的文档结构转化为一个易于操作的树形结构,就像把一堆杂乱的物品整理成一个有序的货架,我们可以方便地从中找到所需的东西。使用 BeautifulSoup,我们可以通过标签名、属性等方式轻松地查找和提取数据。比如,使用soup.find_all('a')可以找到网页中所有的<a>标签,即链接标签;使用soup.find('div', class_='content')可以找到 class 为content的<div>标签,提取其中的内容。​

以下是使用 BeautifulSoup 提取网页链接的示例代码:

from bs4 import BeautifulSoup
import requests

url = 'https://www.example.com'
response = requests.get(url)

if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')
    links = soup.find_all('a')
    for link in links:
        print(link.get('href'))
else:
    print(f"请求失败,状态码:{response.status_code}")

3.XPath:XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,它通过路径表达式来选取文档中的元素,就像在一个地图上通过坐标来找到特定的地点。例如,//a表示选取所有的<a>标签,//div[@class='content']表示选取 class 为content的<div>标签。XPath 在处理复杂的网页结构时非常强大,能够准确地定位到我们需要的数据节点 。​

以下是使用 XPath 提取网页链接的示例代码:

from lxml import etree
import requests

url = 'https://www.example.com'
response = requests.get(url)

if response.status_code == 200:
    html = etree.HTML(response.text)
    links = html.xpath('//a/@href')
    for link in links:
        print(link)
else:
    print(f"请求失败,状态码:{response.status_code}")

(四)保存数据​

解析出所需的数据后,我们需要将这些数据保存起来,以便后续使用,这就像是把挑选好的物品妥善存放起来。数据可以保存为多种格式,常见的有文本文件、CSV 文件、数据库等。​

1.保存为文本文件:将数据保存为文本文件是最基本的方式,适合保存一些简单的数据,比如提取的网页标题、文本内容等。使用 Python 的内置函数open()可以创建一个文本文件,并使用write()方法将数据写入文件。​

以下是将提取的网页标题保存为文本文件的示例代码:

from bs4 import BeautifulSoup
import requests

url = 'https://www.example.com'
response = requests.get(url)

if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')
    title = soup.title.string

    with open('title.txt', 'w', encoding='utf-8') as f:
        f.write(title)
else:
    print(f"请求失败,状态码:{response.status_code}")

2.保存为 CSV 文件:CSV(Comma-Separated Values)文件是一种常用的表格数据格式,适合保存结构化的数据,比如从网页中提取的商品列表、新闻列表等。使用 Python 的csv库可以方便地将数据保存为 CSV 文件。​

以下是将提取的商品信息保存为 CSV 文件的示例代码:

import csv
from bs4 import BeautifulSoup
import requests

url = 'https://www.example.com/products'
response = requests.get(url)

if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')
    products = []

    for product in soup.find_all('div', class_='product'):
        name = product.find('h2', class_='product-name').text.strip()
        price = product.find('span', class_='product-price').text.strip()
        products.append([name, price])

    with open('products.csv', 'w', newline='', encoding='utf-8') as f:
        writer = csv.writer(f)
        writer.writerow(['商品名称', '价格'])
        writer.writerows(products)
else:
    print(f"请求失败,状态码:{response.status_code}")

3.保存到数据库:如果数据量较大或者需要进行复杂的数据查询和管理,将数据保存到数据库是更好的选择。常见的数据库有 MySQL、MongoDB 等。以 MySQL 为例,使用pymysql库可以连接 MySQL 数据库,并将数据插入到数据库表中。​

以下是将提取的用户评论保存到 MySQL 数据库的示例代码:

import pymysql
from bs4 import BeautifulSoup
import requests

url = 'https://www.example.com/comments'
response = requests.get(url)

if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')
    comments = []

    for comment in soup.find_all('div', class_='comment'):
        author = comment.find('span', class_='comment-author').text.strip()
        content = comment.find('p', class_='comment-content').text.strip()
        comments.append((author, content))

    conn = pymysql.connect(host='localhost', user='root', password='password', database='test')
    cursor = conn.cursor()

    for comment in comments:
        sql = "INSERT INTO comments (author, content) VALUES (%s, %s)"
        cursor.execute(sql, comment)

    conn.commit()
    cursor.close()
    conn.close()
else:
    print(f"请求失败,状态码:{response.status_code}")
评论 92
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小周不想卷

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值