-
导入必要的库:
requests
: 用于发送 HTTP 请求获取网页内容。lxml.etree
: 用于解析 HTML 内容。csv
: 用于操作 CSV 文件。urllib.parse
: 用于对 URL 进行编码。os
: 用于操作文件系统。
-
设置请求头部信息
headers
,模拟浏览器发送请求。 -
定义了一个函数
parse_html(html)
用于解析网页内容,提取书籍信息并以字典形式返回。 -
定义了一个保存数据的函数
save_data()
,用于将解析得到的书籍信息写入 CSV 文件。 -
主程序逻辑在
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() # 关闭文件