爬虫-根据书名获取其分类

背景

最近要搬家,有几十本书需要整理,想着先把他们分下类,为了避免思考哪本书应该归为哪类,想借助某买书网站的搜索来爬取相关分类信息。

目标

把实体书分类

需求分析

输入书名列表,返回书名与分类信息

系统设计

整体流程

  • 肉眼扫描书架,把书名录入文档中
  • 找一个买书网站
    • 网站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

猜你喜欢

转载自blog.csdn.net/u014704998/article/details/129855712