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

前言

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

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,并尽量模拟人类的搜索行为。此外,上述代码中的解析逻辑仍基于当前的搜索结果页面结构,如果百度更新了页面结构,可能需要更新解析逻辑。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

刷题之Leetcode242题(超级详细)

242.有效的字母异位词 力扣题目链接(opens new window)https://leetcode.cn/problems/valid-anagram/ 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true 示例 2…

基于51单片机的数码管显示的proteus仿真

文章目录 一、数码管二、单个数码管显示0~F仿真图仿真程序 三、数码管静态显示74HC138译码器74HC245缓冲器仿真图仿真程序 四、数码管动态显示仿真图仿真程序 三、总结 一、数码管 数码管,也称作辉光管,是一种可以显示数字和其他信息的电子设备。它的基…

Abaqus2024 安装教程(附免费安装包资源)

鼠标右击软件压缩包,选择“解压到Abaqus2024”。 鼠标右击“此电脑”,选择“属性”。 点击“高级系统设置”。 点击“环境变量”。 点击“新建”。 变量名输入:NOLICENSECHECK 变量值输入:true 然后点击“确定”。 点击“确定”。…

SD-WAN多分支组网案例分享

随着企业规模持续扩大,业务版图日益多元,多分支组网已成为企业网络建设的核心议题。如何构建高效、安全且灵活的网络连接,成为企业急需解决的关键问题。近些年,SD-WAN技术的崭露头角,为企业带来了前所未有的解决方案。…

芯片数字后端设计入门书单推荐(可下载)

数字后端设计,作为数字集成电路设计的关键环节,承担着将逻辑设计转化为物理实现的重任。它不仅要求设计师具备深厚的电路理论知识,还需要对EDA工具有深入的理解和熟练的操作技能。尽管数字后端工作不像前端设计那样频繁涉及代码编写&#xff…

PLC无线通讯技术在汽车喷涂车间机械手臂上的应用

一、项目背景 在汽车生产装配工艺中,机械臂目前已经广泛地应用于装配、搬运等工业生产中,在机械臂系列产品中,汽车喷漆自动控制喷涂机械装置以其独特的优势,能够根据油漆喷涂量的大小,严格控制喷嘴与喷漆面之间距离等…

【数据库】聊聊普通索引和唯一索引怎么选

业务场景 在实际的业务中,一般都有用户信息表,而存储的数据包括(姓名、手机号、身份证号),对于业务层面来说一个人的身份证号是唯一确定的,所以在创建表的时候,针对身份证号列就可以选择创建普通索引或唯一索引。那么…

Git 创建版本库

Git 创建版本库 | CoderMast编程桅杆Git 创建版本库 在 Git 上创建版本库有两种方式,一种是直接拷贝远程 Git 仓库到本地,另外一种是我们自己创建本地的版本库。 拷贝远程仓库 拷贝远程仓库时我们需要知道远程仓库的URL地址,直接使用如下命令…

手撕netty源码(一)- NioEventLoopGroup

文章目录 前言一、NIO 与 netty二、NioEventLoopGroup 对象的创建过程2.1 创建流程图 前言 本文是手撕netty源码系列的开篇文章,会先介绍一下netty对NIO关键代码的封装位置,主要介绍 NioEventLoopGroup 对象的创建过程,看看new一个对象可以做…

使用mapinfo软件的在线地图插件运行错误解决

使用mapinfo软件的在线地图插件运行错误解决 一、如何解决win10/win11家庭版运行MapInfo中的在线地图插件报错【unexpected error;quitting】问题?二、如何解决在线地图切换地图源时的报错问题? 一、如何解决win10/win11家庭版运行MapInfo中的…

Linux中进程和计划任务管理(2)

一.进程命令 1.lsof lsof 命令,“list opened files”的缩写,直译过来,就是列举系统中已经被打开的文件。通过 lsof 命令,我们就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件。 格式&…

Jackson 2.x 系列【31】Spring Boot 集成之字典翻译

有道无术,术尚可求,有术无道,止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址:https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 场景描述2. 案例演示2.1 修改枚举2.2 定义注解…

【python】Python学生信息管理系统(源码+报告+本地存储)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

游戏黑灰产识别和溯源取证

参考:游戏黑灰产识别和溯源取证 1. 游戏中的黑灰产 1. 黑灰产简介 黑色产业:从事具有违法性活动且以此来牟取利润的产业; 灰色产业:不明显触犯法律和违背道德,游走于法律和道德边缘,以打擦边球的方式为“…

电磁仿真--基本操作-CST-(2)

目录 1. 回顾基操 2. 操作流程 2.1 创建工程 2.2 修改单位 2.3 创建 Shape 2.4 使用拉伸 Extrude 2.5 修改形状 Modify Locally 2.6 导入材料 2.7 材料解释 2.8 材料分配 2.9 查看已分配的材料 2.10 设置频率、背景和边界 2.11 选择 Edge,设置端口 2.…

深度解读半导体测试解决方案,4月25日精彩直播即将来袭!

半导体测试需求日益复杂、量产测试要求不断提升,行业工程师应该如何应对上述难题,提升测试的质量与效率,真正做到紧跟技术前沿,掌握创新应用,有效优化测试过程并降低测试成本? 针对上述痛点,加速…

Linux进阶篇:Centos7安装与配置mysql(rpm安装方式)

Linux服务搭建篇:Centos7安装与配置mysql(rpm安装方式) MySQL是一个开源的关系型数据库管理系统,由瑞典MySQL AB公司开发,现在属于Oracle公司。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面&am…

232 基于matlab的MIMO雷达模型下一种子空间谱估计方法

基于matlab的MIMO雷达模型下一种子空间谱估计方法,采用过估计的方法,避免了信源数估计的问题,对数据协方差矩阵进行变换,构造信号子空间投影矩阵和噪声子空间投影矩阵,不需要像经典的MUSIC一样对其进行特征分解&#x…

【网络编程】Java网络编程中的基本概念及实现UDP、TCP客户端服务器程序(万字博文)

系列文章目录 【网络通信基础】网络中的常见基本概念 【网络编程】Java网络编程中的基本概念及实现UDP、TCP客户端服务器程序(万字博文) 【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制(CRC算法、MD5算法) 目录 …

SpringCloud系列(12)--服务提供者(Service Provider)集群搭建

前言:在上一章节中我们成功把微服务注册进了Eureka集群,但这还不够,虽然注册服务中心Eureka已经是服务配置了,但服务提供者目前只有一个,如果服务提供者宕机了或者流量过大,都会影响到用户即服务使用者的使…