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

爬取网页源代码

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

python 复制代码
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:搜狗搜索------保存搜索内容的页面

python 复制代码
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:百度翻译------获取翻译后的内容

python 复制代码
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

python 复制代码
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:下载图片------从豆瓣电影网站中下载一张海报

python 复制代码
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

相关推荐
waterHBO22 分钟前
python 爬虫 selenium 笔记
爬虫·python·selenium
bugtraq202114 小时前
闲鱼网页版开放,爬虫的难度指数级降低。
爬虫
Bigcrab__19 小时前
Python3网络爬虫开发实战(15)Scrapy 框架的使用(第一版)
爬虫·python·scrapy
九月镇灵将19 小时前
爬虫逆向学习(六):补环境过某数四代
爬虫·补环境·瑞数
kngines20 小时前
【PLW004】基于Python网络爬虫与推荐算法的新闻推荐平台v1.0(Python+Django+NLP+Vue+MySQL前后端分离)
爬虫·python·nlp·推荐算法
walk walk1 天前
免费爬虫软件“HyperlinkCollector超链采集器v0.1”
爬虫
亿牛云爬虫专家1 天前
如何通过subprocess在数据采集中执行外部命令 —以微博为例
爬虫·python·数据采集·多线程·代理ip·subprocess·微博
菜鸡中的奋斗鸡→挣扎鸡1 天前
初始爬虫5
爬虫