继爬取 猫眼电影TOP100榜单 之后,再来爬一下豆瓣的书籍信息(主要是书的信息,评分及占比,评论并未爬取)。原创,转载请联系我。
需求:爬取豆瓣某类型标签下的所有书籍的详细信息及评分
语言:python
支持库:
- 正则、解析和搜索:re、requests、bs4、lxml (后三者需要安装)
- 随机数:time、random
步骤:三步走
- 访问标签页面,获取该标签下的所有书籍的链接
- 逐一访问书籍链接,爬取书籍信息和评分
- 持久化存储书籍信息(这里用了excel,可以使用数据库)
一、访问标签页面,获取该标签下的所有书籍的链接
照例,我们先看一下豆瓣的Robots.txt , 不能爬取禁止的内容。
我们这一步要爬取的标签页面,以小说为例 https://book.douban.com/tag/%E5%B0%8F%E8%AF%B4
先去看看它的HTML结构
发现,每一本书,都在一个<li>标签当中,而我们需要的只是那张图片的链接(就是书籍页面的链接)
这样,就可以写正则或者是利用bs4(BeatuifulSoup)来获取书籍的链接。
可以看到,每一页只显示了20本书,所以需要遍历访问所有的页面,它的页面链接也是有规律的。
第二页:https://book.douban.com/tag/%E5%B0%8F%E8%AF%B4?start=20&type=T
第三页:https://book.douban.com/tag/%E5%B0%8F%E8%AF%B4?start=40&type=T
即:start每次递增20就好了。
下面来看代码:
1 # -*- coding: utf-8 -*- 2 # @Author : yocichen 3 # @Email : yocichen@126.com 4 # @File : labelListBooks.py 5 # @Software: PyCharm 6 # @Time : 2019/11/11 20:10 7 8 import re 9 import openpyxl 10 import requests 11 from requests import RequestException 12 from bs4 import BeautifulSoup 13 import lxml 14 import time 15 import random 16 17 src_list = [] 18 19 def get_one_page(url): 20 ''' 21 Get the html of a page by requests module 22 :param url: page url 23 :return: html / None 24 ''' 25 try: 26 head = ['Mozilla/5.0', 'Chrome/78.0.3904.97', 'Safari/537.36'] 27 headers = { 28 'user-agent':head[random.randint(0, 2)] 29 } 30 response = requests.get(url, headers=headers, proxies={ 'http':'171.15.65.195:9999'}) # 这里的代理,可以设置也可以不加,如果失效,不加或者替换其他的即可 31 if response.status_code == 200: 32 return response.text 33 return None 34 except RequestException: 35 return None 36 37 def get_page_src(html, selector): 38 ''' 39 Get book's src from label page 40 :param html: book 41 :param selector: src selector 42 :return: src(list) 43 ''' 44 # html = get_one_page(url) 45 if html is not None: 46 soup = BeautifulSoup(html, 'lxml') 47 res = soup.select(selector) 48 pattern = re.compile('href="(.*?)"', re.S) 49 src = re.findall(pattern, str(res)) 50 return src 51 else: 52 return [] 53 54 def write_excel_xlsx(items, file): 55 ''' 56 Write the useful info into excel(*.xlsx file)