关于使用Python中的urllib、re、pymysql、bs4等模块实现豆瓣电影top250数据爬取

关于使用Python中的urllib、re、pymysql、bs4等模块实现豆瓣电影top250数据爬取

需要导入的模块

import re
import urllib.request
import xlwt   #如果要保存到excel表格中可以导入这个模块
from bs4 import BeautifulSoup
import pymysql.cursors

定义一个函数启动项

def main():
    #将函数存放在总函数下面
    datalist = Data(target_url)
    SaveData(datalist)
    
    
if __name__ == '__main__':
    main()

获取并定义目标的url路径

target_url = "https://movie.douban.com/top250?start="

定义一个headers,防止被网站识别为爬虫

header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.1071 SLBChan/30"}

将上面的定义写一个函数来访问豆瓣,同时将返回的数据进行“utf-8”解码之后返回

def askURL(url):
    request = urllib.request.Request(url, headers=header)
    soup = urllib.request.urlopen(request)
    html = ""
    html = soup.read().decode("utf-8")
    return html

写一个正则表达式的规律方便后期Data函数调用

findlink = re.compile(r'<a href="(.*?)">')
findImg = re.compile(r'<img.*rc="(.*?)"',re.S)   #re.S的意思是忽略换行符号对链接的影响
findtitle = re.compile(r'<span class="title">(.*)</span>')
findscore = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
findpeople = re.compile(r'<span>(.*)人评价</span>')
findinq = re.compile(r'<span class="inq">(.*)</span>')

定义一个函数来接数据

def Data(url):
    datalist = []
    for i in range(0,10):
        url = target_url + str(i * 25)  #写个循环来取到不同页面的链接
        i+=1
        html = askURL(url)
        soup = BeautifulSoup(html, "html.parser")
        for item in soup.find_all('div',class_="item"):  #在返回的数据中寻找'div',class_="item"类型的数据
            data = []
            item = str(item)     ##将item进行字符串化方便后期的正则提取
            # 电影详情链接
            link = re.findall(findlink,item)[0]
            data.append(link)
            # 电影图片
            img = re.findall(findImg,item)[0]
            data.append(img)
            # 电影名称
            title = re.findall(findtitle, item)
            if (len(title)==2):
                ctitle = title[0]
                data.append(ctitle)
                otitle = title[1].replace("\xa0/\xa0","")  #将数据中的"\xa0/\xa0"用空格代替
                data.append(otitle)
            else:
                data.append(title[0])
                data.append(" ")
            # 电影评分
            score = re.findall(findscore, item)[0]
            data.append(score)
            # 电影评价人数
            people = re.findall(findpeople, item)[0]
            data.append(people)
            # 电影概况
            if len(re.findall(findinq, item))==0:  #判断是否为空值
                inq = " "
                data.append(inq)
            else:
                inq = re.findall(findinq, item)[0]
                data.append(inq)
            datalist.append(data)
    return datalist

将返回的数据导入到MySQL数据库,写一个保存路径

def path():
    cone = pymysql.connect(user='root',password='123456',host='localhost',port=3306,database='test',charset='utf8')  #登入到MySQL数据库
    c = cone.cursor()  #写一个光标控制器
    #用sql语句来创建一个表来存放数据
    sql = '''
        create table movie(
        movielink text not null,
        imglink text not null,
        title text not null,
        English text not null,
        score double not null,
        people int not null,
        inq text not null
        );
    '''
    c.execute(sql)   #执行上面的sql语句
    cone.commit()    #保存数据
    cone.close()	 #关闭

保存数据到MySQL

def SaveData(datalist):
    path()   #将路径函数执行
    cone = pymysql.connect(user='root', password='123456', host='localhost', port=3306, database='test', charset='utf8')   #登入数据库
    cur = cone.cursor()   #定义光标
    for data in datalist:   #从datalist中取出每一步电影的数据
        for index in range(len(data)):
            data[index] = '"' + data[index] + '"'
        sql = '''insert into movie values(%s)'''%",".join(data)  #键入占位符并用,将数据分隔开
        cur.execute(sql)
        cone.commit()
    cur.close()
    cone.close()

保存数据到excel

def savaData(datalist):
    workbook = xlwt.Workbook(encoding="utf-8",style_compression=0)
    sheet = workbook.add_sheet("sheet1",cell_overwrite_ok=True)
    col = ("电影详情链接","图片链接","电影名称","English Name","电影评分","电影评价人数","电影概况")
    for i in range(0,7):
        sheet.write(0,i,col[i])
    for i in range(0,250):
        print("%d条插入完毕"%i)
        data = datalist[i]
        data.append(data)
        for j in range(0,7):
            sheet.write(i+1,j,data[j])
    workbook.save("Test.xls")

ps:该项目是一个爬虫新手总结大佬的方法写出的,希望大佬们不喜勿喷,多多指点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值