python 爬取豆瓣网页的示例


Posted in Python onApril 13, 2021

python作为一种已经广泛传播且相对易学的解释型语言,现如今在各方面都有着广泛的应用。而爬虫则是其最为我们耳熟能详的应用,今天笔者就着重针对这一方面进行介绍。

python 语法简要介绍

python 的基础语法大体与c语言相差不大,由于省去了c语言中的指针等较复杂的结构,所以python更被戏称为最适合初学者的语言。而在基础语法之外,python由其庞大的第三方库组成,而其中包含多种模块,而通过模块中包含的各种函数与方法能够帮助我们实现各种各样的功能。

而在python爬虫中,我们需要用到的标准库有:

  • urllib
  • re
  • bs4
  • xlwt

其中urllib库可以帮助我们爬取目标网页的html代码,bs4中的beautifulsoup模块以及re库中的正则表达式可以将我们需要的数据从代码中提取出来,而xlwt库可以将数据储存至excel表中,从而最终完成数据的爬取。

接下来,就步入我们此次介绍的重点——完整爬取一个网页的数据。

本篇文章以爬取豆瓣电影top250的数据为例,并将爬取的过程分为三个部分:

1.爬取网页

2.解析网页

3.储存网页

那么,让我们开始吧!

豆瓣top250网址:https://movie.douban.com/top250?start=

爬取网页

import urllib.request

引入urllib库中的request模块

def askURL(url):
    head = {
        "User-Agent": "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 88.0.4324.182Safari / 537.36"
    }# 模拟浏览器的登录
    request = urllib.request.Request(url,headers=head)
    #将网页的url和头部信息封装至一起
    response = urllib.request.urlopen(request)
    #获取网页的html代码
    html = response.read().decode("utf-8")
    #将获取的数据转化为utf-8格式
    #print(html)    #此步可以实验一下能否成功爬取网页的html代码
    return html

1.其中urllib.request.Request可以帮我们把要爬取的网页的url及其他的头部信息封装至一起。

2.urlopen函数则可以帮助我们爬取下该网页的html代码

3.有一些网站会设置一下反爬机制来阻止我们的爬虫,此时就需要我们设置头部信息来模拟浏览器访问网站

python 爬取豆瓣网页的示例

需要用浏览器进入该网址,使用开发者模式获取我们需要的头部信息(也就是该图中的user-agent)

4.最后需要将我们的爬取下的html代码转化为utf-8格式进行输出

解析网页

import re
from bs4 import BeautifulSoup

引入re库和bs4库

def getData(baseurl):
    datalist = []   #建立一个存放解析出的数据的元组
    for i in range(0,10):
        url = baseurl + str(i*25)
        # 通过以下两张截图,我们可以发现豆瓣将每25部电影分为一页,共分成了10页、
        # 而其url的差别仅在最后加了25,故通过该规律,可将所有10张网页的url全部获取
        html = askURL(url)
        soup = BeautifulSoup(html,"html.parser")
        #通过beautifulsoup模块自带的html代码解析器进行解析
        #并将解析器解析出的数据放至soup中

python 爬取豆瓣网页的示例

逐页进行解析,使解析出的数据能被我们接下来要使用的正则表达式识别

所谓正则表达式,就是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑,通过这种过滤,就可以得到我们想要的信息,就例如影片的名称,评分等信息。

findlink = re.compile(r'<a href="(.*?)" rel="external nofollow" >')  # r表示不受转义字符的影响
#该代码通过正则表达式搜寻到所有关于影片链接的数据,以下代码类似
findImgSrc = re.compile(r'<img.*src="(.*?)"',re.S) #让换行符包含在字符中
findtitle = re.compile(r'<span class="title">(.*)</span>')
findscore = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
findjudge = re.compile(r'<span>(\d*)人评价</span>')
findinq = re.compile(r'<span class="inq">(.*)</span>')
findbd = re.compile(r'<p class="">(.*?)</p>',re.S)
for item in soup.find_all("div",class_="item"):
        #提取所有class为“item”的div模块,并通过for循环一步步处理
            data = []
            item = str(item) #将item转化为字符串类型
            link = re.findall(findlink,item)[0]
            #通过影片详情链接的正则表达式抽取数据
            data.append(link)
            #存放至data列表中
            ImgSrc = re.findall(findImgSrc,item)[0]
            data.append(ImgSrc)
            title = re.findall(findtitle,item)
            if len(title)==2:
                #如果影片有多个名称,则分别进行存储
                ctitle = title[0]
                data.append(ctitle)
                otitle = title[1].replace("/","")
                data.append(otitle)
            else:
                data.append(title[0])
                data.append(" ")
            score = re.findall(findscore,item)
            data.append(score)
            judge = re.findall(findjudge,item)
            data.append(judge)
            inq = re.findall(findinq,item)
            if len(inq)!=0:
                inq = inq[0].replace("。","")
                data.append(inq)
            else:
                data.append("")
                #若有影片详情,则输出;若没有,则输出为空
            bd = re.findall(findbd,item)[0]
            bd = re.sub('<br(\s+)?/>(\s+)?'," ",bd)
            bd = re.sub('/'," ",bd)
            data.append(bd.strip())   # 去掉前后空格

            datalist.append(data)
    print(datalist)
    return datalist

以上代码能通过正则表达式抽取出需要的数据存放data列表中,然后将所有的data数据存放至datalist列表中。

储存网页

将解析出的数据储存到excel表中

import xlwt

引入xlwt库

def savepath(datalist):
    workbook = xlwt.Workbook(encoding="utf-8")
 #创建以utf-8格式编码的一个workbook对象,该对象最后能保存为excel表格
    worksheet = workbook.add_sheet("sheetwdy")
 #创建工作表“sheetwdy”
    col = ("电影详情链接", "图片链接", "影片中文名", "影片外国名", "评分", "评价数", "概况", "相关信息")
 #创建一个元组
    for i in range(0, 8):
        worksheet.write(0, i, col[i])  
 # 将我们刚定义的元组中的信息写入excel表的第一行
    for i in range(0, 250):
        print("第%d条" % (i + 1))
        data = datalist[i]
        for j in range(0, 8):
            worksheet.write(i + 1, j, data[j])
 #将解析出的数据通过for循环一条条导入excel表中
    workbook.save("豆瓣250.xls")
 #将该excel表进行保存

如此我们便可以把解析出的数据存储至excel表中了

python 爬取豆瓣网页的示例

以上便为成品图

以上就是python 爬取豆瓣网页的示例的详细内容,更多关于python 爬取豆瓣网页的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
在Python中进行自动化单元测试的教程
Apr 15 Python
深入理解NumPy简明教程---数组3(组合)
Dec 17 Python
python安装numpy&amp;安装matplotlib&amp; scipy的教程
Nov 02 Python
python验证码识别教程之利用滴水算法分割图片
Jun 05 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
Jun 13 Python
Python3使用turtle绘制超立方体图形示例
Jun 19 Python
使用python快速在局域网内搭建http传输文件服务的方法
Nov 14 Python
Python中如何将一个类方法变为多个方法
Dec 30 Python
Python3操作YAML文件格式方法解析
Apr 10 Python
一行代码python实现文件共享服务器
Apr 22 Python
分析Python感知线程状态的解决方案之Event与信号量
Jun 16 Python
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
May 04 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 #Python
python自动化调用百度api解决验证码
利用Python网络爬虫爬取各大音乐评论的代码
用Python制作灯光秀短视频的思路详解
python实现socket简单通信的示例代码
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
python用字节处理文件实例讲解
Apr 13 #Python
You might like
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
2008/12/06 PHP
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
ThinkPHP 5.1 跨域配置方法
2019/10/11 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
不同浏览器的怪癖小结
2010/07/11 Javascript
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
2015/06/18 Javascript
微信支付如何实现内置浏览器的H5页面支付
2015/09/25 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
Javascript中的几种继承方式对比分析
2016/03/22 Javascript
vue-router 权限控制的示例代码
2017/09/21 Javascript
基于nodejs的微信JS-SDK简单应用实现
2019/05/21 NodeJs
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
利用原生JS实现欢乐水果机小游戏
2020/04/23 Javascript
js实现随机点名器精简版
2020/06/29 Javascript
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
Python使用matplotlib绘制圆形代码实例
2020/05/27 Python
基于Python绘制个人足迹地图
2020/06/01 Python
python Paramiko使用示例
2020/09/21 Python
亚洲最大的眼镜批发商和零售商之一:Glasseslit
2018/10/08 全球购物
将时尚融入珠宝:Adornmonde
2019/10/17 全球购物
怀旧香味蜡烛:Homesick
2019/11/02 全球购物
奥地利婴儿用品和玩具购物网站:baby-markt.at
2020/01/26 全球购物
法国在线药房:1001Pharmacies
2021/03/07 全球购物
后勤人员自我评价怎么写
2013/09/19 职场文书
房屋出租委托书格式
2014/09/23 职场文书
2014年涉外离婚协议书范本
2014/11/20 职场文书
2015年教务处干事工作总结
2015/07/22 职场文书
2015年主婚人婚礼致辞
2015/07/28 职场文书
党性修养心得体会2016
2016/01/21 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书
Python爬虫中urllib3与urllib的区别是什么
2021/07/21 Python