工作任务和目标:用户输入一个图书名称,然后程序自动从当当网批量获取图书信息
查看相关元素在源代码中的位置:
第一步:在deepseek中输入提示词:
你是一个Python爬虫专家,一步步的思考,完成以下网页爬取的Python脚本任务:
用户输入一个关键词,接受这个关键词,保存为变量{book};
在F:\aivideo文件夹里面新建一个Excel文件:{book}.xlsx
打开网页:https://search.dangdang.com/?key={book}&act=input&page_index={pagenumber}&sort_type=sort_sale_amt_desc#J_tab
({pagenumber}这个变量的值是从1到100);
网页的编码为charset=GB2312;
解析网页的源代码,并打印输出;
定位class="bigimg" 的ul 标签;
在定位ul 标签内定位所有的li 标签,
在li 标签内定位class="pic"的a标签,提取其title属性值,作为图书标题,保存到{book}.xlsx的第1列;
在li 标签内定位class="detail"的p标签,提取其文字内容,作为图书简介,保存到{book}.xlsx的第2列;
在li 标签内定位class="price">的p标签,然后定期p标签中 class="search_now_price"的span标签,提取其内容,作为图书价格,保存到{book}.xlsx的第3列;
在li 标签内定位name="itemlist-review"的a标签,提取其文字内容,作为图书评论数量,保存到{book}.xlsx的第4列;
在li 标签内定位 class="search_book_author"的p标签,定位p标签中的第1个a标签,提取其 title属性值,作为图书作者,保存到{book}.xlsx的第5列;定位p标签中的第2个a标签,提取其 title属性值,作为图书出版社,保存到{book}.xlsx的第6列;定位p标签中的第2个span标签,提取其内容,作为出版时间,保存到{book}.xlsx的第7列;
注意:
每一步都要输出相关信息到屏幕;
设置请求头,来应对反爬虫机制;
每解析一个网页后,随机等待1-10秒;
如果某个元素不存在,就跳过这个数据点。
DataFrame.append 方法在 pandas 1.4.0 版本中已经被弃用,并且在后续版本中被移除。为了解决这个问题,我们可以使用 concat 函数来代替 append
所有的代码整合在一起,不要一段一段的输出;
第二步,查看审阅deepseek生成的Python代码:
import time
import random
import requests
from bs4 import BeautifulSoup
import pandas as pd
# 设置请求头
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.3'}
# 用户输入关键词
book = input("请输入关键词: ")
# 新建Excel文件路径
excel_file_path = f"F:\\aivideo\\{book}.xlsx"
# 初始化DataFrame
df = pd.DataFrame(columns=['标题', '简介', '价格', '评论数量', '作者', '出版社', '出版时间'])
# 遍历页面
for pagenumber in range(1, 101):
# 打开网页
url = f"https://search.dangdang.com/?key={book}&act=input&page_index={pagenumber}&sort_type=sort_sale_amt_desc#J_tab"
print(f"正在打开网页: {url}")
# 发送HTTP请求
response = requests.get(url, headers=headers)
response.encoding = 'GB2312' # 设置编码为GB2312
# 解析网页
soup = BeautifulSoup(response.text, 'html.parser')
# 定位class="bigimg"的ul标签
ul_tag = soup.find('ul', class_='bigimg')
# 如果ul标签存在,定位所有的li标签
if ul_tag:
li_tags = ul_tag.find_all('li')
# 遍历li标签并提取信息
for li in li_tags:
try:
# 提取图书信息
title = li.find('a', class_='pic').get('title')
description = li.find('p', class_='detail').text.strip()
price = li.find('p', class_='price').find('span', class_='search_now_price').text.strip()
review_count = li.find('a', attrs={'name': 'itemlist-review'}).text.strip()
author = li.find('p', class_='search_book_author').find_all('a')[0].get('title')
publisher = li.find('p', class_='search_book_author').find_all('a')[1].get('title')
publish_time = li.find('p', class_='search_book_author').find_all('span')[1].text.strip()
# 保存到DataFrame
df = pd.concat([df, pd.DataFrame([[title, description, price, review_count, author, publisher, publish_time]],
columns=['标题', '简介', '价格', '评论数量', '作者', '出版社', '出版时间'])],
ignore_index=True)
except AttributeError:
print("跳过一个数据点")
continue
# 随机等待
time.sleep(random.randint(1, 10))
# 保存到Excel文件
df.to_excel(excel_file_path, index=False)
print(f"数据已保存到: {excel_file_path}")
第三步,打开visual studio code软件,新建一个py文件,将Python代码复制到这个文件中,按下F5键运行程序:
程序运行结果: