Python——豆瓣Top250抓取

基本流程


爬取一页

# 得到指定一个URL的网页内容
def askURL(url) :
    head = {
    
    
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36"
    }

    req = urllib.request.Request(url, headers=head)

    try :
        response = urllib.request.urlopen(req)
        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

爬取10页

注意防止被封ip

# 1. 爬取网页
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) #测试:查看电影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

        # print(datalist) #调试能否正常打印

        tim = random.randint(0,9) #暂停防止被封ip,也可以设置代理无需这个暂停
        print('正在爬取第%d页, 暂停时间%d秒'%(i + 1, tim))
        time.sleep(tim)

    return datalist

保存到Excel

# 3. 保存数据
def saveData(datalist ,savepath) :
    print("保存中......")

    workbook = xlwt.Workbook(encoding="uft-8", style_compression=0) #创建workbook对象
    worksheet = workbook.add_sheet('豆瓣电影top250', cell_overwrite_ok = True) #创建工作表
    col = ("电影详情链接", "图片链接", "影片中文名", "影片外国名", "评分", "评价数", "概括", "相关信息")

    for i in range(0, 8) :
        worksheet.write(0, i, col[i]) #列名

    for i in range(0, 250) :
        print("第%d条" %(i + 1))
        for j in range(0, 8) :
            worksheet.write(i + 1, j, datalist[i][j]) #数据

    workbook.save(savepath) #保存

完整代码

from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request, urllib.error #制定URL, 获取网页数据
import xlwt #进行Excel操作
import sqlite3 #进行SQLite数据库操作
import random
import time

# 影片链接规则
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)


# 1. 爬取网页
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) #测试:查看电影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

        # print(datalist) #调试能否正常打印

        tim = random.randint(0,9) #暂停防止被封ip,也可以设置代理无需这个暂停
        print('正在爬取第%d页, 暂停时间%d秒'%(i + 1, tim))
        time.sleep(tim)

    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/85.0.4183.83 Safari/537.36"
    }

    req = urllib.request.Request(url, headers=head)

    try :
        response = urllib.request.urlopen(req)
        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

# 3. 保存数据
def saveData(datalist ,savepath) :
    print("保存中......")

    workbook = xlwt.Workbook(encoding="uft-8", style_compression=0) #创建workbook对象
    worksheet = workbook.add_sheet('豆瓣电影top250', cell_overwrite_ok = True) #创建工作表
    col = ("电影详情链接", "图片链接", "影片中文名", "影片外国名", "评分", "评价数", "概括", "相关信息")

    for i in range(0, 8) :
        worksheet.write(0, i, col[i]) #列名

    for i in range(0, 250) :
        print("第%d条" %(i + 1))
        for j in range(0, 8) :
            worksheet.write(i + 1, j, datalist[i][j]) #数据

    workbook.save(savepath) #保存

def main() :
    baseurl = "https://movie.douban.com/top250?start="

    # 1.爬取网页
    datalist = getData(baseurl)
    
    # 3. 保存数据
    savepath = ".\\豆瓣电影Top250.xls"
    saveData(datalist, savepath)

if __name__ == "__main__" : #当程序执行时
    #调用函数
    main()

相关文档
BeautifulSoup
re
urllib
xlwt
random


如有错误以及可以改进的地方欢迎在下方评论区留言!

猜你喜欢

转载自blog.csdn.net/zy440458/article/details/114435120
今日推荐