背景
最近要搬家,有几十本书需要整理,想着先把他们分下类,为了避免思考哪本书应该归为哪类,想借助某买书网站的搜索来爬取相关分类信息。
目标
把实体书分类
需求分析
输入书名列表,返回书名与分类信息
系统设计
整体流程
- 肉眼扫描书架,把书名录入文档中
- 找一个买书网站
- 网站search的url
- 查看网页html结构,看看如何取列表第一条数据
- 编写代码
- 执行
- 根据结果开始动手分类
详细设计
代码流程
- 读取书名列表
- 取一个书名
- 获取改书名搜索页
- 取出第一条数据的链接
- 访问链接,获取详情页
- 从详情页获取分类信息
- 记录分类信息
- 循环下一本书
代码
import time
import requests
from bs4 import BeautifulSoup
def get_search_content_first_detail_url(book_name):
try:
url = 'http://search.XXXX.com/?key=%s&act=input' % book_name # 网址需要替换成常用买书的url
data = requests.get(url)
soup = BeautifulSoup(data.content, "lxml")
book_list_div = soup.find("div", id="search_nature_rg")
book_list = book_list_div.find("ul").find_all("li")
for book in book_list:
a = book.find("a")
return "http:" + a["href"]
return ""
except:
return ""
def get_book_class(url):
if url == "":
return ""
try:
header = {}
header['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'
header['Accept'] = 'application/json, text/javascript, */*; q=0.01'
header['Cookie'] = 'XXX' # 自行替换,如果需要的登录的时候
data = requests.get(url, headers=header)
soup = BeautifulSoup(data.content, "lxml")
x = soup.find("li", class_="clearfix fenlei").find_all("a")
book_class_tier = []
for t in x:
book_class_tier.append(t.text)
return '/'.join(book_class_tier)
except:
return ""
file = open("book_name")
lines = file.readlines()
for line in lines:
time.sleep(1) # 请求慢点,防止封号
book_name = str.strip(line)
url = get_search_content_first_detail_url(book_name)
book_class = get_book_class(url)
print("%s\t%s" % (book_name, str.strip(book_class)))
遇到的问题
请求详情页的时候404
- 问题描述
- 浏览器访问url可以,但是python request不行,报错404
- 原因
- 服务器对于不能识别的用户来源,返回404
- 参考
- https://zhuanlan.zhihu.com/p/130405809
- 解决
- 加上请求头
- 参考:https://blog.csdn.net/lengyue1084/article/details/54946814
- 加上请求头
header = {}
header['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'
header['Accept'] = 'application/json, text/javascript, */*; q=0.01'
请求几次之后,网页需要登录
- 问题原因
- 网站需要登录
- 解决
- 登录网站
- 从请求中复制cookie
- 添加到header中
- 参考
- https://blog.csdn.net/qq_45352972/article/details/113831698