爬虫:将已获得网页的全部数据进行拆分,再进行解析

2 篇文章 0 订阅
2 篇文章 0 订阅

一、问题描述

上篇文章中描述了获取整个网页的html信息代码,可我们就只想获取我们想要的那部分信息,该怎么办呢?

二、问题思路

  1. 引入所需数据库
  2. 先将数据进行拆分
  3. 再进行数据的解析

三、问题解决

以获取豆瓣第一个网页电影信息(影片详情连接、影片图片、影片片名、影片评价、评价人数、电影概况、影片相关内容)为例

import urllib.request                 # 获取整个网页信息所需库
from bs4 import BeautifulSoup         # 数据拆分所需库
import re                             # 数据解析所需库

# 一. 获取整个网页的html
#得到指定一个URL的网页内容
#方法一:获取一个get请求
# HTTP Error 418:对方已发现我是一个爬虫,所以要进行伪装
url = "https://movie.douban.com/top250?start="
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
}                                             #模拟头部信息,向服务器发送消息
req = urllib.request.Request(url=url,headers=headers)#封装
try:
    response = urllib.request.urlopen(req)
    html = response.read().decode('utf-8')    #对获取网页进行utf-8的解码
    #print(html)
except urllib.error.URLError as e:            #try except 进行超时设置
    print("timeout")


# 二:对整个网页进行数据拆分与数据解析

datalist = []
soup = BeautifulSoup(html,"html.parser")

for item in soup.find_all("div", class_="item"):
        #print(item)#测试:查看电影item全部信息

        data = [] #保存一部电影的所有信息
        item = str(item)

        # 1.影片详情链接规则
        findLink = re.compile(r'<a href="(.*?)">')  # 创建正则表达式对象,表示规则(字符串的模式)
        #添加影片详情连接
        link = re.findall(findLink,item)[0]  #re库用来通过正则表达式查找指定的字符串
                                                         #j将findLink放入全局变量里定义
        data.append(link)
        #print(link)



        # 2.影片图片规则
        findImageSrc = re.compile(r'<img.*src="(.*?)"', re.S)  # re.S让换行符包含在字符中
        #添加影片图片
        imageSrc = re.findall(findImageSrc,item)[0]
        data.append(imageSrc)
        #print(imageSrc)



        # 3.影片片名规则
        findTitle = re.compile(r'span class="title">(.*)</span>')
        #添加影片片名
        title = re.findall(findTitle,item)#[0]  错误
        if (len(title) == 2):
                ctitle = title[0]
                data.append(ctitle)                  #添加中文名
                otitle = title[1].replace("/","")    #去掉无关的符号
                data.append(otitle)                  #添加外国名
        else:
                data.append(title[0])
                data.append(' ')    #外国名可能没有,则留空




        # 4.影片评分规则
        findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
        #添加评分
        rating = re.findall(findRating,item)[0]
        data.append(rating)




        # 5.找到评价人数规则
        findJudge = re.compile(r'<span>(\d*)人评价</span>')
        #添加评价人数
        judge = re.findall(findJudge,item)[0]
        data.append(judge)




        # 6.电影概况规则
        findInq = re.compile(r'<span class="inq">(.*)</span>', )
        # 添加电影概况
        inq = re.findall(findInq,item)
        if len(inq) != 0:               #这里报错
                inq = inq[0].replace("。","") #去掉句号
                data.append(inq)
        else:
                data.append(" ")    #留空




        # 7.影片相关内容
        findBd = re.compile(r'<p class="">(.*?)</p>', re.S)
        # 添加影片相关内容
        bd = re.findall(findBd,item)[0]
        bd = re.sub('<br(\s+)?/>(\s+)?'," ",bd)  #去掉<br/>
        bd = re.sub('/'," ",bd)    #去掉/
        data.append(bd.strip())    #去掉前后的空格

        datalist.append(data)
print(datalist)    #打印所有过滤掉的信息

程序运行结果:
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值