当前位置: 首页 > article >正文

python爬虫初体验(二)

Python中,每个模块都有一个内置的变量 name,用于表示当前模块的名称。当一个Python文件被执行时,Python解释器会首先将该文件作为一个模块导入,并执行其中的代码。此时,__name__的值为模块的名称。

作用

  1. 模块可被导入也可直接执行:使一个Python脚本既可以作为一个独立的程序运行,也可以被其他脚本作为模块导入。
  2. 减少全局污染:当脚本作为模块被导入时,可以避免执行不必要的代码,提高代码的整洁度和可维护性。
  3. 测试代码:可以编写一些测试代码,只在直接运行脚本时执行,而不影响作为模块导入时的行为。

使用场景

  1. 脚本和模块分离:使脚本既可以独立运行,也可以作为模块导入。
  2. 单元测试:在脚本中编写一些测试代码,只在直接运行时执行。
  3. 初始化资源:在脚本直接运行时初始化一些资源,例如数据库连接等。

示例

假设有一个Python脚本 example.py:

import csv
import requests
from bs4 import BeautifulSoup

def greet(name):
    print("Hello, {}!".format(name))

def main():
	# 检查命令行参数数量
    if len(sys.argv) < 2:
        print("Usage: python script.py <name>")
        sys.exit(1) # 退出程序,返回错误码1

	# 获取命令行参数中的名字
    name = sys.argv[1]
    # 调用greet函数
    greet(name)
    
def amazon():
  # 目标URL
  url = 'https://www.shanghairanking.cn/rankings/bcur/2024'
  # 请求头,模拟浏览器行为,防止被服务器识别为爬虫。
  headers = {
    'Connection': 'keep-alive',
    'Cache-Control': 'no-store, no-cache, must-revalidate',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate, br, zstd',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Referer': 'https://www.shanghairanking.cn/rankings/bcur/2024',
  }
  # 创建一个会话对象,保持连接
  session = requests.session()

  # 先访问一次首页,模拟用户行为
  session.get('https://www.shanghairanking.cn')

  # 发送带有headers的GET请求并获取响应内容
  resHtml = session.get(url, headers=headers).content.decode('utf-8')

  # 使用BeautifulSoup解析HTML内容
  html_soup = BeautifulSoup(resHtml, 'html.parser')

  # 查找表格中的所有行
  all_goods_li = html_soup.find('table').find_all('tr')

  # 打开CSV文件准备写入
  with open('output.csv', 'wb') as csvfile:
  	# 创建一个csv.writer对象
    csv_writer = csv.writer(csvfile)

    for row in all_goods_li:

      goods_info_list = []

      rank = row.find('div', class_="ranking")
      img_link = row.find('img')['src']
      name = row.find('span', class_='name-cn')
      tags = row.find('p', class_="tags")
      if name and img_link:

        goods_info_list.append(rank.get_text(strip=True).encode('utf-8'))
        goods_info_list.append(img_link)
        # 将name添加到列表中,并转换为UTF-8编码
        goods_info_list.append(name.get_text(strip=True).encode('utf-8'))
        goods_info_list.append(tags.get_text(strip=True).encode('utf-8'))

      csv_writer.writerow(goods_info_list)
 
# 如果此脚本被直接运行,则执行amazon函数
if __name__ == '__main__':
  main()

如果你直接运行这个脚本:

python example.py world

控制台会输出:Hello, World!

作为模块导入如果你在另一个脚本中导入 example.py:

import example
example.greet("Alice")

example.amazon()

则输出Hello, Alice!并执行amazon脚本。example.py 中的 if __name__ == '__main__': 块中的代码不会被执行,因为 example.py 是作为模块被导入的,其 __name__ 的值为 'example',而不是 '__main__'

注意事项

  • 命令行参数:确保在运行脚本时提供了正确的命令行参数。
  • 编码问题:确保使用正确的编码处理非ASCII字符。
  • 错误处理:可以添加异常处理逻辑来捕获并处理可能出现的错误。

http://www.kler.cn/a/313757.html

相关文章:

  • 《TCP/IP网络编程》学习笔记 | Chapter 8:域名及网络地址
  • C++ 数组与结构 编程练习
  • 每日一练:二分查找-搜索插入位置
  • Java的dto,和多表的调用
  • Ubuntu安装MySQL8
  • NoSQL数据库与关系型数据库的主要区别
  • Android横竖屏 mdpi hdpi xhdpi xxhdpi xxxhdpi
  • .ideavimrc在idea打不开
  • 基于NLP的对话系统开发:从零构建智能客服机器人
  • Android 如何使用jdk命令给应用/APK重新签名。
  • 云栖大会Day1:云应用开发平台 CAP 来了
  • pythonnet python图像 C# .NET图像 互转
  • FLUX.1+ComfyUI部署与使用:图像合成技术的新高度
  • 【JAVA开源】基于Vue和SpringBoot的在线文档管理系统
  • oracle dblink的使用并举例
  • Spring AOP的应用
  • 【计算机网络 - 基础问题】每日 3 题(十三)
  • 面试八股--stram 中map和flatmap的区别
  • 关于 NLP 深度学习的核心流程
  • 虚拟现实与PD协议快充
  • thinkphp 做分布式服务+读写分离+分库分表(分区)(后续接着写)
  • 【网络安全的神秘世界】攻防环境搭建及漏洞原理学习
  • LeetCode 459.重复的子字符串
  • 计算机网络分类
  • Ubuntu 22.04 源码下载、编译
  • 经典sql题(二)求连续登录最多天数用户