首页 > 编程语言 >超详细 Python 爬虫指南

超详细 Python 爬虫指南

时间:2024-12-09 15:01:25浏览次数:6  
标签:指南 headers Python 爬虫 url print import requests response

目录

一、爬虫的基本原理

二、爬虫实现步骤

1. 准备工作

2. 详细代码实现

三、处理反爬机制

四、爬取复杂数据的技巧

1. JSON 数据爬取

2. 分页数据爬取

3. 下载文件

五、完整爬虫示例

六、注意事项


一、爬虫的基本原理

  1. HTTP 请求与响应

    • 爬虫通过 HTTP 协议与目标网站服务器通信。
    • 发送请求时可指定 URL、请求方法(GETPOST)、请求头等。
    • 服务器根据请求返回 HTML 页面、JSON 数据或其他格式的响应。
  2. HTML 解析
    HTML 是网页的主要结构。爬虫通过解析 HTML 提取有用信息,如标题、图片、表格等。

  3. 数据存储
    抓取的数据可存储到文件(如 CSV、JSON)、数据库(如 MySQL、MongoDB)等介质中,便于后续分析。

  4. 反爬机制

    • User-Agent 检测:服务器检查请求来源是否合法。
    • 频率限制:高频访问可能触发封禁。
    • 验证码验证:部分网站通过验证码阻止自动化行为。
  5. robots.txt 协议
    网站通过 robots.txt 指定哪些页面可以被爬取,爬虫需遵守此协议。


二、爬虫实现步骤

1. 准备工作

安装必要的库:

pip install requests beautifulsoup4 lxml pandas
2. 详细代码实现

(1)发送 HTTP 请求 通过 requests 库获取网页内容。

import requests

# 定义目标 URL
url = "https://example.com"

# 设置请求头,伪装为浏览器访问
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
}

# 发送请求
response = requests.get(url, headers=headers)

# 检查状态码
if response.status_code == 200:
    print("请求成功!")
    print(response.text[:500])  # 打印部分网页内容
else:
    print(f"请求失败,状态码: {response.status_code}")

(2)解析 HTML 数据 使用 BeautifulSoup 提取 HTML 中的内容。

from bs4 import BeautifulSoup

# 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(response.text, "lxml")

# 提取网页标题
title = soup.title.string
print(f"网页标题: {title}")

# 提取所有超链接
links = []
for a_tag in soup.find_all("a", href=True):
    links.append(a_tag["href"])

print("提取到的链接:")
print("\n".join(links))

(3)存储数据 将数据保存为 CSV 文件。

import pandas as pd

# 构造数据字典
data = {"Links": links}

# 转换为 DataFrame
df = pd.DataFrame(data)

# 保存为 CSV
df.to_csv("links.csv", index=False, encoding="utf-8-sig")
print("数据已保存到 links.csv")

(4)动态网页处理 有些网页通过 JavaScript 加载数据,requests 无法直接抓取。这时需使用浏览器自动化工具,如 Selenium 或 Playwright。

以下是 Selenium 的示例:

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

# 配置 Selenium WebDriver(以 Chrome 为例)
options = webdriver.ChromeOptions()
options.add_argument("--headless")  # 无头模式
driver = webdriver.Chrome(options=options)

# 打开网页
driver.get("https://example.com")

# 等待页面加载
driver.implicitly_wait(10)

# 提取动态加载的内容
titles = driver.find_elements(By.TAG_NAME, "h1")
for title in titles:
    print(title.text)

# 关闭浏览器
driver.quit()

三、处理反爬机制

添加随机延迟 避免频繁请求被封禁:

import time
import random

time.sleep(random.uniform(1, 3))  # 随机延迟 1-3 秒

使用代理 IP 通过代理绕过 IP 封禁:

proxies = {
    "http": "http://username:password@proxyserver:port",
    "https": "http://username:password@proxyserver:port"
}

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

处理验证码 使用 OCR 识别验证码:

pip install pytesseract pillow
from PIL import Image
import pytesseract

# 读取验证码图片
image = Image.open("captcha.png")

# 使用 OCR 识别文本
captcha_text = pytesseract.image_to_string(image)
print(f"验证码内容: {captcha_text}")

 


 

四、爬取复杂数据的技巧

1. JSON 数据爬取

许多网站的动态内容通过 API 提供 JSON 数据,可以直接请求这些接口:

api_url = "https://example.com/api/data"
response = requests.get(api_url, headers=headers)

# 解析 JSON 数据
data = response.json()
print(data)
2. 分页数据爬取

自动抓取多页内容:

base_url = "https://example.com/page={}"
for page in range(1, 6):
    url = base_url.format(page)
    response = requests.get(url, headers=headers)
    print(f"抓取第 {page} 页内容")
3. 下载文件

下载图片或文件到本地:

file_url = "https://example.com/image.jpg"
response = requests.get(file_url, stream=True)

# 保存到本地
with open("image.jpg", "wb") as file:
    for chunk in response.iter_content(chunk_size=1024):
        file.write(chunk)

print("文件下载完成!")

五、完整爬虫示例

以下是一个完整的爬虫脚本,抓取新闻网站标题与链接并保存为 CSV 文件:

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import random

# 设置目标 URL 和请求头
base_url = "https://news.ycombinator.com/"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
}

# 存储数据
titles = []
links = []

# 爬取内容
for page in range(1, 4):  # 抓取前三页
    url = f"{base_url}?p={page}"
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, "lxml")
    
    for item in soup.find_all("a", class_="titlelink"):
        titles.append(item.text)
        links.append(item["href"])
    
    print(f"完成第 {page} 页爬取")
    time.sleep(random.uniform(1, 3))  # 随机延迟

# 保存数据到 CSV
data = {"Title": titles, "Link": links}
df = pd.DataFrame(data)
df.to_csv("news.csv", index=False, encoding="utf-8-sig")
print("新闻数据已保存到 news.csv")

六、注意事项

  1. 避免法律风险

    • 爬取前阅读目标网站的使用条款。
    • 遵守 robots.txt 协议。
  2. 优化性能
    使用多线程或异步技术(如 asyncioaiohttp)提高效率。

  3. 应对反爬
    熟练使用代理、延迟和伪装技巧。

 

 

 

 

标签:指南,headers,Python,爬虫,url,print,import,requests,response
From: https://blog.csdn.net/weixin_45710998/article/details/144348263

相关文章

  • python毕设的爱心捐赠物资信息管理系统5jmgw程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的不断进步和党建工作的深入发展,传统的党支部工作方式已难以满足新时代的需求。党支部作为党的基层组织,承担着党员教育、管理......
  • python毕设的汽车销售平台ou938程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着汽车产业的蓬勃发展和消费者购车需求的日益多样化,汽车销售市场迎来了前所未有的发展机遇与挑战。传统的汽车销售模式,如实体店购车,虽然......
  • python毕设的殡仪馆信息管理系统设计与实现ou64v程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景殡仪馆作为社会公共服务体系的重要组成部分,承担着为逝者提供尊严告别、为家属提供慰藉的重要职责。然而,传统的殡仪馆管理方式存在诸多不足......
  • Python-geopandas-读取MapInfor-20241209
    #读取数据,需要制定坐标格式shapefile_path=r'd:\Mapinfor\map\赣江新区新增图层.TAB'mapinfo_gdp=gpd.read_file(shapefile_path,driver="MapinfoFile")#先设置一个坐标系,否则会报提示性错误mapinfo_gdp=mapinfo_gdp.to_crs(epsg=4326)#校验坐标系,转换到目标投影......
  • 使用Python开发获取商品销量详情API接口?(一篇文章全学会)
    在现代软件开发中,API(应用程序编程接口)已成为不同软件间交互的桥梁。尤其在电商领域,API接口使得开发者能够访问和操作电商平台上的数据,如商品详情、用户评价、订单信息等。本文将详细介绍如何使用Python开发一个获取商品销量详情的API接口。一、API接口概述API(ApplicationPro......
  • python中的defaultdict([default_factory[, ...]])方法
    这个方法在_collection.py中的介绍如下:'''defaultdict(default_factory=None,/,[...])-->dictwithdefaultfactoryThedefaultfactoryiscalledwithoutargumentstoproduceanewvaluewhenakeyisnotpresent,in__getitem__only.Adefaultdict......
  • 2024年最新最全网络安全护网行动指南【附零基础入门教程】_网络安全靶场整个业务指南
    前言随着《网络安全法》和《等级保护制度条例2.0》的颁布,国内企业的网络安全建设需与时俱进,要更加注重业务场景的安全性并合理部署网络安全硬件产品,严防死守“网络安全”底线。“HW行动”大幕开启,国联易安誓为政府、企事业单位网络安全护航!,网络安全形势变得尤为复杂严峻。......
  • python语言dwtppccx代码
    importrequestsimportosfromlxmlimportetreeurl=‘https://pic.netbian.com/4kdongwu/’headers={‘User-Agent’:‘Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/131.0.0.0Safari/537.36Edg/131.0.0.0’,......
  • [笔记] Git 实战指南:Git命令大全 与 Git提交信息规范
    本文档是关于Git版本控制系统的综合指南,涵盖了从基础到高级的各种命令和最佳实践。它旨在为开发者提供一个全面的资源,帮助他们更有效地使用Git进行代码版本管理、团队协作以及项目开发。文档分为两个主要部分:Git命令大全和Git提交信息规范。Git安装文档:[笔记]W......
  • 洛谷题单指南-线段树-P1558 色板游戏
    原题链接:https://www.luogu.com.cn/problem/P1558题意解读:给定序列a[n],初始都为1,支持两种操作:1.将区间[a,b]所有值都改为c;2.查询区间[a,b]范围有多少个不同的数;输出所有操作2的结果。解题思路:又是线段树的典型应用,要支持区间修改,需要用到懒标记。首先,本题中,颜色一共有1~30种,要......