Python期末实训,爬虫实验报告

Python爬取豆瓣电影

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45774645/article/details/118071499
简介:Python中有很多第三方库,可以快速处理网页,我们使用四个库来爬取网页,并且保存数据

import urllib.request      # 获取整个网页内容
from bs4 import BeautifulSoup	# 解析网页结构
import re						# 使用正则匹配数据
import xlwt						# 保存到Excel中

第一步根据URL获取整个网页

​ 爬虫实际上就是程序模拟人类点击网页的过程。但是有些网站禁止爬取,他们是怎么做到禁止爬取的呢?首先就要知道,服务器是怎么区分是人或者是程序浏览网页的呢?

​ 实际上浏览器再像服务器发送请求时,我们的请求信息被封装在http对象当中,这个对象里面就有区分是人或者是程序的代码,在哪能找到这个信息呢?

以豆瓣top250为例:

在这里插入图片描述

在这里插入图片描述

这个信息就是人为访问的。

在这里插入图片描述

当我们使用Python程序访问的时候,我们的身份直接就被识破了,好家伙,这也太实诚了。

那如何伪装成浏览器呢?

# 得到一个指定的url网页内容
def askURL(url):
    head={  # 模拟成浏览器,伪装,反扒机制
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
    }
    request=urllib.request.Request(url,headers=head)
    html=""
    try:
        response=urllib.request.urlopen(request)
        html=response.read().decode('utf-8')
    except urllib.error.URLError as e:
        if hasattr(e,'code'):
            print(e.code)
        if hasattr(e,'reason'):
            print(e.reason)
    return html

第二步解析数据

def getData(baseurl):
    datalist=[]
    for i in range(0,10):   #调用获取页面信息的函数
        url =baseurl+str(i*25)
        html=askURL(url)    #一个页面的html
        # 解析每一个html
        soup=BeautifulSoup(html,'html.parser')
        for item in soup.findAll('div',class_='item'):
            #print(item)
            data=[] # 保存每一个电影的信息
            item=str(item)
            # 影片详情的超链接
            link=re.findall(findLink,item)[0]  #re库用来通过正则表达式查找指定字符串
            data.append(link)                   #添加链接

            imgSrc=re.findall(findImgSrc,item)[0]      #添加图片
            data.append(imgSrc)

            titles=re.findall(findTitle,item) # 添加片名,片名可能有一个,也可能有两个
            if len(titles)==2:
                ctitle=titles[0]          #中文名
                data.append(ctitle)
                otitle=titles[1].replace("/","")   #英文名中有无关的符号,去除
                data.append(otitle)         #英文名
            else:
                data.append(titles[0])
                data.append(' ')    #留空 ,因为要放到数据库

            rating=re.findall(findRating,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('/',' ',bd)    #去掉/
            data.append(bd.strip())    #去掉前后空格

            datalist.append(data)    #将一个电影的信息放到datalist
    return datalist

保存数据

def saveDate(datalist,savepath):
    book=xlwt.Workbook(encoding='utf-8',style_compression=0)        #创建Workbook对象
    sheet=book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True)   #创建工作表
    col=('电影详情链接','图片链接','影片中文片名','影片外国名','评分','评价数','概况','相关信息')
    for i in range(0,8):
        sheet.write(0,i,col[i])   # 列名
    for i in range(0,250):
        data=datalist[i]
        for j in range(0,8):
            sheet.write(i+1,j,data[j])    #写入数据

    book.save(savepath)       # 保存

完整代码

import urllib.request
from bs4 import BeautifulSoup
import re
import xlwt



# 影片详情链接的规则
findLink=re.compile(r'<a href="(.*?)">') # 创建正则表达式对象,表示规则
# 影片图片的链接
findImgSrc=re.compile(r'<img.*src="(.*?)"',re.S)    # re.S忽略换行符
# 影片片名
findTitle=re.compile(r'<span class="title">(.*)</span>')
# 影片评分
findRating=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):   #调用获取页面信息的函数
        url =baseurl+str(i*25)
        html=askURL(url)    #一个页面的html
        # 解析每一个html
        soup=BeautifulSoup(html,'html.parser')
        for item in soup.findAll('div',class_='item'):
            #print(item)
            data=[] # 保存每一个电影的信息
            item=str(item)
            # 影片详情的超链接
            link=re.findall(findLink,item)[0]  #re库用来通过正则表达式查找指定字符串
            data.append(link)                   #添加链接

            imgSrc=re.findall(findImgSrc,item)[0]      #添加图片
            data.append(imgSrc)

            titles=re.findall(findTitle,item) # 添加片名,片名可能有一个,也可能有两个
            if len(titles)==2:
                ctitle=titles[0]          #中文名
                data.append(ctitle)
                otitle=titles[1].replace("/","")   #英文名中有无关的符号,去除
                data.append(otitle)         #英文名
            else:
                data.append(titles[0])
                data.append(' ')    #留空 ,因为要放到数据库

            rating=re.findall(findRating,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('/',' ',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; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
    }
    request=urllib.request.Request(url,headers=head)
    html=""
    try:
        response=urllib.request.urlopen(request)
        html=response.read().decode('utf-8')
    except urllib.error.URLError as e:
        if hasattr(e,'code'):
            print(e.code)
        if hasattr(e,'reason'):
            print(e.reason)
    return html



# # askURL("https://www.bilibili.com/")

# 保存信息
def saveDate(datalist,savepath):
    book=xlwt.Workbook(encoding='utf-8',style_compression=0)        #创建Workbook对象
    sheet=book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True)   #创建工作表
    col=('电影详情链接','图片链接','影片中文片名','影片外国名','评分','评价数','概况','相关信息')
    for i in range(0,8):
        sheet.write(0,i,col[i])   # 列名
    for i in range(0,250):
        data=datalist[i]
        for j in range(0,8):
            sheet.write(i+1,j,data[j])    #写入数据

    book.save(savepath)       # 保存

def main():
    baseurl="https://movi.douban.com/top250?start="
    # 1.爬取网页
    datalist=getData("https://movie.douban.com/top250?start=")
    # 2.保存路径
    savepath="D://桌面//豆瓣电影Top250.xls"
    # 3.保存数据
    saveDate(datalist,savepath)
main()
baseurl="https://movie.douban.com/top250?start="
# 1.爬取网页
datalist=getData("https://movie.douban.com/top250?start=")
# 2.保存路径
savepath="D://桌面//豆瓣电影Top250.xls"
# 3.保存数据
saveDate(datalist,savepath)

爬取结果:
在这里插入图片描述

  • 31
    点赞
  • 252
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
根据提供的引用内容,我无法直接回答关于Python爬虫实验的感悟。但是,我可以为您提供一些关于Python爬虫实验的一般信息和建议。 Python爬虫是一种用于从网页上获取数据的技术。通过编写Python脚本,可以自动化地访问网页、提取数据并进行处理和分析。以下是一些关于Python爬虫实验的感悟和建议: 1. 学习基础知识:在进行Python爬虫实验之前,建议先学习Python编程语言的基础知识,包括语法、数据类型、控制流等。此外,了解HTML、CSS和JavaScript等前端技术也会对爬虫实验有所帮助。 2. 选择合适的库:Python有许多用于爬虫的库,如BeautifulSoup、Scrapy和Requests等。根据实验需求选择合适的库进行学习和使用。 3. 网络请求和数据提取:在爬虫实验中,首先需要发送网络请求获取网页内容,然后使用合适的方法提取所需的数据。了解HTTP协议和常见的数据提取技术(如正则表达式和XPath)对实验非常有帮助。 4. 处理和存储数据:获取到的数据可能需要进行处理和清洗,以便后续分析。Python提供了许多数据处理和分析的库,如Pandas和NumPy。此外,您还可以将数据存储到数据库或文件中,以便后续使用。 5. 遵守法律和道德规范:在进行爬虫实验时,务必遵守相关的法律和道德规范。尊重网站的使用条款和隐私政策,避免对网站造成过大的负担或侵犯他人的权益。 希望以上信息对您有所帮助!如果您有任何进一步的问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值