这两天爬了豆瓣读书的十万条左右的书目信息,用时将近一天,现在趁着这个空闲把代码总结一下,还是菜鸟,都是用的最简单最笨的方法,还请路过的大神不吝赐教。
第一步,先看一下我们需要的库:

import requests                       #用来请求网页
from bs4 import BeautifulSoup         #解析网页
import time          #设置延时时间,防止爬取过于频繁被封IP号
import re            #正则表达式库
import pymysql       #由于爬取的数据太多,我们要把他存入MySQL数据库中,这个库用于连接数据库
import random        #这个库里用到了产生随机数的randint函数,和上面的time搭配,使爬取间隔时间随机

我们要从这里获取所有分类的标签链接,进一步去爬取里面的信息,代码先贴上来:python入门到实战学习路线以及视频教程请加q群

import requests
from bs4 import BeautifulSoup       #导入库url="https://book.douban.com/tag/?icn=index-nav"
wb_data=requests.get(url)                #请求网址
soup=BeautifulSoup(wb_data.text,"lxml")  #解析网页信息
tags=soup.select("#content > div > div.article > div > div > table > tbody > tr > td > a")#根据CSS路径查找标签信息,CSS路径获取方法,右键-检查-copy selector,tags返回的是一个列表
for tag in tags:    tag=tag.get_text()    #将列表中的每一个标签信息提取出来helf="https://book.douban.com/tag/"   #观察一下豆瓣的网址,基本都是这部分加上标签信息,所以我们要组装网址,用于爬取标签详情页url=helf+str(tag)  print(url)    #网址组装完毕,输出

以上我们便爬取了所有标签下的网址,我们将这个文件命名为channel,并在channel中创建一个channel字符串,放上我们所有爬取的网址信息,等下爬取详情页的时候直接从这里提取链接就好了,如下:219539519 欢迎加入

channel='''   https://book.douban.com/tag/小说     https://book.douban.com/tag/外国文学    https://book.douban.com/tag/文学    https://book.douban.com/tag/随笔     https://book.douban.com/tag/中国文学    https://book.douban.com/tag/经典    https://book.douban.com/tag/日本文学    https://book.douban.com/tag/散文    https://book.douban.com/tag/村上春树    https://book.douban.com/tag/诗歌    https://book.douban.com/tag/童话    https://book.douban.com/tag/杂文    https://book.douban.com/tag/王小波    https://book.douban.com/tag/儿童文学    https://book.douban.com/tag/古典文学    https://book.douban.com/tag/张爱玲    https://book.douban.com/tag/名著    https://book.douban.com/tag/余华    https://book.douban.com/tag/当代文学    https://book.douban.com/tag/钱钟书    https://book.douban.com/tag/鲁迅    https://book.douban.com/tag/外国名著    https://book.douban.com/tag/诗词    https://book.douban.com/tag/茨威格    https://book.douban.com/tag/米兰·昆德拉    https://book.douban.com/tag/杜拉斯    https://book.douban.com/tag/港台    https://book.douban.com/tag/漫画    https://book.douban.com/tag/绘本    https://book.douban.com/tag/推理    https://book.douban.com/tag/青春    https://book.douban.com/tag/言情    https://book.douban.com/tag/科幻    https://book.douban.com/tag/东野圭吾    https://book.douban.com/tag/悬疑    https://book.douban.com/tag/武侠    https://book.douban.com/tag/奇幻    https://book.douban.com/tag/韩寒    https://book.douban.com/tag/日本漫画    https://book.douban.com/tag/耽美    https://book.douban.com/tag/亦舒    https://book.douban.com/tag/三毛    https://book.douban.com/tag/安妮宝贝    https://book.douban.com/tag/网络小说    https://book.douban.com/tag/推理小说    https://book.douban.com/tag/郭敬明    https://book.douban.com/tag/穿越    https://book.douban.com/tag/金庸    https://book.douban.com/tag/轻小说    https://book.douban.com/tag/阿加莎·克里斯蒂    https://book.douban.com/tag/几米    https://book.douban.com/tag/魔幻    https://book.douban.com/tag/张小娴    https://book.douban.com/tag/幾米    https://book.douban.com/tag/青春文学    https://book.douban.com/tag/科幻小说    https://book.douban.com/tag/J.K.罗琳    https://book.douban.com/tag/高木直子    https://book.douban.com/tag/古龙    https://book.douban.com/tag/沧月    https://book.douban.com/tag/落落    https://book.douban.com/tag/张悦然    https://book.douban.com/tag/蔡康永    https://book.douban.com/tag/历史    https://book.douban.com/tag/心理学    https://book.douban.com/tag/哲学    https://book.douban.com/tag/传记    https://book.douban.com/tag/文化    https://book.douban.com/tag/社会学    https://book.douban.com/tag/艺术    https://book.douban.com/tag/设计    https://book.douban.com/tag/政治    https://book.douban.com/tag/社会    https://book.douban.com/tag/建筑    https://book.douban.com/tag/宗教    https://book.douban.com/tag/电影    https://book.douban.com/tag/数学    https://book.douban.com/tag/政治学    https://book.douban.com/tag/回忆录    https://book.douban.com/tag/思想    https://book.douban.com/tag/中国历史    https://book.douban.com/tag/国学    https://book.douban.com/tag/音乐    https://book.douban.com/tag/人文    https://book.douban.com/tag/人物传记    https://book.douban.com/tag/戏剧          https://book.douban.com/tag/生活    https://book.douban.com/tag/成长    https://book.douban.com/tag/励志    https://book.douban.com/tag/心理     https://book.douban.com/tag/摄影    https://book.douban.com/tag/女性    https://book.douban.com/tag/职场    https://book.douban.com/tag/美食    https://book.douban.com/tag/教育    https://book.douban.com/tag/游记    https://book.douban.com/tag/灵修    https://book.douban.com/tag/健康    https://book.douban.com/tag/情感    https://book.douban.com/tag/手工    https://book.douban.com/tag/养生    https://book.douban.com/tag/两性    https://book.douban.com/tag/人际关系    https://book.douban.com/tag/家居    https://book.douban.com/tag/自助游    https://book.douban.com/tag/经济学    https://book.douban.com/tag/管理    https://book.douban.com/tag/经济    https://book.douban.com/tag/商业    https://book.douban.com/tag/金融    https://book.douban.com/tag/投资    https://book.douban.com/tag/营销    https://book.douban.com/tag/创业    https://book.douban.com/tag/理财    https://book.douban.com/tag/广告       https://book.douban.com/tag/股票    https://book.douban.com/tag/企业史    https://book.douban.com/tag/策划    https://book.douban.com/tag/科普    https://book.douban.com/tag/互联网    https://book.douban.com/tag/编程    https://book.douban.com/tag/科学    https://book.douban.com/tag/交互设计    https://book.douban.com/tag/用户体验    https://book.douban.com/tag/算法    https://book.douban.com/tag/web    https://book.douban.com/tag/科技    https://book.douban.com/tag/UE    https://book.douban.com/tag/通信    https://book.douban.com/tag/交互         https://book.douban.com/tag/UCD    https://book.douban.com/tag/神经网络    https://book.douban.com/tag/程序              '''

现在,我们开始第二个程序。

标签页下每一个图片的信息基本都是这样的,我们可以直接从这里提取到标题,作者,出版社,出版时间,价格,评价人数,以及评分等信息(有些外国作品还会有译者信息),提取方法与提取标签类似,也是根据CSS路径提取。
我们先用一个网址来实验爬取:

url="https://book.douban.com/tag/科技"
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml")
tag=url.split("?")[0].split("/")[-1]    #从链接里面提取标签信息,方便存储
detils=soup.select("#subject_list > ul > li > div.info > div.pub")  #抓取作者,出版社信息,稍后我们用spite()函数再将他们分离出来
scors=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums")   #抓取评分信息
persons=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.pl")    #评价人数
titles=soup.select("#subject_list > ul > li > div.info > h2 > a")   #书名
#以上抓取的都是我们需要的html语言标签信息,我们还需要将他们一一分离出来
for detil,scor,person,title in zip(detils,scors,persons,titles): #用一个zip()函数实现一次遍历
#因为一些标签中有译者信息,一些标签中没有,为避免错误,所以我们要用一个try来把他们分开执行   try:       author=detil.get_text().split("/",4)[0].split()[0]     #这是含有译者信息的提取办法,根据“/”  把标签分为五部分,然后依次提取出来yizhe= detil.get_text().split("/", 4)[1]            publish=detil.get_text().split("/", 4)[2]           time=detil.get_text().split("/", 4)[3].split()[0].split("-")[0]   #时间我们只提取了出版年份  price=ceshi_priceone(detil)        #因为价格的单位不统一,我们用一个函数把他们换算为“元”scoe=scor.get_text() if True else ""    #有些书目是没有评分的,为避免错误,我们把没有评分的信息设置为空    person=ceshi_person(person)      #有些书目的评价人数显示少于十人,爬取过程中会出现错误,用一个函数来处理title=title.get_text().split()[0]
#当没有译者信息时,会显示IndexError,我们分开处理except IndexError:      try:               author=detil.get_text().split("/", 3)[0].split()[0]                yizhe=""         #将detil信息划分为4部分提取,译者信息直接设置为空,其他与上面一样      publish=detil.get_text().split("/", 3)[1]                time=detil.get_text().split("/", 3)[2].split()[0].split("-")[0]                price=ceshi_pricetwo(detil)               scoe=scor.get_text() if True else ""                person=ceshi_person(person)                title=title.get_text().split()[0]       except (IndexError,TypeError):          continue
#出现其他错误信息,忽略,继续执行(有些书目信息下会没有出版社或者出版年份,但是数量很少,不影响我们大规模爬取,所以直接忽略)except TypeError:      continue#提取评价人数的函数,如果评价人数少于十人,按十人处理
def ceshi_person(person):  try:       person = int(person.get_text().split()[0][1:len(person.get_text().split()[0]) - 4])   except ValueError:       person = int(10)   return person#分情况提取价格的函数,用正则表达式找到含有特殊字符的信息,并换算为“元”
def ceshi_priceone(price):   price = detil.get_text().split("/", 4)[4].split()    if re.match("USD", price[0]):      price = float(price[1]) * 6   elif re.match("CNY", price[0]):       price = price[1]  elif re.match("\A$", price[0]):       price = float(price[1:len(price)]) * 6   else:       price = price[0]    return price
def ceshi_pricetwo(price):    price = detil.get_text().split("/", 3)[3].split()   if re.match("USD", price[0]):       price = float(price[1]) * 6   elif re.match("CNY", price[0]):       price = price[1]   elif re.match("\A$", price[0]):        price = float(price[1:len(price)]) * 6    else:       price = price[0]   return price

实验成功后,我们就可以爬取数据并导入到数据库中了,以下为全部源码,特殊情况会用注释一一说明。

import requests
from bs4 import BeautifulSoup
import time
import re
import pymysql
from channel import channel   #这是我们第一个程序爬取的链接信息
import randomdef ceshi_person(person):  try:       person = int(person.get_text().split()[0][1:len(person.get_text().split()[0]) - 4])   except ValueError:       person = int(10)   return persondef ceshi_priceone(price):   price = detil.get_text().split("/", 4)[4].split()    if re.match("USD", price[0]):      price = float(price[1]) * 6   elif re.match("CNY", price[0]):       price = price[1]  elif re.match("\A$", price[0]):       price = float(price[1:len(price)]) * 6   else:       price = price[0]    return pricedef ceshi_pricetwo(price):    price = detil.get_text().split("/", 3)[3].split()   if re.match("USD", price[0]):       price = float(price[1]) * 6   elif re.match("CNY", price[0]):       price = price[1]   elif re.match("\A$", price[0]):        price = float(price[1:len(price)]) * 6    else:       price = price[0]   return price#这是上面的那个测试函数,我们把它放在主函数中
def mains(url):wb_data = requests.get(url)soup = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml")tag=url.split("?")[0].split("/")[-1]    detils=soup.select("#subject_list > ul > li > div.info > div.pub")  scors=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums")   persons=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.pl")    titles=soup.select("#subject_list > ul > li > div.info > h2 > a")   for detil,scor,person,title in zip(detils,scors,persons,titles):l = []  #建一个列表,用于存放数据try:       author=detil.get_text().split("/",4)[0].split()[0] yizhe= detil.get_text().split("/", 4)[1]            publish=detil.get_text().split("/", 4)[2]           time=detil.get_text().split("/", 4)[3].split()[0].split("-")[0]   price=ceshi_priceone(detil)  scoe=scor.get_text() if True else ""     person=ceshi_person(person)   title=title.get_text().split()[0]   except IndexError:      try:               author=detil.get_text().split("/", 3)[0].split()[0]                yizhe=""          publish=detil.get_text().split("/", 3)[1]                time=detil.get_text().split("/", 3)[2].split()[0].split("-")[0]                price=ceshi_pricetwo(detil)               scoe=scor.get_text() if True else ""                person=ceshi_person(person)                title=title.get_text().split()[0]       except (IndexError,TypeError):          continue   except TypeError:      continuel.append([title,scoe,author,price,time,publish,person,yizhe,tag])#将爬取的数据依次填入列表中sql="INSERT INTO allbooks values(%s,%s,%s,%s,%s,%s,%s,%s,%s)"  #这是一条sql插入语句cur.executemany(sql,l)   #执行sql语句,并用executemary()函数批量插入数据库中conn.commit()#主函数到此结束# 将Python连接到MySQL中的python数据库中
conn = pymysql.connect( user="root",password="123123",database="python",charset='utf8')
cur = conn.cursor()cur.execute('DROP TABLE IF EXISTS allbooks')   #如果数据库中有allbooks的数据库则删除
sql = """CREATE TABLE allbooks(      title CHAR(255) NOT NULL,      scor CHAR(255),      author CHAR(255),     price CHAR(255),     time CHAR(255),    publish CHAR(255),     person CHAR(255),     yizhe CHAR(255),     tag CHAR(255)       )"""
cur.execute(sql)  #执行sql语句,新建一个allbooks的数据库start = time.clock()   #设置一个时钟,这样我们就能知道我们爬取了多长时间了
for urls in channel.split():    urlss=[urls+"?start={}&type=T".format(str(i)) for i in range(0,980,20)]   #从channel中提取url信息,并组装成每一页的链接for url in urlss:       mains(url)       #执行主函数,开始爬取print(url)        #输出要爬取的链接,这样我们就能知道爬到哪了,发生错误也好处理time.sleep(int(format(random.randint(0,9))))   #设置一个随机数时间,每爬一个网页可以随机的停一段时间,防止IP被封
end = time.clock()
print('Time Usage:', end - start)    #爬取结束,输出爬取时间
count = cur.execute('select * from allbooks')
print('has %s record' % count)       #输出爬取的总数目条数# 释放数据连接
if cur:   cur.close()
if conn:   conn.close()

这样,一个程序就算完成了,豆瓣的书目信息就一条条地写进了我们的数据库中,当然,在爬取的过程中,也遇到了很多问题,比如标题返回的信息拆分后中会有空格,写入数据库中会出现错误,所以只截取了标题的第一部分,因而导致数据库中的一些书名不完整,过往的大神如果有什么办法,还请指教一二。

等待爬取的过程是漫长而又欣喜的,看着电脑上一条条信息被刷出来,成就感就不知不觉涌上心头;然而如果你吃饭时它在爬,你上厕所时它在爬,你都已经爬了个山回来了它还在爬时,便会有点崩溃了,担心电脑随时都会坏掉(还是穷学生换不起啊啊啊啊~)

所以,还是要好好学学设置断点,多线程,以及正则,路漫漫其修远兮,吾将上下而求索共勉

Python爬虫——爬取豆瓣VIP书籍信息并存入数据库相关推荐

  1. python爬虫爬取ip记录网站信息并存入数据库

    1 import requests 2 import re 3 import pymysql 4 #10页 仔细观察路由 5 db = pymysql.connect("localhost& ...

  2. python爬虫-爬取当当网书籍信息存到Excel中

    文章目录 一.任务 二.分析 (一).单页面的信息分析 源代码分析 目标信息定位与分析 代码设计 (二).所有目标页面链接分析 目标链接分析 代码设计 三.注意要点 四.完整代码 五.参考 一.任务 ...

  3. Python爬虫 爬取豆瓣电影TOP250

    Python爬虫 爬取豆瓣电影TOP250 最近在b站上学习了一下python的爬虫,实践爬取豆瓣的电影top250,现在对这两天的学习进行一下总结 主要分为三步: 爬取豆瓣top250的网页,并通过 ...

  4. python爬虫爬取豆瓣电影排行榜并通过pandas保存到Excel文件当中

    我们的需求是利用python爬虫爬取豆瓣电影排行榜数据,并将数据通过pandas保存到Excel文件当中(步骤详细) 我们用到的第三方库如下所示: import requests import pan ...

  5. Python爬虫爬取豆瓣电影评论内容,评论时间和评论人

    Python爬虫爬取豆瓣电影评论内容,评论时间和评论人 我们可以看到影评比较长,需要展开才能完整显示.但是在网页源码中是没有显示完整影评的.所以我们考虑到这部分应该是异步加载的方式显示.所以打开网页的 ...

  6. python爬虫爬取豆瓣读书Top250

    python爬虫爬取豆瓣读书Top250 话不多说,直接上代码! from urllib.request import urlopen, Request from bs4 import Beautif ...

  7. python 爬虫 爬取高考录取分数线 信息

    原文链接: python 爬虫 爬取高考录取分数线 信息 上一篇: axios 原生上传xlsx文件 下一篇: pandas 表格 数据补全空值 网页 https://gkcx.eol.cn/scho ...

  8. Python 爬虫第三步 -- 多线程爬虫爬取当当网书籍信息

    XPath 的安装以及使用 1 . XPath 的介绍 刚学过正则表达式,用的正顺手,现在就把正则表达式替换掉,使用 XPath,有人表示这太坑爹了,早知道刚上来就学习 XPath 多省事 啊.其实我 ...

  9. python BeautifulSoup爬取豆瓣电影top250信息并写入Excel表格

    豆瓣是一个社区网站,创立于2005年3月6日.该网站以书影音起家,提供关于书籍,电影,音乐等作品信息,其描述和评论都是由用户提供的,是Web2.0网站中具有特色的一个网站. 豆瓣电影top250网址: ...

  10. python爬虫爬取58同城租房信息(使用动态IP)输出Excel文件

    python爬虫爬取58同城信息(使用动态IP) 新手,为了做一个数据分析,搞了几天,终于搞出来了,大家可以给点意见啊. # coding=utf-8 import sys import csv im ...

最新文章

  1. [UE4]UMG和关卡坐标变换、旋转小地图
  2. 2021-04-21--中标麒麟--yum源修改
  3. Cascade R-CNN
  4. java:蓝桥杯 矩阵乘法
  5. linux内核重要结构体,Linux中list_head结构体相关 | 技术部落
  6. ASP.NET MVC从数据库读取、存入图片
  7. iPhone 13系列电池容量最高4350mAh 较iPhone 12提升近20%
  8. Tiktok下载量激增至20亿次,视频带货或将席卷海外,跨境电商的风口
  9. 上位机与1200组态步骤_图解组态王一组态王软件
  10. percona 5.7.11root初始密码设置
  11. Java面试题总结(附答案)
  12. android: unexpected end of stream
  13. 区块链教程之Bitcoin公钥和地址生成
  14. 计算机开机按f1,电脑开机要按f1怎么解决 开机按F1的各种解决方法整理
  15. 微信群运营怎么做?一文讲透社群活跃技巧及发展模式
  16. Serdes基础知识汇总
  17. POJ 1637 混合图的欧拉回路 + Dinic
  18. android 判断键盘是否弹起
  19. 让您的照片动起来first motion model(1)-关键点抽取模型深度解析
  20. 推断基因调控网络的算法的评估

热门文章

  1. 【与奥斯丁的二十种邂逅】-- 得克萨斯首府的小情调城市游 (介绍你在奥斯丁必须做的,推荐做的,和做了你就牛掰了的20件事)...
  2. 【Structure Light】reading notes(一)
  3. [乡土民间故事_徐苟三传奇]第四回_张员外受骗摔新锅
  4. sentencePiece入门小结
  5. ubuntu18.04搜狗收入法失效
  6. Python中列表,元组,字典的一些基本用法
  7. 用例图、功能模块图和数据库的区别
  8. win10 将中文名修改成英文名
  9. YOLOV5 网络模块解析
  10. 经典谢幕千千静听(最终版本)7.0.4 去广告增强版下载