Python爬取豆瓣网图书信息
(一)爬虫思路:
# 爬虫思路汇总:
# ①,https://book.douban.com/tag/ 总书签首页
# 抓取豆瓣图书书签上所有的书签名字,并保存为一个数组
# 当输入一个标签时,根据标签去生成对应的网址。如果标签不存在数组中,提示帮助,然后显示这个标签数组内容
# ②,多线程爬取豆瓣图书信息
# 1,爬取图书名字跟作者
# 2,爬取图书对应的链接
# 3,爬取图书的简介信息
# 4,爬取图书的豆瓣评分
# ③,将数据储存在xls表格中,按标签分类命名xls文件。
# 按一定条件排序:评分或者默认排序
# 项目目的:
# ①,熟悉xpath提取与正则 ②,熟悉threading多线程
# ③,熟悉表格输出操作openpyxl模块操作
# ④,熟悉文件存取操作
本次代码通过自主学习 openpyxl 与threading模块,完成了后面部分的要求,爬取了对应的 书名—作者—豆瓣评分—参与评分总人数—地址链接,这里没有对简介信息做操作,考虑到文字太多表格存储不方便。所以就没弄了,影响不大。
(二)源代码讲解:
Ⅰ. 总标签分类的获取
-
由于时间问题,这里就直接给贴上我的源代码,个人觉得代码注释已非常详细,很容易就能看懂。
由于没有用 scrapy 框架,而是用的单个文件,所以我把 获取标签的总分类单独用一个文件来写这个程序了。然后把获取书本信息也单独用一个文件来写了。其实这个并不影响。因为我们可以通过导入文件来是两个 .py 文件能够连接起来。具体导入操作:
- 通过 sys模块来完成: 打开计算机–> cmd–>输入一下指令
# 先进入Python环境
>>> ipython
>>> import sys
>>> # 查看所有包路径
>>> sys.path
>>> # 添加刚才自己所写的包的路径
>>> sys.path.append("D://douban/")
在完成上面的添加之后,在某一个程序文件中就可以用 import 来导入我们想导入的文件了。给出我获取总分类标签的源码:
''' 将标签信息储存到表格 '''
import urllib.request
import re
from lxml import etree # 使用xpath筛选器
from user_agent.base import generate_user_agent
from openpyxl import Workbook, load_workbook # 用于创建 和 读取 表格文件
from openpyxl.styles import colors, Font, Alignment, Border, Side # 改变字体颜色,大小, 对其方式, 边框
goabal tag_list
tag_list = [] # 用来存储所有分类标签下的子标签
def url_open(url):
head = {
"User-Agent": generate_user_agent()}
req = urllib.request.Request(url, headers=head)
response = urllib.request.urlopen(req).read()
return response
# 获取首页书签,并存为表格
def get_mark(url):
response = url_open(url).decode('utf-8')
html = etree.HTML(response, parser=None, )
# 获取标签总分类的列表
categories = html.xpath('//a[@class="tag-title-wrapper"]/@name')
# 获取《文学》下的标签分类
# 匹配出文学分类下包含的所有标签内容
literature_string = re.compile('(<a name="文学" class="tag-title-wrapper">\s(\s|.)*?\s</div>)').findall(response)[0][0]
# 实例化对象为可xpath操作的对象,xpath返回列表
html = etree.HTML(literature_string, parser=None, )
literature_string = html.xpath('//td/a/text()')
# 保存第一个标签分类
yield save_main_mark(row=main_row_start, value=categories[0])
# 保存第一个标签下的子标签
yield save_mark(literature_string)
# 获取《流行》下的标签分类
popular_string = re.compile('(<a name="流行" class="tag-title-wrapper">\s(\s|.)*?\s</div>)').findall(response)[0][0]
html = etree.HTML(popular_string, parser=None, )
popular_string = html.xpath('//t