python爬虫爬取豆瓣top250到.csv

python爬取豆瓣top250的项目网上已经太多了,我也就不在进行详细的解释了,直接附上完整的代码(无需修改即可实用)。

# coding:utf-8
import urllib.request
import requests
import re
import random
import xlwt
import sqlite3
from bs4 import BeautifulSoup
def main():
    baseurl=r"https://movie.douban.com/top250?start="
    #1.爬取网页
    datalist=getData(baseurl)
    savepath="豆瓣电影Top250.xls"
    #3.保存数据
    saveData(datalist,savepath)
    # response=urllib.request.urlopen(url).read().decode('utf-8')
    # print(response)
    #askURL("https://movie.douban.com/top250?start=")

findLink=re.compile(r'<a href="(.*?)">')  #创建正则表达式对象,表示规则
#影片图片的规则
findImgSrc=re.compile(r'<img alt=.*src="(.*?)"',re.S)  #点任意匹配模式,改变'.'的行为,让换行符包含在字符中
#影片的片名
findTitle=re.compile(r'<span class="title">(.*)</span>')
#影片的评分
findRemark=re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#影片的评价人数
findPeople=re.compile(r'<span>(\d*)人评价</span>')
#影片的概况
findView=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,25):
        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)
            #获取影片详情的超链接
            #print(item)

            link=re.findall(findLink,item)[0]   #re库用正则表达式查找指定的字符串
            data.append(link)

            imgSrc=re.findall(findImgSrc,item)[0]
            data.append(imgSrc)

            title = re.findall(findTitle, item)
            if len(title)==2:
                ctitle=title[0]
                data.append(ctitle)     #添加中国名
                otitle=title[1].replace("/","")   #去掉title前的无关符号/
                data.append(otitle)     #添加外国名
            else:
                data.append(title[0])
                data.append(" ")      #若没有外国名,留空

            reMark=re.findall(findRemark,item)[0]
            data.append(reMark)     #添加评价

            people=re.findall(findPeople,item)[0]
            data.append(people)      #添加评价人数

            view=re.findall(findView,item)
            if len(view) !=0:
                view=view[0].replace("。","")
                data.append(view)  # 添加概述
            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)   #把处理好的一部分电源信息放进去

    return datalist

def askURL(url):
    head={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0"}
    req=urllib.request.Request(url,headers=head)
    html=""
    try:
        response=urllib.request.urlopen(req)
        html=response.read().decode()
        #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):
    workbook = xlwt.Workbook(encoding='utf-8',style_compression=0)  # 创建workbook对象
    worksheet = workbook.add_sheet('豆瓣Top250',cell_overwrite_ok=True)  # 创建工作表 ,cell_每个单元是否可以覆盖
    col=("电影详情链接","图片链接","影片中国名","外国名","评分","评价数","概述","相关信息")
    for i in range(0,8):
        worksheet.write(0,i,col[i]) #写入列名
    for i in range(0,250):
        print("第%d条" %(i+1))
        data=datalist[i]
        for j in range(0,8):
            worksheet.write(i+1,j,data[j])

    workbook.save(savepath)  #保存
if __name__=='__main__':
    main()
    print("爬取完毕")

结果展示:
在这里插入图片描述

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值