达永编程网

程序员技术分享与交流平台

震惊!掌握这些 Python 爬虫基础,效率飙升

在当今这个数据爆炸的互联网时代,数据的价值愈发凸显。对于咱们互联网软件开发人员而言,Python 爬虫就如同一个强大的 “数据挖掘机”,能帮我们从浩瀚的网络海洋中精准获取所需信息。今天,就给大家详细汇总一下 Python 爬虫的基础知识点。

爬虫基础概念大揭秘

(一)什么是 Python 爬虫

Python 爬虫,简单来说,就是利用 Python 编程语言编写的程序,它可以模拟人类访问网页的行为,向网站服务器发送请求,获取网页数据,并从中提取出我们需要的信息。比如说,我们想收集某电商平台上所有商品的价格和评价,爬虫就能大显身手。它可以自动访问商品页面,把这些关键信息抓取下来,为后续的数据分析等工作提供支持。

(二)爬虫的工作流程

发起请求:爬虫通过 HTTP 协议向目标网站发送请求,就像我们在浏览器地址栏输入网址后,浏览器向服务器发送访问请求一样。在 Python 中,常用 requests 库来完成这个操作。例如:

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

这里,我们使用 requests 库的 get 方法向目标网址发送了一个 GET 请求,并将服务器返回的响应结果保存在 response 变量中。

获取响应内容:如果服务器正常响应,爬虫会得到一个 Response 对象。这个对象包含了丰富的内容,可能是 HTML 格式的网页代码、JSON 格式的数据、图片、视频等。例如刚才的例子中,response.text 就可以获取到网页的 HTML 文本内容。

解析内容:从获取到的响应内容中提取出我们真正需要的数据,这就是解析的过程。对于 HTML 数据,我们可以使用正则表达式、XPath、BeautifulSoup 等工具。比如,使用 BeautifulSoup 库来解析 HTML:

from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
# 假设我们要获取网页中所有的链接
links = soup.find_all('a')
for link in links:
    print(link.get('href'))

这里,我们先将获取到的 HTML 文本用 BeautifulSoup 进行解析,然后通过 find_all 方法找到所有的<a>标签,进而提取出链接地址。

保存数据:将解析后得到的有用数据保存起来,方便后续使用。可以保存到文件中,如 CSV、TXT 等格式,也可以存储到数据库里,像 MySQL、MongoDB 等。例如,将数据保存到 CSV 文件中:

import csv
data = [['商品名称', '价格'], ['商品1', 100], ['商品2', 200]]
with open('data.csv', 'w', newline='', encoding='utf - 8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerows(data)

(三)HTTP 协议与爬虫的紧密联系

HTTP(Hypertext Transfer Protocol)即超文本传输协议,是用于传输超文本的应用层协议。爬虫通过发送 HTTP 请求来获取网页内容。

HTTP 请求:请求主要由请求行、请求头部和请求体组成。请求行包含请求方法(如 GET、POST 等)、请求的 URL 和 HTTP 协议版本。请求头部则包含了客户端向服务器传递的附加信息,像 User - Agent(用于标识客户端的类型,比如是浏览器还是爬虫程序)、Accept(告诉服务器客户端能够接受的数据类型)、Cookie(用于维持会话状态,比如登录后服务器会返回 Cookie,后续请求带上这个 Cookie 就能保持登录状态)等。而请求体仅在 POST、PUT 等方法时出现,用于传递请求参数或数据。

HTTP 响应:响应由状态行、响应头部和响应体构成。状态行包含 HTTP 协议版本、状态码和状态消息,常见的状态码如 200 表示成功,404 表示资源未找到,503 表示服务不可用。响应头部包含服务器向客户端传递的附加信息,如 Content - Type(指示响应体的数据类型,如 text/html 表示 HTML 页面,application/json 表示 JSON 数据)、Set - Cookie 等。响应体就是服务器返回给客户端的实际数据,可以是 HTML、JSON、XML 等格式。

Python 爬虫常用库深度剖析

(一)requests 库 ——HTTP 请求的得力助手

requests 库是 Python 中使用非常广泛的 HTTP 请求库,它极大地简化了 HTTP 请求的操作。

安装 requests 库:在命令行中输入pip install requests即可完成安装。

发送 GET 请求

import requests
url = 'https://www.baidu.com'
response = requests.get(url)
print(response.text)

通过这几行代码,我们就能轻松获取百度首页的 HTML 内容。

发送 POST 请求:在实际应用中,很多时候我们需要通过 POST 请求提交数据,比如模拟登录。

import requests
url = 'http://example.com/login'
data = {'username': 'your_username', 'password': 'your_password'}
response = requests.post(url, data=data)
print(response.text)

这里,我们构造了一个包含用户名和密码的字典 data,然后使用 requests 库的 post 方法向登录页面发送 POST 请求。

(二)BeautifulSoup 库 ——HTML 解析的利器

当我们获取到网页的 HTML 内容后,需要从中提取出有用的数据,BeautifulSoup 库就派上用场了。

安装 BeautifulSoup 库:在命令行中执行pip install beautifulsoup4。

解析 HTML 页面

from bs4 import BeautifulSoup
html = "<html><body><h1>标题</h1><a href='link'>链接</a></body></html>"
soup = BeautifulSoup(html, 'html.parser')
print(soup.h1)
print(soup.a.get('href'))

在这个例子中,我们首先创建了一个简单的 HTML 字符串,然后使用 BeautifulSoup 进行解析。通过 soup.h1 可以直接获取到<h1>标签的内容,通过 soup.a.get ('href') 可以获取到<a>标签的链接地址。

使用 CSS 选择器查找元素:BeautifulSoup 支持使用 CSS 选择器来查找元素,这使得我们能够更精准地定位到目标元素。例如:

soup = BeautifulSoup(html, 'html.parser')
# 查找class为'example'的div标签
divs = soup.select('div.example')
for div in divs:
    print(div)

(三)lxml 库 —— 高效的 XML 和 HTML 解析库

lxml 也是一个强大的解析库,它的解析速度非常快,在处理大规模数据时优势明显。

安装 lxml 库:通过pip install lxml进行安装。

使用 lxml 解析 HTML

from lxml import etree
html = "<html><body><h1>标题</h1><a href='link'>链接</a></body></html>"
tree = etree.HTML(html)
title = tree.xpath('//h1/text()')
link = tree.xpath('//a/@href')
print(title)
print(link)

这里我们使用 lxml 库的 etree 模块,先将 HTML 字符串转换为一个 ElementTree 对象,然后通过 XPath 表达式来提取<h1>标签的文本内容和<a>标签的链接地址。

(四)json 库 —— 处理 JSON 数据的能手

在网络数据交互中,JSON 格式的数据非常常见。Python 的 json 库可以方便地处理 JSON 数据。

解析 JSON 数据

import json
json_data = '{"name": "张三", "age": 25}'
data = json.loads(json_data)
print(data['name'])
print(data['age'])

通过 json.loads 方法,我们将 JSON 格式的字符串转换为 Python 中的字典对象,从而可以方便地访问其中的数据。

生成 JSON 数据:如果我们有一个 Python 数据结构,想将其转换为 JSON 格式的字符串,可以使用 json.dumps 方法。

import json
data = {'name': '李四', 'age': 30}
json_str = json.dumps(data)
print(json_str)

爬虫开发中的关键要点

(一)反爬机制与应对策略

常见的反爬机制

  • 验证码:网站通过设置验证码来区分是人类访问还是爬虫程序访问。比如登录页面常见的图形验证码、滑块验证码等。
  • 限制 IP 访问频率:如果某个 IP 在短时间内发送大量请求,网站可能会限制该 IP 的访问,比如封禁一段时间。
  • User - Agent 检测:网站通过检测请求头中的 User - Agent 来判断是否是爬虫。因为爬虫程序的 User - Agent 往往比较特殊,和正常浏览器的 User - Agent 有区别。

应对策略

  • 验证码处理:对于简单的图形验证码,可以使用 OCR 技术(如 Tesseract - OCR)进行识别。对于复杂的验证码,可能需要借助第三方打码平台。
  • 使用代理 IP:通过使用代理 IP,我们可以隐藏真实 IP,避免因 IP 访问频率过高被封禁。可以从一些免费或付费的代理 IP 提供商处获取代理 IP,然后在 requests 库中设置代理:
import requests
proxies = {
    'http': 'http://your_proxy_ip:port',
    'https': 'https://your_proxy_ip:port'
}
response = requests.get(url, proxies = proxies)

随机化 User - Agent:使用 fake_useragent 库可以随机生成各种浏览器的 User - Agent,使爬虫请求更像真实浏览器请求。

from fake_useragent import UserAgent
ua = UserAgent()
headers = {'User - Agent': ua.random}
response = requests.get(url, headers = headers)

(二)数据存储的选择与实践

文件存储

CSV 文件:适合存储简单的结构化数据,比如表格数据。使用 Python 的 csv 库可以方便地读写 CSV 文件。

import csv
data = [['姓名', '年龄'], ['张三', 20], ['李四', 25]]
with open('data.csv', 'w', newline='', encoding='utf - 8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerows(data)

TXT 文件:如果数据格式比较简单,只是一些文本内容,使用 TXT 文件存储即可。

content = "这是一段要存储的文本内容"
with open('text.txt', 'w', encoding='utf - 8') as txtfile:
    txtfile.write(content)

数据库存储MySQL 数据库:是一种常用的关系型数据库。使用 pymysql 库可以在 Python 中连接 MySQL 数据库并进行数据存储。

import pymysql
# 连接数据库
conn = pymysql.connect(host='localhost', user='root', password='password', database='test')
cursor = conn.cursor()
# 插入数据
sql = "INSERT INTO users (name, age) VALUES (%s, %s)"
data = ('王五', 30)
cursor.execute(sql, data)
conn.commit()
cursor.close()
conn.close()

MongoDB 数据库:属于非关系型数据库,适合存储非结构化或半结构化数据。使用 pymongo 库可以操作 MongoDB。

from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client['test']
collection = db['users']
data = {'name': '赵六', 'age': 35}
collection.insert_one(data)
client.close()

(三)并发与异步编程提升效率

在大规模数据爬取时,为了提高爬取效率,我们常常需要使用并发或异步编程技术。

多线程:Python 的 threading 库可以实现多线程编程。例如,我们可以创建多个线程同时发送 HTTP 请求:

import threading
import requests

def fetch_url(url):
    response = requests.get(url)
    print(response.text)

urls = ['https://www.example1.com', 'https://www.example2.com', 'https://www.example3.com']
threads = []
for url in urls:
    t = threading.Thread(target = fetch_url, args=(url,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

多进程:multiprocessing 库用于多进程编程。多进程可以充分利用多核 CPU 的优势,提高执行效率。

import multiprocessing
import requests

def fetch_url(url):
    response = requests.get(url)
    print(response.text)

urls = ['https://www.example1.com', 'https://www.example2.com', 'https://www.example3.com']
processes = []
for url in urls:
    p = multiprocessing.Process(target = fetch_url, args=(url,))
    processes.append(p)
    p.start()

for p in processes:
    p.join()

异步编程:asyncio 库和 aiohttp 库结合可以实现高效的异步爬虫。异步编程可以让程序在等待 I/O 操作(如 HTTP 请求响应)时,去执行其他任务,从而大大提高效率。

import asyncio
import aiohttp

async def fetch_url(session, url):
    async with session.get(url) as response:
        html = await response.text()
        print(html)

async def main():
    async with aiohttp.ClientSession() as session:
        urls = ['https://www.example1.com', 'https://www.example2.com', 'https://www.example3.com']
        tasks = [fetch_url(session, url) for url in urls]
        await asyncio.gather(*tasks)

asyncio.run(main())

掌握了这些 Python 爬虫基础知识点,相信大家在互联网软件开发工作中,面对数据获取的需求时,能够更加得心应手,开发出高效、稳定的爬虫程序,为项目的顺利推进提供有力支持。大家赶紧动手实践起来吧,在实践中不断巩固和提升自己的爬虫技能!

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言