爬虫python=豆瓣Top250电影

主流程:获取数据,解析数据,保存数据

python 复制代码
from bs4 import BeautifulSoup  #网页解析获取数据
import re   #正则表达式
import urllib.request,urllib.error #获取网页数据
import sqlite3 #轻量级数据库
import xlwt   #进行excel操作
#影视详情链接的正则表达式
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 main():
    #要爬取的网页链接
    baseurl="https://movie.douban.com/top250?start="
    savepath="豆瓣电影Top250.xls"
    #1.爬取网页
    datalist=getData(baseurl)
    #2.保存数据
    saveData(datalist,savepath)
def getData(baseurl):
    datalist=[] #用来存储网页爬取的信息
    for i in range(0,10): #调用获取页面信息的函数
        url=baseurl+str(i*25)
        html=askURL(url) #保存获取的网页源码
        #2.逐一解析数据
        soup=BeautifulSoup(html,"html.parser")
        # print(soup.find_all('div',class_="item"))
        for item in soup.find_all('div',class_="item"):
            data=[] #保存一部电影所有信息
            item=str(item)
            link=re.findall(findLink,item)[0]
            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)
                etitle=titles[1].replace("/","") #消除转义字符
                data.append(etitle)
            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)
            bd=re.sub('/',"",bd)
            data.append(bd.strip())
            datalist.append(data)
    return datalist

def askURL(url):
    head={ #模拟浏览器的头部信息,向豆瓣服务器发送消息
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0"
    }  #用户代理,告诉豆瓣服务器,我们是什么类型的机器
    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)
    # print(html)
    return html
def saveData(datalist,savepath):
    print("save...........")
    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)


if __name__=="__main__":
    main()
    print("爬取完毕")

通过给出的基础网址链接,传入getData函数中进行拼接,得到每页的网址链接,通过再次传入askURL函数中,得到每页的html源码,并使用BeautifulSoup模块来解析html源码,使用其中的find_all方法来查找每个符合特定条件的元素,循环遍历,将每个元素正则匹配提取出我们需要的片名,评价人数,评分等信息,并逐一添加到列表data中,处理完一个电影(一个div元素),就把data添加到总的datalist列表中,进而得到所有电影的信息,并且以列表的形式进行存储,在askURL部分,主要是通过urllib.request.Request向服务器发送请求,并得到响应,这里创建了一个请求对象,这个过程中模拟了浏览器的头部信息(headers=head),防止一些网站的反爬机制导致的爬取失败,之后还需要使用urllib.request.urlopen(request),来得到响应对象,通过对响应对象读取和解码,之后就能得到该页的网页源码html,在数据保存阶段,则是通过xlwt库创建workbook对象,然后在这个对象中添加工作表,来写入爬取到的信息,首先要在第一行写入列名,之后从之前爬取下来存储在datalist的嵌套列表中获取每部电影的数据,datalist中的每个元素是一个列表,也就是一部电影,逐一写入,并最终sava(保存路径)

相关推荐
梦三辰5 分钟前
超详细解读:数据库MVCC机制
数据库·mysql·mvcc·快照
GIS程序媛—椰子10 分钟前
【数学】线性代数(Python)
python·线性代数·机器学习
Rainbow Sea12 分钟前
自定义实现C++拓展pytorch功能
c++·pytorch·python
大雄野比15 分钟前
【scikit-learn基础】--『预处理』之 数据缩放
python·机器学习·scikit-learn
777730 分钟前
OpenCV技术实战:识别滑动验证码缺口
python
Zeeland36 分钟前
如何使用 Conftier 进行 Python 配置管理
python
残月只会敲键盘38 分钟前
Django视图详解
python·django·sqlite
阿里云云原生42 分钟前
Python2 AI 通义灵码 VSCode插件安装与功能详解
python·visual studio code
b7shy71 小时前
饭馆菜品选择问题思路
python
hxung1 小时前
如何保证mysql和redis的数据一致性
java·数据库·redis·mysql