Python爬取豆瓣数据实现过程解析


Posted in Python onOctober 27, 2020

代码如下

from bs4 import BeautifulSoup #网页解析,获取数据
import sys #正则表达式,进行文字匹配
import re
import urllib.request,urllib.error #指定url,获取网页数据
import xlwt #使用表格
import sqlite3
import lxml

以上是引用的库,引用库的方法很简单,直接上图:

Python爬取豆瓣数据实现过程解析

Python爬取豆瓣数据实现过程解析Python爬取豆瓣数据实现过程解析

上面第一步算有了,下面分模块来,步骤算第二步来:

这个放在开头

def main():
  baseurl ="https://movie.douban.com/top250?start="
  datalist = getData(baseurl)
  savepath=('douban.xls')
  saveData(datalist,savepath)

这个放在末尾

if __name__ == '__main__':
main()

不难看出这是主函数,里面的话是对子函数的调用,下面是第三个步骤:子函数的代码

对网页正则表达提取(放在主函数的后面就可以)

findLink = re.compile(r'<a href="(.*?)" rel="external nofollow" rel="external nofollow" >') #创建正则表达式对象,表示规则(字符串的模式)
#影片图片
findImg = re.compile(r'<img.*src="(.*?)" width="100"/>',re.S)#re.S取消换行符
#影片片面
findtitle= re.compile(r'<span class="title">(.*?)</span>')
#影片评分
fileRating = 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)

爬数据核心函数

def getData(baseurl):
  datalist=[]
  for i in range(0,10):#调用获取页面的函数10次
    url = baseurl + str(i*25)
    html = askURl(url)
  #逐一解析
    soup = BeautifulSoup(html,"html.parser")
    for item in soup.find_all('div',class_="item"):
    #print(item)
      data=[]
      item = str(item)
 
      link = re.findall(findLink,item)[0] #re库用来通过正则表达式查找指定的字符串
      data.append(link)
      titles =re.findall(findtitle,item)
      if(len(titles)==2):
        ctitle=titles[0].replace('\xa0',"")
        data.append(ctitle)#添加中文名
        otitle = titles[1].replace("\xa0/\xa0Perfume:","")
        data.append(otitle)#添加外国名
      else:
        data.append(titles[0])
        data.append(' ')#外国名字留空
 
      imgSrc = re.findall(findImg,item)[0]
      data.append(imgSrc)
 
      rating=re.findall(fileRating,item)[0]
      data.append(rating)
 
      judgenum = re.findall(findJudge,item)[0]
      data.append(judgenum)
 
      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) #去掉<br/>
      bd =re.sub('\xa0'," ",bd)
      data.append(bd.strip()) #去掉前后的空格
 
      datalist.append(data) #把处理好的一部电影信息放入datalist
 
  return datalist

获取指定网页内容

def askURl(url):
 
  head = {
    "User-Agent": "Mozilla / 5.0(Windows NT 10.0;WOW64) Apple"
    +"WebKit / 537.36(KHTML, likeGecko) Chrome / 78.0.3904.108 Safari / 537.36"
  }
#告诉豆瓣我们是浏览器我们可以接受什么水平的内容
  request = urllib.request.Request(url,headers=head)
  html=""
  try:
    response = urllib.request.urlopen(request)
    html = response.read().decode("utf-8")
    # print(html)
  except urllib.error.URLError as e:
    if hasattr(e,"code"):
      print(e.code)
    if hasattr(e,"reason"):
      print(e.reason)
  return html

将爬下来的数据保存到表格中

ef saveData(datalist,savepath):
  print("保存中。。。")
  book = xlwt.Workbook(encoding="utf-8",style_compression=0) # 创建workbook对象
  sheet = book.add_sheet('douban',cell_overwrite_ok=True) #创建工作表 cell_overwrite_ok表示直接覆盖
  col = ("电影详情链接","影片中文网","影片外国名","图片链接","评分","评价数","概况","相关信息")
  for i in range(0,8):
    sheet.write(0,i,col[i])
  for i in range(0,250):
    print("第%d条" %(i+1))
    data = datalist[i]
    for j in range(0,8):
      sheet.write(i+1,j,data[j])
 
  book.save(savepath)

以上就是整个爬数据的整个程序,这仅仅是一个非常简单的爬取,如果想要爬更难的网页需要实时分析

整个程序代码

from bs4 import BeautifulSoup #网页解析,获取数据
import sys #正则表达式,进行文字匹配
import re
import urllib.request,urllib.error #指定url,获取网页数据
import xlwt #使用表格
import sqlite3
import lxml
 
def main():
  baseurl ="https://movie.douban.com/top250?start="
  datalist = getData(baseurl)
  savepath=('douban.xls')
  saveData(datalist,savepath)
#影片播放链接
findLink = re.compile(r'<a href="(.*?)" rel="external nofollow" rel="external nofollow" >') #创建正则表达式对象,表示规则(字符串的模式)
#影片图片
findImg = re.compile(r'<img.*src="(.*?)" width="100"/>',re.S)#re.S取消换行符
#影片片面
findtitle= re.compile(r'<span class="title">(.*?)</span>')
#影片评分
fileRating = 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)
 
def getData(baseurl):
  datalist=[]
  for i in range(0,10):#调用获取页面的函数10次
    url = baseurl + str(i*25)
    html = askURl(url)
  #逐一解析
    soup = BeautifulSoup(html,"html.parser")
    for item in soup.find_all('div',class_="item"):
    #print(item)
      data=[]
      item = str(item)
 
      link = re.findall(findLink,item)[0] #re库用来通过正则表达式查找指定的字符串
      data.append(link)
      titles =re.findall(findtitle,item)
      if(len(titles)==2):
        ctitle=titles[0].replace('\xa0',"")
        data.append(ctitle)#添加中文名
        otitle = titles[1].replace("\xa0/\xa0Perfume:","")
        data.append(otitle)#添加外国名
      else:
        data.append(titles[0])
        data.append(' ')#外国名字留空
 
      imgSrc = re.findall(findImg,item)[0]
      data.append(imgSrc)
 
      rating=re.findall(fileRating,item)[0]
      data.append(rating)
 
      judgenum = re.findall(findJudge,item)[0]
      data.append(judgenum)
 
      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) #去掉<br/>
      bd =re.sub('\xa0'," ",bd)
      data.append(bd.strip()) #去掉前后的空格
 
      datalist.append(data) #把处理好的一部电影信息放入datalist
 
  return datalist
 
#得到指定一个url的网页内容
def askURl(url):
 
  head = {
    "User-Agent": "Mozilla / 5.0(Windows NT 10.0;WOW64) Apple"
    +"WebKit / 537.36(KHTML, likeGecko) Chrome / 78.0.3904.108 Safari / 537.36"
  }
#告诉豆瓣我们是浏览器我们可以接受什么水平的内容
  request = urllib.request.Request(url,headers=head)
  html=""
  try:
    response = urllib.request.urlopen(request)
    html = response.read().decode("utf-8")
    # print(html)
  except urllib.error.URLError as e:
    if hasattr(e,"code"):
      print(e.code)
    if hasattr(e,"reason"):
      print(e.reason)
  return html
 
def saveData(datalist,savepath):
  print("保存中。。。")
  book = xlwt.Workbook(encoding="utf-8",style_compression=0) # 创建workbook对象
  sheet = book.add_sheet('douban',cell_overwrite_ok=True) #创建工作表 cell_overwrite_ok表示直接覆盖
  col = ("电影详情链接","影片中文网","影片外国名","图片链接","评分","评价数","概况","相关信息")
  for i in range(0,8):
    sheet.write(0,i,col[i])
  for i in range(0,250):
    print("第%d条" %(i+1))
    data = datalist[i]
    for j in range(0,8):
      sheet.write(i+1,j,data[j])
 
  book.save(savepath)
 
if __name__ == '__main__':
  main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python常用内置函数总结
Feb 08 Python
Python创建系统目录的方法
Mar 11 Python
Python下Fabric的简单部署方法
Jul 14 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
Jun 13 Python
Python读取图片属性信息的实现方法
Sep 11 Python
13个最常用的Python深度学习库介绍
Oct 28 Python
Python实现控制台中的进度条功能代码
Dec 22 Python
TensorFlow实现RNN循环神经网络
Feb 28 Python
pandas read_excel()和to_excel()函数解析
Sep 19 Python
Python线程障碍对象Barrier原理详解
Dec 02 Python
Python流程控制常用工具详解
Feb 24 Python
如何在windows下安装配置python工具Ulipad
Oct 27 Python
UI自动化定位常用实现方法代码示例
Oct 27 #Python
基于python获取本地时间并转换时间戳和日期格式
Oct 27 #Python
如何在pycharm中安装第三方包
Oct 27 #Python
Python操控mysql批量插入数据的实现方法
Oct 27 #Python
python 对一幅灰度图像进行直方图均衡化
Oct 27 #Python
Pycharm操作Git及GitHub的步骤详解
Oct 27 #Python
python 爬虫如何正确的使用cookie
Oct 27 #Python
You might like
PHP新手上路(十四)
2006/10/09 PHP
php中对2个数组相加的函数
2011/06/24 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
2013/07/05 PHP
php获取指定范围内最接近数的方法
2015/06/02 PHP
php实现XSS安全过滤的方法
2015/07/29 PHP
php简单日历函数
2015/10/28 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
XP折叠菜单&amp;仿QQ2006菜单
2006/12/16 Javascript
jQuery Selector选择器小结
2010/05/06 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
js特效,页面下雪的小例子
2013/06/17 Javascript
JS下拉框内容左右移动效果的具体实现
2013/07/10 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
nodejs服务搭建教程 nodejs访问本地站点文件
2017/04/07 NodeJs
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
Angular.Js中ng-include指令的使用与实现
2017/05/07 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
Element Input组件分析小结
2018/10/11 Javascript
详解基于webpack&amp;gettext的前端多语言方案
2019/01/29 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
Python中字典和JSON互转操作实例
2015/01/19 Python
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
如何实现一个python函数装饰器(Decorator)
2020/10/12 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
采购类个人求职的自我评价
2014/02/18 职场文书
会计专业个人自我鉴定
2014/03/21 职场文书
小学社团活动总结
2014/06/27 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
小学生差生评语
2014/12/29 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
MySQL 自定义变量的概念及特点
2021/05/13 MySQL
vite+vue3.0+ts+element-plus快速搭建项目的实现
2021/06/24 Vue.js
Redis读写分离搭建的完整步骤
2021/09/14 Redis