爬取的目标对象:豆瓣图书标签: 历史 (douban.com)
关于豆瓣历史书籍
爬取该标签下的书籍信息,这里不做保存处理,只打印显示信息。
首先它是分成许多页的,
第一页的链接:https://book.douban.com/tag/%E5%8E%86%E5%8F%B2
第二页: https://book.douban.com/tag/%E5%8E%86%E5%8F%B2?start=20&type=T
第三页: https://book.douban.com/tag/%E5%8E%86%E5%8F%B2?start=40&type=T
第四页: https://book.douban.com/tag/%E5%8E%86%E5%8F%B2?start=60&type=T
可以看到第一页除外,其它的只有start=不同,都是20的倍数,把start=0试一下确实是第一页
可以猜测:tag就是标签标签后面到?之间的就是 '历史' 的某种编码。每一页有20本书籍
开发者win+F12,点击元素(有些是元素英文的自己去翻译翻译吧)
找到对应的位置点击一下箭头位置(ctrl+shift+c)
然后再用鼠标定位到你所需要提取信息的位置,他就会变色,再点击一下,开发者页面的元素就会跳转到对应的位置
同样的你把鼠标放到哪里,网页对应的位置也会变颜色
可以知道在如图中的 li标签里面就包含一本书的所有信息
图片链接
同理得到其它信息
豆瓣有反爬机制,要伪装。
做一个请求头headers,这里只需要User-Agent即可。
import requests import re # 改变start=的值就可以改变页数但要记住,必须是20的倍数 url='https://book.douban.com/tag/%E5%8E%86%E5%8F%B2?start=0&type=T' # 请求头变量 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62' } # 这里的headers参数就是伪装成浏览器请求头的参数,向服务器请求 response = requests.get(url,headers=headers) text = response.text ''' re解析网页 ''' # 必须要有""否则匹配不到。 # 有些事杂余的书本名字,试出来是[:20],下面有些也有此情况,就不一一解释了 book_title = re.findall('title="(.*?)"',text)[:20] # 书籍图片链接 book_pic_src = re.findall('src="(.*?)"',text)[7:-6] # 出版信息,要加\n和空格(数量一致)要不然会返回空,你也可以通过其它方法试一下 book_pub = re.findall('<div class="pub">\n \n \n (.*?)\n',text) # 评价分数 book_rating_nums = re.findall('<span class="rating_nums">(.*?)</span>',text) # 评价人数 book_number = re.findall('<span class="pl">\n (.*?)\n',text) # 遍历 for i in range(len(book_title)): print('--------------------------- 每本书的分界线 ---------------------------') print('书名:',book_title[i]) print('书本图片链接:',book_pic_src[i]) print('出版信息:',book_pub[i]) print('豆瓣评分:',book_rating_nums[i]) print('评价人数:',book_number[i]) 运行结果:(部分,太长无法全部截取)
这里就不存储了,感兴趣可以尝试一下。可以去找那种豆瓣电影top250的爬虫代码,一般都会有存储。