python爬虫初体验(二)

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

作用

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

使用场景

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

示例

假设有一个Python脚本 example.py

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

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

sh 复制代码
python example.py world

控制台会输出:Hello, World!

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

python 复制代码
import example
example.greet("Alice")

example.amazon()

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

注意事项

  • 命令行参数:确保在运行脚本时提供了正确的命令行参数。
  • 编码问题:确保使用正确的编码处理非ASCII字符。
  • 错误处理:可以添加异常处理逻辑来捕获并处理可能出现的错误。
相关推荐
李航1983几秒前
用 DeepDraw 几何引擎开发建筑设计软件(五):创建选择工具
python·3d
Metaphor6926 分钟前
使用 Python 设置 Excel 行列自适应 【代码示例】
python·excel
花酒锄作田9 小时前
FastAPI 使用 session 认证
python·fastapi
lsswear9 小时前
Python 并发 线程
开发语言·python
Ivanqhz9 小时前
MLIR OpBuilder
开发语言·python·mlir
威联通安全存储11 小时前
TS-h2287XU-RP 在家电制造总装与质检数据场景的部署
python·制造
泡泡鱼(敲代码中)12 小时前
Python 字符串 str 完整学习笔记
python·学习
troy12812 小时前
Python 基础语法(八):Web 后端开发、数据分析与可视化、网络爬虫、人工智能 / 大模型应用
前端·python·数据分析
码农学院12 小时前
企业官网改版GEO实战:把 Blazor SPA 改造成 AI 爬虫可读的预渲染方案
人工智能·爬虫·geo
我不会起名字32212 小时前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣