欢迎大家关注我的微信公众号!
名称:爬虫与地理信息

一、爬取思路分析

1.URL链接地址分析

首先打开豆瓣图书Top250主页:https://book.douban.com/top250,鼠标滑到页面下方可以看见有页面选项,我们通过点击不同页面即可发现url链接地址的变化规律。

查阅前三页的url分别如下,可以发现一直变化的为最后一个参数start,其值的变化规律为25*(n-1),n为页数,依此我们可以构造出所有的url。


2.网页源码分析

鼠标右击检查或按F12打开调试页面,通过定位我们发现书籍信息位于tr标签内,每一本书对应一个tr标签。因此,我们的爬取思路是:首先获取所有的tr标签,然后通过在tr标签中定位查找每本书的详细信息即可。

接下来,以获取书籍作者、出版社等信息为例来介绍各项信息的定位查找,如下图所示:作者等信息位于tr标签下的一个p标签里面。我们分别采用XpathBeautifulSoup两种方法进行定位,Xpath路径为://tr//p[@class=“pl”]//text(),BeautifulSoup路径为:tr.find(‘p’,class_=‘pl’).string。其他封面照片、书名、评分、短评等信息可以类似进行定位查找。

二、核心代码

涉及知识点:requests、html、Xpath、BeautifulSoup、csv

1.获取网页内容
def getHtml(url):user_agent = random.choice(USER_AGENTS)headers = {'User-Agent': user_agent,#'Cookie':' '}try:response = requests.get(url, headers=headers, timeout=5)response.raise_for_status()# text属性类型为stringtext = response.text# print(text)return textexcept:print("爬取失败!")
2.获取书籍信息

Xpath方法:

def parse_page_Xpath(text):html = etree.HTML(text)book_info_list = []trs = html.xpath("//table/tr")for tr in trs:name = tr.xpath('./td/div/a/@title')[0].strip()img = tr.xpath("./td//a/img/@src")[0].strip()writer_line = tr.xpath("./td//p[@class='pl']//text()")[0].replace(" ", "").split("/")[0]if ']' in writer_line:writer = writer_line.split(']')[1]country = writer_line.split(']')[0].replace("[","").replace("]","")else:writer = writer_linecountry = r"中国"score = tr.xpath("./td//span[@class='rating_nums']/text()")[0].strip()nums = tr.xpath("./td//span[@class='pl']/text()")[0].replace('(','').replace(')','').strip()comment_list = tr.xpath("./td/p/span[@class='inq']/text()")if len(comment_list) > 0:comment = comment_list[0].strip()else:comment = ""#book_info = "《" +name+ "》" + "" + writer + "" + score + "" + nums + "" + comment + "" + img + "\n"book_info = "《" + name + "》" + ',' + writer + ',' + country + ',' + score + ',' + nums + ',' + comment + ',' + imgbook_info_list.append(book_info)#print(book_info)return book_info_list

BeautifulSoup方法:

def parse_page_BS(text):book_info_list = []soup =  BeautifulSoup(text, 'lxml')trs = soup.find_all('tr', class_='item')for tr in trs:name = tr.find('div', class_='pl2').find('a')['title']img_src = tr.find('img')['src']writer_line = tr.find('p', class_='pl').string.strip()if ']' in writer_line:writer = writer_line.split(']')[1]country = writer_line.split(']')[0].replace("[","").replace("]","")else:writer = writer_linecountry = r"中国"score = tr.find('span', class_='rating_nums').string.strip()nums = tr.find('span', class_='pl').string.strip().replace('(', '').replace(')', '').strip()comment_line = tr.find('span', class_='inq')if comment_line is None:comment = ""else:comment = comment_line.stringbook_info = "《" + name + "》" + ',' + writer + ',' + country + ',' + score + ',' + nums + ',' + comment + ',' + img_srcbook_info_list.append(book_info)#print(book_info)return book_info_list
3.下载封面照片
def save_image(i, book_info_list):index = i * 25 + 1for line in book_info_list:img_url = line.split(",")[-1]img_name = str(index) +"." + line.split(",")[0].strip().replace("《","").replace("》","") + ".jpg"print(img_name + " " + img_url)index += 1photo_dir = "豆瓣图书排行榜250\\"if not os.path.exists(photo_dir):os.makedirs(photo_dir)img_full_name = os.path.join(photo_dir, img_name)#time.sleep(1)try:user_agent = random.choice(USER_AGENTS)headers = {'User-Agent': user_agent}pic = requests.get(img_url, headers=headers)if not os.path.exists(img_full_name):with open(img_full_name, 'wb') as f:f.write(pic.content)f.close()print(img_url + ":图片下载成功!")except:print(img_url + ":图片下载失败!")
4.保存到文件

保存txt文件

def save_txt(i, book_info_list, fname):print("开始写入文件......")index = i * 25 + 1with open("./豆瓣图书250.txt", 'a+', encoding='utf-8') as f:for line in book_info_list:line = str(index) + " " + line + "\n"f.write(line)index += 1print("写入文件完成!")

保存csv文件

def save_csv(i, book_info_list, fname):print("开始写入文件......")index = i * 25 + 1f = open(fname, 'a+', encoding='utf-8', newline="")csv_writer = csv.writer(f)#csv_writer.writerow(["序号","书名", "作者", "国籍", "评分", "人数", "评语","封面图片地址"])for line in book_info_list:line = str(index) + "," + lineprint(line)index += 1csv_writer.writerow(line.split(','))f.close()print("写入文件完成!")
5.爬虫主函数
def spider(page_nums):print("爬虫开始......")url = "https://book.douban.com/top250?start={}"for i in range(0,page_nums):full_url = url.format(i * 25)# print(full_url)print("爬取第 "+ str(i+1) +" 页")tag = random.randint(1,3)time.sleep(tag)text = getHtml(full_url)#Xpath解析方法#book_info_list = parse_page_Xpath(text)#BS解析方法book_info_list = parse_page_BS(text)fname = "./豆瓣图书250.csv"#保存txt文件#save_txt(i, book_info_list, fname)# 保存CSV文件#save_csv(i, book_info_list, fname)save_image(i, book_info_list)print("爬虫结束!")

三、结果展示

1.txt文件

2.csv文件

3.封面照片

Python爬虫|豆瓣图书Top250相关推荐

  1. Python爬虫豆瓣电影top250

      我的另一篇博客,Python爬虫豆瓣读书评分9分以上榜单   有了上次的基础,这次简单爬了下豆瓣上电影TOP250,链接豆瓣电影TOP250.   打开链接,查看网页源代码,查找我们需要的信息的字 ...

  2. python爬虫豆瓣读书top250+数据清洗+数据库+Java后端开发+Echarts数据可视化(一)

    由于刚上完了商业智能实训的课程,根据老师的要求我们做了一个完整的项目. 1. 项目要求与内容 项目具体要求:利用python爬取数据并进行清洗和预处理,将清洗后的数据存到数据库中,后端利用Java或是 ...

  3. python爬虫豆瓣读书top250+数据清洗+数据库+Java后端开发+Echarts数据可视化(二)

    之前的博客已经写了python爬取豆瓣读书top250的相关信息,接下来继续看如何清洗数据. 如果有没看懂的或是不了解上一部分说的是什么内容的,请看https://blog.csdn.net/qq_4 ...

  4. python爬虫豆瓣读书top250+数据清洗+数据库+Java后端开发+Echarts数据可视化(四)

    之前的博客已经写了python爬取豆瓣读书top250的相关信息和清洗数据.将数据导入数据库并创建相应的数据表,以及进行项目准备工作,接下来开始正式编写后台代码. 如果有没看懂的或是不了解上一部分说的 ...

  5. python爬虫-豆瓣电影Top250

    豆瓣电影Top250 一.准备环境 idea+python插件/python 一.需求分析 1. 运用代码获取豆瓣电影Top250里面电影的相关信息: 影片详情链接: 影片名称: 影片图片链接: 影片 ...

  6. python爬虫豆瓣图书评价_Python爬虫入门-爬取豆瓣图书Top25

    代码如下: from bs4 import BeautifulSoup import requests ready_url="https://book.douban.com/top250?s ...

  7. python 豆瓣电影top250_[python爬虫]豆瓣电影Top250简单数据分析绘图

    一:简介 通过抓取豆瓣电影Top250的数据,分别进行了三个数据统计,分别是:上榜的电影上映的年份,该年份总共上榜的电影数量,数量为0的就没有统计了:各个国家地区出品的电影数量:250部电影的各个类型 ...

  8. python爬虫豆瓣网TOP250电影海报图片

    最近打算用爬虫爬取一些资料,主要是图片来扩充数据库 先用一些文字信息练手 还是第三方的requests好用呢,比python自带的urllib 好用呢 import requests from bs4 ...

  9. python获取网站代码_python爬虫1——获取网站源代码(豆瓣图书top250信息)

    # -*- coding: utf-8 -*- import requests import re import sys reload(sys) sys.setdefaultencoding('utf ...

最新文章

  1. Proxmox 使用nfs备份及存储iso
  2. jquery eaayui 学习(三)tab
  3. 多项式幂函数(加强版)
  4. ios模拟器的路径-打开沙盒路径
  5. mysql常见的运算符及使用
  6. SPAW Editor .NET Edition v.2乱用:使用代码调整编辑器高度
  7. 去除序号(正则表达式with sublime text)
  8. Wi-Fi 6 认证计划启动:开启 Wi-Fi 新纪元
  9. 信息安全技术(黑客攻防) 入门
  10. charles安卓抓包步骤详解
  11. 如何申请公网IP资源
  12. 网红漏洞“致远OA系统上的GetShell漏洞”详解
  13. Eclipse Mars2在线安装svn详细步骤
  14. Android工程师进阶第五课 多线程锁,线程池和DVM/ART优化
  15. 你们还不了解YUM的使用?那就看看这篇文章把~
  16. 二叉树的遍历(前序遍历,中序遍历,后序遍历)
  17. javaweb网页上传图片并显示在页面上,并在服务端存到磁盘(base64编码解码)
  18. 火狐浏览器下载文件名乱码
  19. qt Type defaults to ‘int‘ in declaration of
  20. Python序列数据类型

热门文章

  1. 移位运算为什么比乘法除法快
  2. php 邮件群发功能,php实现邮件群发
  3. 计算机大专学历,2019如何应届毕业薪水过万!
  4. Ubuntu22.04 用 `hwclock` 或 `timedatectl` 来设置RTC硬件时钟为本地时区
  5. COM Interop入门
  6. docker容器运行不退出的方法
  7. 虚幻C++入门个人笔记(3)——接口、智能指针、动画蓝图、行为树、EQS系统
  8. 硬盘数据恢复原理与方法(一)
  9. windows Bat 批命令 教程
  10. MySQL数据库 -- 库和表的操作