全网最全--保姆级--爬虫--之爬取当当网的商品信息

  1. 导入必要的库:

    • requests: 用于发送 HTTP 请求获取网页内容。
    • lxml.etree: 用于解析 HTML 内容。
    • csv: 用于操作 CSV 文件。
    • urllib.parse: 用于对 URL 进行编码。
    • os: 用于操作文件系统。
  2. 设置请求头部信息 headers,模拟浏览器发送请求。

  3. 定义了一个函数 parse_html(html) 用于解析网页内容,提取书籍信息并以字典形式返回。

  4. 定义了一个保存数据的函数 save_data(),用于将解析得到的书籍信息写入 CSV 文件。

  5. 主程序逻辑在 if __name__ == '__main__': 下:

    • 用户输入要爬取的商品关键词。
    • 对关键词进行 URL 编码。
    • 指定保存结果的 CSV 文件路径,并创建文件。
    • 写入 CSV 文件的表头。
    • 循环爬取前5页的搜索结果:
      • 构造每一页的搜索结果页面 URL。
      • 发送 HTTP 请求获取页面内容。
      • 调用 save_data() 函数保存数据到 CSV 文件。
    • 关闭 CSV 文件。
      import requests
      from lxml import etree
      import csv
      import urllib.parse
      import os
      
      # 请求头部
      headers = {
          'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
      }
      
      # 解析页面函数
      def parse_html(html):
          selector = etree.HTML(html)
          book_list = selector.xpath('//*[@id="search_nature_rg"]/ul/li')
          for book in book_list:
              title = book.xpath('p[@class="name"]/a/@title')[0]
              link = book.xpath('p[@class="name"]/a/@href')[0]
              price = book.xpath('p[@class="price"]/span[@class="search_now_price"]/text()')[0]
              author = book.xpath('p[@class="search_book_author"]/span[1]/a/@title')
              if author:
                  author = author[0]
              else:
                  author = "[]"
              publish_date = book.xpath('p[@class="search_book_author"]/span[2]/text()')
              if publish_date:
                  publish_date = publish_date[0]
              else:
                  publish_date = "[]"
              publisher = book.xpath('p[@class="search_book_author"]/span[3]/a/@title')
              if publisher:
                  publisher = publisher[0]
              else:
                  publisher = "[]"
              yield {
                  '书名': title,
                  '链接': link,
                  '价格': price,
                  '作者': author,
                  '出版日期': publish_date,
                  '出版社': publisher
              }
      
      # 保存数据函数
      def save_data():
          for item in parse_html(response.text):
              writer.writerow(item.values())
      
      if __name__ == '__main__':
          key = input("输入要爬取的商品:")
          encoded_key = urllib.parse.quote(key, safe='', encoding='gbk')
      
          file_path = '结果存放路径\dangdang_books.csv'  # 存放爬取结果的文件路径
          if os.path.exists(file_path):
              os.remove(file_path)  # 如果文件已存在,先删除旧文件
          f = open(file_path, 'a', newline='', encoding='utf-8-sig')  # 打开文件准备写入
      
          writer = csv.writer(f)
          writer.writerow(['书名', '链接', '价格', '作者', '出版日期', '出版社'])  # 写入CSV文件的表头
          for page in range(1, 5):  # 遍历前5页搜索结果进行爬取
              url = f'http://search.dangdang.com/?key={encoded_key}&act=input&page_index={page}'  # 构建搜索页URL
              response = requests.get(url, headers=headers)  # 发起请求获取页面内容
              save_data()  # 解析并保存数据到CSV文件
          f.close()  # 关闭文件
      

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值