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 相关文章推荐
Django中实现点击图片链接强制直接下载的方法
May 14 Python
python自动重试第三方包retrying模块的方法
Apr 24 Python
对Python中数组的几种使用方法总结
Jun 28 Python
python中的decorator的作用详解
Jul 26 Python
Python进阶:生成器 懒人版本的迭代器详解
Jun 29 Python
python 并发编程 阻塞IO模型原理解析
Aug 20 Python
如何使用Python脚本实现文件拷贝
Nov 20 Python
使用Tensorflow实现可视化中间层和卷积层
Jan 24 Python
Python configparser模块配置文件过程解析
Mar 03 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
Mar 30 Python
python让函数不返回结果的方法
Jun 22 Python
Python列表推导式实现代码实例
Sep 09 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
PHP5中MVC结构学习
2006/10/09 PHP
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
几行代码轻松搞定jquery实现flash8类似的连接效果
2007/05/03 Javascript
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
javascript 函数使用说明
2010/04/07 Javascript
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
jquery处理json对象
2014/11/03 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
node.js require() 源码解读
2015/12/13 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
Angular4 中内置指令的基本用法
2017/07/31 Javascript
解决vue处理axios post请求传参的问题
2018/03/05 Javascript
js 实现ajax发送步骤过程详解
2019/07/25 Javascript
微信小程序文章列表功能完整实例
2020/06/03 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
深入理解Python分布式爬虫原理
2017/11/23 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
Django的CVB实例详解
2020/02/10 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
监察建议书范文
2014/03/12 职场文书
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
《卖火柴的小女孩》教学反思
2016/02/19 职场文书
物业管理交接协议书
2016/03/24 职场文书