网络爬虫快速入门及爬取百度搜索结果(附源码)

news2024/9/19 10:47:57

前言

爬虫的基本结构及工作流程

1. 确定目标

首先,确定你想要爬取的目标,包括目标网站或网页、需要提取的数据类型(如文本、图片、视频等)以及爬取的深度(单页、整个网站等)。

2. 获取网页内容

使用HTTP请求获取网页内容。这通常涉及发送GET或POST请求到目标网址。

3. 解析网页内容

解析获取的网页内容以提取有用的数据。这通常需要解析HTML或其他标记语言。

4. 数据提取

从解析后的网页内容中提取你需要的数据,如文本、链接、图片URL等。

5. 数据存储

将提取的数据存储到合适的地方,如文件、数据库或内存中。

6. 异常处理和日志记录

处理可能出现的异常情况,如网络错误、网页结构变更等,并记录日志以便后续分析和调试。

网络爬虫的基本工作流程:

初始化爬虫:设置初始URL和其他配置参数。

发送HTTP请求:使用HTTP库发送请求获取网页内容。

解析网页:使用解析库(如BeautifulSoup、lxml等)解析网页内容。

数据提取:根据网页结构从解析后的内容中提取数据。

存储数据:将提取的数据存储到文件、数据库或其他数据存储介质中。

检查结束条件:根据设定的结束条件(如爬取深度、时间限制等)决定是否继续爬取。

异常处理:处理可能出现的异常,并记录日志。

循环爬取:根据上述步骤循环执行,直到满足结束条件。

urllib网络请求库

urllib 是 Python 标准库中的一个模块,用于处理与 URL 相关的请求。它提供了一系列的模块来进行各种网络操作,如发送 HTTP 请求、处理 cookie、处理 URL 解析等。

urllib 主要模块:

  • urllib.request: 用于打开和读取 URL。
  • urllib.error: 包含 urllib.request 产生的异常。
  • urllib.parse: 用于解析 URL。
  • urllib.robotparser: 用于解析 robots.txt 文件。

主要功能:

1. 发送 HTTP 请求

urllib.request.urlopen() 方法可以用于发送 HTTP GET、POST、PUT、DELETE 等请求。

from urllib import request

with request.urlopen('https://www.example.com') as response:
    html = response.read()
    print(html)
2. URL 解析

urllib.parse 模块提供了 urlparse()urljoin() 等函数,用于解析和构造 URL。

from urllib.parse import urlparse, urljoin

parsed_url = urlparse('https://www.example.com/path?query=value')
print(parsed_url.scheme)  # 输出:'https'
print(parsed_url.netloc)  # 输出:'www.example.com'
print(parsed_url.path)    # 输出:'/path'
print(parsed_url.query)   # 输出:'query=value'

base_url = 'https://www.example.com'
absolute_url = urljoin(base_url, '/path')
print(absolute_url)  # 输出:'https://www.example.com/path'
3. 处理异常

urllib.error 模块定义了与 urllib.request 相关的异常,如 HTTPErrorURLError 等。

from urllib import request, error

try:
    response = request.urlopen('https://www.nonexistent.com')
except error.URLError as e:
    print(f"Failed to reach the server: {e.reason}")
4. 处理 Cookie

虽然 urllib 提供了基本的 Cookie 支持,但它的功能相对有限。在处理复杂的 Cookie 操作时,可能需要使用 http.cookiejar 模块。

from urllib import request, parse

url = 'https://www.example.com/post_endpoint'
data = {'key': 'value'}

# 将字典类型的数据转换为 URL 编码的字符串
data = parse.urlencode(data).encode()

req = request.Request(url, data=data, method='POST')
with request.urlopen(req) as response:
    print(response.read().decode())

requests 网络请求库

requests 是被广泛使用的 HTTP 客户端库,它提供了简洁的 API,使得发送 HTTP 请求变得容易和直观。相较于 Python 的内置库 urllibrequests 更为友好、功能丰富。

安装

你可以使用 pip 来安装 requests

pip install requests

请求网页的原理及流程

原理:

requests 库基于 urllib3,它是一个更低级别的库,提供了对 HTTP 连接的封装和管理。当你发送一个 HTTP 请求时,requests 会使用 urllib3 来建立连接、发送请求和接收响应。

流程:
  1. 创建会话(Session):使用 requests.Session() 创建一个会话对象,这允许你在多个请求之间保持 cookies 和其他状态。

  2. 构建请求:使用 requests.get(), requests.post(), requests.put() 等方法构建和发送 HTTP 请求。这些方法接受 URL、参数、头部、数据等参数。

  3. 发送请求requests 库会处理与服务器的连接、请求头、数据传输等细节,然后发送 HTTP 请求。

  4. 接收响应:一旦服务器响应,requests 会接收并处理响应,提供响应状态码、头部、内容等信息。

  5. 数据处理:你可以直接访问响应内容,或使用 json()textcontent 等方法获取内容。

  6. 关闭会话:对于使用了会话的情况,最后需要关闭会话以释放资源。

主要功能

简单易用的 APIrequests 提供了简单直观的 API,使得发送 HTTP 请求变得非常容易。

多种请求方法:支持 GET、POST、PUT、DELETE、HEAD 等多种 HTTP 请求方法。

自动解码:自动处理响应内容的编码,如 UTF-8。

文件上传:支持文件上传,包括表单和多部分上传。

会话管理:支持会话(Session),允许在多个请求之间保持 cookies、身份验证等状态。

SSL 证书验证:支持 SSL 证书验证,并提供了快速和简便的方式来处理 SSL/TLS 连接问题。

连接池管理:自动管理 HTTP 连接池,提高请求效率。

重定向和历史:自动处理 HTTP 重定向,并记录请求的历史。

异常处理:定义了一组异常类,如 requests.exceptions.RequestException,方便错误处理。

应用代码: 

# 发送 GET 请求
response = requests.get('https://www.baidu.com')
print(response.status_code)
print(response.text)

# 发送 POST 请求
data = {'key': 'value'}
response = requests.post('https://www.baidu.com/post', data=data)
print(response.json())

# 文件上传
files = {'file': open('file.txt', 'rb')}
response = requests.post('https://www.baidu.com/upload', files=files)
print(response.text)

# 会话管理
with requests.Session() as session:
    session.get('https://www.example.com/login', params={'username': 'user', 'password': 'pass'})
    response = session.get('https://www.example.com/dashboard')
    print(response.text)

Postman 简介

Postman 是一个流行的 API 测试工具,它提供了一个直观、用户友好的界面,用于创建、测试和管理 HTTP 请求和 API。无论是测试 RESTful API、SOAP 服务还是 HTTP 请求,Postman 都为开发人员、测试人员和 API 设计者提供了一个强大的平台。

主要功能:

创建和发送请求:支持各种 HTTP 请求方法(如 GET、POST、PUT、DELETE、PATCH 等),并允许自定义请求头、请求参数、请求体等。

自动化测试:可以创建测试脚本来验证 API 的响应,例如检查响应状态码、响应时间、JSON 断言等。

环境和变量:支持环境变量和全局变量,方便管理不同环境(如开发、测试、生产)的配置。

集合和集合运行器:允许将相关的 API 请求组织成集合,并使用集合运行器批量运行这些请求。

数据驱动:支持 CSV 和 JSON 数据文件,可以使用这些文件进行数据驱动的测试。

身份验证:支持各种身份验证方式,如基本认证、摘要认证、OAuth 1.0、OAuth 2.0 等。

自定义脚本:使用 JavaScript 脚本,可以进行高级的数据处理和测试逻辑。

历史记录和收藏夹:保存你发送过的请求和响应,方便后续查看和复用。

团队协作:支持团队协作,可以与团队成员共享集合、环境和测试脚本。

 使用步骤:

  1. 打开 Postman:安装完成后,打开 Postman 应用。

  2. 创建请求:在新建请求页签中,选择 HTTP 请求方法(如 GET、POST),输入 URL、请求头、请求体等。

  3. 发送请求:点击“发送”按钮,发送请求并查看响应。

  4. 测试和验证:在“测试”选项卡中,编写测试脚本来验证 API 响应。

  5. 保存和分享:将请求保存到集合中,或分享给团队成员。

  6. 管理环境和变量:在“环境”选项卡中管理环境变量和全局变量。

演示实用教程

以百度为例:

通过Postman测试访问情况: 

返回数据内容:

所以Postman 是一个非常强大和灵活的 API 测试工具,它的直观界面和丰富的功能使得 API 测试和开发变得更加高效和便捷。无论你是开发人员、测试人员还是 API 设计者,都会发现 Postman 是一个不可或缺的工具,同时也是爬虫工程师必不可少的工具。

爬取百度搜索结果(附源码)

 模拟用户搜索并解析搜索结果页面,未为了模拟更真实的用户请求,我们可以添加一些请求头信息,如用户代理、Referer、以及可能的其他请求头,以更好地模拟浏览器发出的请求。

# -*- coding:utf-8 -*-
import requests
from lxml import etree
import time
import os

class BaiDu_Spider(object):
    def __init__(self, keyword):
        """初始化方法,设置基本属性和 URL"""
        self.base_url = 'https://www.baidu.com/s?wd={}'
        self.keyword = keyword
        self.url = self.base_url.format(self.keyword) + '&pn={}&ie=utf-8'

    def get_html(self, page):
        """发送请求获取页面内容,并解析页面内容"""
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'
        }
        try:
            # 发送 GET 请求
            r = requests.get(self.url.format(page), headers=headers)
            
            # 检查响应状态码,如果不是 200,则抛出异常
            r.raise_for_status()
            
            # 设置编码
            r.encoding = 'utf-8'
            
            # 使用 lxml 解析页面内容
            res = etree.HTML(r.text)
            
            # 提取搜索结果
            selector = res.xpath('//div[@id="content_left"]/div[@class="result c-container new-pmd"]')
            data_list = []
            for data in selector:
                item = {
                    'title': ''.join(data.xpath('./h3/a/text()')),
                    'link': ''.join(data.xpath('./h3/a/@href'))
                }
                data_list.append(item)
            
            # 检查是否有下一页,返回搜索结果和是否有下一页的标志
            flag = res.xpath('//div[@id="page"]/div/a[last()]/text()')
            return data_list, bool(flag)
        
        except requests.RequestException as e:
            # 捕获 requests 异常
            print(f"An error occurred: {e}")
            return [], False
        
        except Exception as e:
            # 捕获其他异常
            print(f"An unexpected error occurred: {e}")
            return [], False

    def save_data(self, item):
        """保存数据到文件"""
        with open(crawl_result, 'a', encoding='utf-8') as f:
            data = f"{item['title']}\t{item['link']}"
            print(data)
            f.write(data + '\n')

def main():
    """主函数,控制爬虫流程"""
    n = 0
    while True:
        # 获取当前页的搜索结果和是否有下一页的标志
        data_list, flag = spider.get_html(n)
        
        # 遍历搜索结果,并保存数据
        for data in data_list:
            spider.save_data(data)
        
        # 延迟 2 秒
        time.sleep(2)
        
        # 如果有下一页,继续爬取;否则退出
        if flag:
            n += 10
        else:
            print(f'程序已经退出,在{int(n / 10) + 1}页......')
            break

if __name__ == '__main__':
    # 设置搜索关键词和保存数据的文件路径
    keyWord = 'Python'
    crawl_result = os.path.join(os.getcwd(), f'crawl_{keyWord}.txt')  # 获取当前目录并设置文件路径
    
    # 创建爬虫对象并运行主函数
    spider = BaiDu_Spider(keyWord)
    main()

 注意:百度的反爬虫机制可能会检测和阻止过于频繁或异常的请求,为了避免被封 IP,建议添加适当的延迟或使用代理 IP,并尽量模拟人类的搜索行为。此外,上述代码中的解析逻辑仍基于当前的搜索结果页面结构,如果百度更新了页面结构,可能需要更新解析逻辑。

今天的内容分享到这里了,创作不易,感谢大家的三连哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1617629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为智算产业高质量发展探寻路径,又一重要生态合作启动

4月22日,由中国工业经济联合会主办的“2024中国工业经济高峰论坛智能算力产业高质量发展论坛”落幕。院士专家、研究机构、以及来自智能算力产业上下游企业代表近180人出席,围绕完善算力基础设施、深化算力赋能行业应用、推动区域数字化发展等热点议题展…

【MySQL 数据宝典】【磁盘结构】- 005 Undo log 撤销日志

一、基本介绍 ​ 每当我们要对一条记录做改动时(这里的改动可以指 INSERT 、 DELETE 、 UPDATE ),都需要留一手 -> 把回滚时所需的东西都给记下来 ​ 你插入一条记录时,至少要把这条记录的主键值记下来,之后回滚的…

大数据技术应用实训室解决方案

一、大数据课程体系 1.1 大数据实验实训课程体系设计依据 大数据实验实训课程体系的设计依据主要围绕培养目标、培养方案和课程体系建设三个方面来展开。 1、培养目标 大数据实验实训课程的设计旨在培养具备大数据理论知识和实践技能的专业人才。具体而言,这些人才…

刷课必备!用Python实现网上自动做题

前言 开学少不了老师会布置一些 软件上面的作业,今天教大家用python制作自动答题脚本,100%准确率哦喜欢的同学记得关注、收藏哦 环境使用 Python3.8Pycharm 模块使用 import requests —> 数据请求模块 pip install requestsimport parsel —>…

TypeError: FormatCode() got an unexpected keyword argument ‘verify‘

背景 使用mmdet3d调试项目,提示下面的错误 笔者使用的mmcv版本为mmcv-full1.4.0 原因分析 从截图中可以看出错误出现在/usr/local/lib/python3.8/dist-packages/mmcv/utils/config.py的第496行:text, _ FormatCode(text, style_configyapf_style, v…

环回光模块

👏📍环回光模块(Lookback),也称为光模块自环测试回路器,用于测试系统或网络中的信号回传。通过回传信号(主要是成对连接发射端到接收端的一侧),可以检测网络链路中各种潜…

java网络编程 BufferedReader的readLine方法读不到数据且一直阻塞

最近在整理Java IO相关内容,会遇到一些以前没有注意的问题,特此记录,以供自查和交流。 需求: 基于Java的BIO API,实现简单的客户端和服务端通信模型,客户端使用BufferedReader的readLine方法读取System.i…

​「Python绘图」绘制皮卡丘

python 绘制皮卡丘 一、预期结果 二、核心代码 import turtle print("开始绘制皮卡丘") def getPosition(x, y):turtle.setx(x)turtle.sety(y)print(x, y)class Pikachu:def __init__(self):self.t turtle.Turtle()t self.tt.pensize(3)t.speed(190)t.ondrag(getP…

隋总分享:Temu选品师算不算是蓝海项目?

在当今日新月异的互联网经济浪潮中,跨境电商正成为一股不可忽视的力量。最近,网红隋总对Temu选品师这一职业进行了深入介绍,引发了广泛关注。那么,Temu选品师是否真的可以视为一个蓝海项目呢?本文将对此进行一番细致的探讨。 首先…

python学习笔记B-08:序列结构之列表--列表的遍历操作

列表的遍历操作主要通过以下三种方法实现。 lst list("hello") print("第一种遍历方式,使用for循环,循环变量item直接就是lst中的元素") for item in lst:print(item,end"\t")print("\n\n第二种遍历方式&#xff0…

【HarmonyOS】Stage 模型 - 基本概念

一、项目结构 如图1所示: 图1 从项目结构来看,这个应用的内部包含了一个子模块叫 entry,模块是应用的基本功能单元,它里面包含源代码、资源、配置文件等。 像这样的模块在应用内部可以创建很多。但模块整体来讲就分成两大类&am…

unity中重构(分拆)输入代码

codemonkey的混乱厨房第14节,讲述了怎么来重构代码。 目的:是减少和管理的复杂性,每个类只做一件事,只能做一件事 重构思路分析: 空对象 挂着新类脚本 新类{ 公开方法 public 带返回值 } --------------------------…

【大模型开源篇1】彦宏您怎么看LLaMA3的开源

Meta LLaMA是Meta公司开源的大模型,作为大模型开源界得鼻祖, 刚刚发布LLaMA3。从ChatGPT 拉开了大模型竞赛的序幕,Meta 选择了开源,至此大模型也开始百花齐放的时期,但是开源模型一直无法超过必源模型,如今…

2024最新Notepad++ 的下载、安装及配置

Notepad是一款免费且开源的文本和源代码编辑器,支持多种编程语言。它运行在MS Windows环境下,使用GPL许可证发布。由于其轻量级和高效性,成为了许多开发者的首选工具。 下载地址:「Notedpad」, 链接:https…

报销管理如何秒变高效神器?

一、客户介绍 易快报作为业界知名的企业报销管理平台,一直致力于为企业提供高效、便捷的报销服务。随着业务的不断扩展,易快报面临着与多个外部系统进行数据交互的需求,以提升工作效率和减少数据差错。中信建投作为国内领先的金融机构&#…

GLID: Pre-training a Generalist Encoder-Decoder Vision Model

1 研究目的 现在存在的问题是: 目前,尽管自监督预训练方法(如Masked Autoencoder)在迁移学习中取得了成功,但对于不同的下游任务,仍需要附加任务特定的子架构,这些特定于任务的子架构很复杂&am…

关于C++STL的总结(基础使用和底层原理)

STL是什么? STL即(Standard Template Library)标准模板库,提供了常见的数据结构和算法函数等,其下共包含六大组件: 容器算法迭代器仿函数适配器空间配置器 本篇重点介绍容器的使用和简单的底层实现原理&…

不容忽视的听力“杀手”

音乐与短视频已成为现代生活的重要组成部分,许多人在繁忙的日常中依赖耳机来获得片刻的宁静或激情。然而,我们也需要警惕,不当的耳机使用可能对我们的听力造成风险。长时间以高音量使用耳机,无疑会对听力构成挑战。 *图片源于网络…

贪吃蛇项目实战——学习详解

前言:贪吃蛇是一个经典的游戏, 本节将使用c语言实现一个简易的的贪吃蛇小游戏。 本节内容适合已经学完c语言还有数据结构链表的友友们。 我们要实现的贪吃蛇是在控制台进行游戏的。 它运行起来是这样的: 贪吃蛇 那么, 为了实现这个小游戏。 我…

图解KMP算法——字符串搜索

原文:最初发布地址 一、问题描述 来源:Leetcode 难度:中等 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 hays…