python制作一个简单的书单爬虫

python制作一个简单的豆瓣书单爬虫


运行环境

  • python3
  • request库
  • BeautifulSoup
  • re库(正则库) 点这里
  • os库(文件操作)

预备知识

  • python基础语法
  • html(css)基础

认识python

Python 简介:

Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。

Python 是交互式语言: 这意味着,您可以在一个Python提示符,直接互动执行写你的程序

总而言之,python是一门非常非常容易上手的语言

学习python:

1 . python列表

序列(List[ ])是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。
Python有6个序列的内置类型,但最常见的是列表和元组。
序列都可以进行的操作包括索引,切片,加,乘,检查成员
点这里

2 . while循环

Python While 循环语句
Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为:

    while (count < 9):
       print 'The count is:', count
       count = count + 1

3 . for循环

Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串。

for循环的语法格式如下:

    for iterating_var in sequence:
     statements(s)`

4 . 函数

定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:

函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。

return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None

    def printme( str ):
        "打印传入的字符串到标准显示设备上"
        print str
        return

要补充的是:
代码缩进很重要!
代码缩进很重要!
代码缩进很重要!

5 . 接下来自己看 = =

html--DOM:

dom_icon

每个网页都是由这类结构组成的,每个元素的构成稍作了解

BeautifulSoup

首先要解释下库的作用,我对库的理解就是一个封装好了的工具箱,大家可以非常方便的调用里面的函数,
bs4呢,就是一个可以让你非常方便的获取到文档中元素的具体位置的一个函数库>bs4官方文档

代码实现

爬取目标如下:豆瓣250

不和你多bb,终于到编写代码的阶段了,我们分布解析这个程序

  1. 导入库

     import urllib.request
     import re
     import os
     from bs4 import BeautifulSoup
    
  2. 打开文件

     fu=open('book.html','w')    ##新建文件book.html
     fu.write('<html>\n')    ##写入html格式
     fu.write('<body>\n')
     fu.write('<p align="center">\n')
     fu.write("\t\t-------豆瓣最受欢迎图书Top150-------\n\n")
     fu.write("</p>\n")
     fu.write('<table>\n')
     print("正在爬取书单中.......\n\n\n")
    
  3. 爬取书单

     while m<=125:
         L1=[] ##读者评价列表
         L2=[] ##图书信息
         L3=[] ##图书名称
         L4=[] ##读者评分    
         url="https://book.douban.com/top250?start="+str(m)  
         ##拼接页码参数
         req = urllib.request.Request(url)
         page = urllib.request.urlopen(req)  
         #链接网页
         
         soup=BeautifulSoup(page,"html.parser")  
         ##用python自带的htmlparser解析器读取网页,并用bs4进行解析
         
         
         sentence=soup.find_all('span',class_="inq") ##获取读者评价
         information=soup.find_all("p",class_="pl")  ##获取图书信息
         book=soup.findAll('a',attrs={"href":re.compile(r'https://book.douban.com/subject/.*/'),"title":re.compile(r'.*')})  ##图书名称
         rate=soup.findAll('span',class_='rating_nums')  ##读者评分
         ##寻找参数
    
         for i in sentence:
             L1.append(i.get_text())  ##添加到列表尾端
         for j in information:
             L2.append(j.get_text())
         for p in book:
             L3.append(p.get_text()+'$')
         temp=''.join(L3)    ##列表转字符串
         c=temp.replace('\n','').replace(' ','').rstrip('$').split('$')  ##用replace去除空格等无用字符
         for q in rate:
             L4.append(q.get_text())
         b=zip(c,L4,L2,L1)   #列表用zip方法  交叉合并
         ##对参数格式化处理
    
         n=list(b)
         for s in n:
             print('正在爬取第',e,'条数据')
             o='<img src=D:\pic\\'+str(e)+'.jpg>'
             fu.write('<tr>\n')
             fu.write('<td>%s\n%d%s%s</td>\n'%(o,e,'.',s[0]))##mz
             fu.write('<td>%s</td>\n'%s[1])
             fu.write('<td>%s</td>\n'%s[2])
             fu.write('<td>%s</td>\n'%s[3])
             fu.write('</tr>\n')##写进网页
             e+=1
         m+=25   
         ##翻页,循环爬取网页
    
  4. 下载书籍封面:

     def download():##下载图片
     g=0 ##书本数目,换页用
     v=1 ##次数
     try:
             os.mkdir('D:\pic')  ##创建文件夹
     except:
             pass
     os.chdir('D:\pic')
     print("正在下载图片中....\n\n\n")
     while g<=125:
             url="https://book.douban.com/top250?start="+str(g)  ##获取不同页面的书本信息
             page=urllib.request.urlopen(url)  ##链接网页
             html=page.read().decode('utf-8')  ##中文编码处理
             p=r'src="(.*\.jpg)"'  
             imglist=re.findall(p,html)  ##获取图片
             for each in imglist:
                     print(each)
                     urllib.request.urlretrieve(each,str(v)+'.jpg',None)  ##下载图片
                     v+=1
             g+=25   
             ##翻页,循环爬取网页
    
  5. 总体代码:

  6.  import urllib.request
     import re
     import os
     from bs4 import BeautifulSoup
    
     def fun():##爬取信息
         try:
             m=0 ##书本数目,换页用
             e=1 ##爬取次数
     
             fu=open('book.html','w')
             fu.write('<html>\n')
             fu.write('<body>\n')
             fu.write('<p align="center">\n')
             fu.write("\t\t-------豆瓣最受欢迎图书Top150-------\n\n")
             fu.write("</p>\n")
             fu.write('<table>\n')
             print("正在爬取书单中.......\n\n\n")
             while m<=125:
                 L1=[] ##读者评价列表
                 L2=[] ##图书信息
                 L3=[] ##图书名称
                 L4=[] ##读者评分    
                 url="https://book.douban.com/top250?start="+str(m)
                 req = urllib.request.Request(url)
                 page = urllib.request.urlopen(req)
                 soup=BeautifulSoup(page,"html.parser")  ##用python自带的htmlparser解析器读取网页
                 sentence=soup.find_all('span',class_="inq")##读者评价
                 information=soup.find_all("p",class_="pl")##图书信息
                 book=soup.findAll('a',attrs={"href":re.compile(r'https://book.douban.com/subject/.*/'),"title":re.compile(r'.*')})##图书名称
                 rate=soup.findAll('span',class_='rating_nums')##读者评分
                 for i in sentence:
                     L1.append(i.get_text())
                 for j in information:
                     L2.append(j.get_text())
                 for p in book:
                     L3.append(p.get_text()+'$')
                 temp=''.join(L3)
                 c=temp.replace('\n','').replace(' ','').rstrip('$').split('$')
                 # y=x.replace(' ','')
                 # z=y.rstrip('$') ##删除字符串最右边
                 # c=z.split('$')  ##格式处理,返回字符串列表
                 for q in rate:
                     L4.append(q.get_text())
                 b=zip(c,L4,L2,L1)#列表用zip方法  交叉合并
                 n=list(b)
                 for s in n:
                     print('正在爬取第',e,'条数据')
                     o='<img src=D:\pic\\'+str(e)+'.jpg>'
                     fu.write('<tr>\n')
                     fu.write('<td>%s\n%d%s%s</td>\n'%(o,e,'.',s[0]))##mz
                     fu.write('<td>%s</td>\n'%s[1])
                     fu.write('<td>%s</td>\n'%s[2])
                     fu.write('<td>%s</td>\n'%s[3])
                     fu.write('</tr>\n')##写进网页
                     e+=1
                 m+=25
             fu.write('</table>\n')
             fu.write('</body>\n')
             fu.write('</html>\n')
             fu.close()
             print('爬取完成!请去D盘pic文件夹查看本地网页!')
         except:
             print("输出文件失败!")
    
     def download():##下载图片
         g=0 ##书本数目,换页用
         v=1 ##次数
         try:
                 os.mkdir('D:\pic')  ##创建文件夹
         except:
                 pass
         os.chdir('D:\pic')
         print("正在下载图片中....\n\n\n")
         while g<=125:
                 url="https://book.douban.com/top250?start="+str(g)  ##获取不同页面的书本信息
                 page=urllib.request.urlopen(url)
                 html=page.read().decode('utf-8')  ##中文编码处理
                 p=r'src="(.*\.jpg)"'  
                 imglist=re.findall(p,html)
                 for each in imglist:
                         print(each)
                         urllib.request.urlretrieve(each,str(v)+'.jpg',None)  ##下载图片
                         v+=1
                 g+=25
     
     ##主体程序
     download()
     fun()
    
  7. 运行:

     download()
     fun()
    

效果:


s

总结

以上

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容