网络爬虫入门(学习笔记)

爬取网页源代码

        抓取百度首页的HTML源代码,并将其保存到一个名为baidu.html的文件中。打开这个文件,可以看到一个和百度首页一模一样的页面。

from urllib.request import urlopen

# 发送请求并获取响应
response = urlopen("http://www.baidu.com")

# 读取响应内容并解码为字符串
web_content = response.read().decode("utf-8")

# 将抓取到的网页内容保存到文件中
with open("baidu.html", mode="w", encoding="utf-8") as file:
    file.write(web_content)

网页请求过程

F12的使用、HTTP协议

        可以使用Chrome浏览器,按下F12打开开发者工具。

Elments:JavaScript代码以及用户操作之后显示的页面效果
Console:运行JavaScript代码片段,显示网页运行时的日志、错误和警告信息

Sources:查看和调试网页的源代码文件

Network:查看网页的所有网络请求

         HTTP(HyperText Transfer Protocol,超文本传输协议)是用于传输超文本(如HTML)的应用层协议,是现代Web通信的基础。它定义了客户端(如Web浏览器)和服务器之间如何请求和传递数据。
        HTTP协议把一条消息分为三大块内容,无论是请求还是响应都是三块内容。 

  • 请求行:请求方式(get/post),请求url地址,协议版本
  • 请求头:提供了附加信息,帮助服务器处理请求
  • 请求体 :一般放一些请求参数
  • 状态行 :协议版本,状态码,状态文本 
  • 响应头:提供了一些附加信息,帮助客户端处理响应
  • 响应体 :服务器返回的真正客户端要用的内容(HTML,json)等

求头的重要内容

  • User-Agent:标识请求的来源,告诉服务器客户端的身份
  • Referer:指示当前请求的来源页面URL,用于防盗链和反爬虫,服务器可以通过Referer头判断请求是否合

  • Cookie:存储和传递会话信息和用户信息,通常用于身份验证和跟踪用户状态。在爬虫中,通过设置合适的Cookie,可以模拟登录后的状态,访问需要身份验证的页面。

响应头的重要内容

  • cookie: 本地字符串数据信息(用户登录信息, 反爬的token)
  • 各种字符串,防止攻击和反爬

请求方式

  • GET

    • 作用:请求从服务器获取资源。
    • 特点:参数包含在URL中,适合请求静态资源或查询操作。
    • 用途:爬取网页内容,获取数据。
  • POST

    • 作用:向服务器提交数据。
    • 特点:参数包含在请求体中,适合提交表单、上传文件等操作。
    • 用途:模拟用户登录,提交表单数据。

requests入门

案例1:搜狗搜索——保存搜索内容的页面 

import requests
import time
import random

# 提示用户输入搜索关键字
search_query = input("请输入你要搜索的内容:")

# 构造请求URL
url = f"https://www.sogou.com/web?query={search_query}"

# 定义请求头,模拟浏览器请求
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 "
                  "Edg/126.0.0.0 ",
    "Referer": "https://www.sogou.com/",
    "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
    "Accept-Encoding": "gzip, deflate, br, zstd"
}

# 使用会话对象来管理Cookies和保持状态
session = requests.Session()

# 发送GET请求并获取响应
response = session.get(url, headers=headers)

# 检查响应状态码,确保请求成功
if response.status_code == 200:
    # 打开一个文件,用于保存响应内容
    with open("sogou_search_results.html", mode="w", encoding="utf-8") as file:
        # 将响应内容写入文件
        file.write(response.text)
    print("搜索结果已保存到sogou_search_results.html文件中。")
else:
    # 如果请求失败,打印错误信息
    print(f"请求失败,状态码: {response.status_code}")

# 增加请求间隔,模拟真实用户行为
time.sleep(random.uniform(1, 3))

请输入你要搜索的内容:你好
搜索结果已保存到sogou_search_results.html文件中。 

案例2:百度翻译——获取翻译后的内容

import requests

# 提示用户输入要翻译的英语单词
english_word = input("请输入你要翻译的英语单词:")

# 准备POST请求的数据
data = {
    "kw": english_word  # 请求参数,与抓包工具里的参数一致
}

# 发送POST请求到百度翻译的sug接口
response = requests.post("https://fanyi.baidu.com/sug", data=data)

# 解析返回的JSON数据
response_json = response.json()

# 打印返回字典中第一个数据的翻译内容
if response.status_code == 200:
    if 'data' in response_json:
        first_translation = response_json['data'][0]['v']
        print(f"翻译结果: {first_translation}")
    else:
        print("未找到相关翻译结果。")
else:
    print(f"请求失败,状态码: {response.status_code}")

请输入你要翻译的英语单词:hello
翻译结果: int. 打招呼; 哈喽,喂; 你好,您好; 表示问候 n. “喂”的招呼声或问候声 vi. 喊“喂

案例3:豆瓣电影——保存豆瓣电影分类排行榜(剧情片 )的top100

import csv
import requests

# 请求URL和参数
url = 'https://movie.douban.com/j/chart/top_list'
params = {
    'type': '11',        # 类型,这里是剧情片类型
    'interval_id': '100:90',  # 评分区间,表示评分在90到100之间
    'action': '',        # 动作参数,此处为空
    'start': '0',        # 开始取数据的索引,从第一部电影开始取
    'limit': '100',       # 每次取出的电影数量
}

headers = {
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
}

# 发送GET请求并获取响应
response = requests.get(url=url, params=params, headers=headers)

# 将响应内容保存为JSON文件
if response.status_code == 200:
    data = response.json()
    with open('./douban_movies.csv', 'w', encoding='utf-8', newline='') as csvfile:
        fieldnames = ['rank', 'title', 'score', 'types', 'regions', 'release_date', 'actors']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

        writer.writeheader()
        for movie in data:
            writer.writerow({
                'rank': movie['rank'],
                'title': movie['title'],
                'score': movie['score'],
                'types': '/'.join(movie['types']),
                'regions': '/'.join(movie['regions']),
                'release_date': movie['release_date'],
                'actors': '/'.join(movie['actors']),
            })

    print('电影数据已保存到 douban_movies.csv 文件中。')
else:
    print(f'请求失败,状态码: {response.status_code}')


电影数据已保存到 douban_movies.csv 文件中。

案例4:下载图片——从豆瓣电影网站中下载一张海报 

import requests


def download_image(url, file_name):
    try:
        # 发送GET请求获取图片数据
        response = requests.get(url)
        if response.status_code == 200:
            # 从URL中提取文件名作为保存的文件名,将图片内容写入文件
            with open(file_name, mode="wb") as f:
                f.write(response.content)    # 字节
            print(f"图片已保存为 {file_name}")
        else:
            print(f"请求失败,状态码: {response.status_code}")
    except requests.exceptions.RequestException as e:
        print(f"请求异常: {e}")


# 示例:从豆瓣中下载一张电影海报
image_url = "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg"
file_name = "Example.jpg"

download_image(image_url, file_name)

图片已保存为 Example.jpg 

相关推荐

  1. 爬虫学习笔记

    2024-07-19 05:42:03       52 阅读
  2. 爬虫学习笔记-站长素材网站图片下载

    2024-07-19 05:42:03       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 05:42:03       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 05:42:03       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 05:42:03       62 阅读
  4. Python语言-面向对象

    2024-07-19 05:42:03       72 阅读

热门阅读

  1. Perl 语言的特点

    2024-07-19 05:42:03       23 阅读
  2. Spark SQL----CREATE TABLE

    2024-07-19 05:42:03       16 阅读
  3. IntelliJ IDEA 和 Eclipse的区别

    2024-07-19 05:42:03       24 阅读
  4. 【Android】基础—基本布局

    2024-07-19 05:42:03       15 阅读
  5. Docker & Ubuntu & Milvus 2.4 windows 详细安装攻略

    2024-07-19 05:42:03       16 阅读
  6. c# excel转pdf

    2024-07-19 05:42:03       20 阅读
  7. (二)C++之类与对象

    2024-07-19 05:42:03       21 阅读
  8. C++派生类对基类成员的访问

    2024-07-19 05:42:03       21 阅读
  9. junit mockito service

    2024-07-19 05:42:03       22 阅读
  10. MySQL为什么使用B+树而不是跳表?

    2024-07-19 05:42:03       20 阅读