pthon网络爬虫爬取top250电影相关信息,步骤清晰,适合初学者

先放完整代码,再分函数解释

import re
import urllib.request
from  bs4 import  BeautifulSoup
import random
import xlwt
import time
def main():
    url = #先去把top250的网页拿来,放在""中
    get_url(url)
    get_data(url)
    save_data(datalist=get_data(url),savepath="D:\谷歌下载\电影Top250.xls")
	#save_data(savepath="电影Top250.db",datalist=get_data(url))	#这是保存到数据库
def get_url(url):
    head={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"}
    request = urllib.request.Request(headers=head,url=url)
    response = urllib.request.urlopen(request)
    html = response.read().decode('utf-8')
    return html

def get_data(url):
    datalist=[]
    for i in range (0,10):
        baseurl = url + str(i*25)
        html = get_url(baseurl)
        html = BeautifulSoup(html,"html.parser")
        time.sleep(random.randint(0,3))
        for item in html.find_all('div',class_="item"):
            data = []
            #print(item)
            item = str(item)
            #链接
            link = re.findall(r'<a href="(.*?)">',item)[0]      #链接
            data.append(link)
            #图片
            src = re.findall(r'<img.*src="(.*?)" width="100"/>',item)[0]
            data.append(src)
            #电影名
            name = re.findall(r'<span class="title">(.*?)</span>',item)
            if len(name) ==2 :
                cname = name[0]
                data.append(cname)
                fname = name[1].replace("\xa0/\xa0","")
                data.append(fname)
            else:
                cname = name[0]
                data.append(cname)
                data.append(" ")
            #评分
            rating = re.findall(r'<span class="rating_num" property="v:average">(.*?)</span>',item)[0]
            data.append(rating)
            #评价人数
            count_number = re.findall(r'<span>(.*?)人评价</span>',item)[0]
            data.append(count_number)
            #一句话评价
            findevalute = re.compile(r'<span class="inq">(.*)</span>',re.S)
            evaluate = re.findall(findevalute,item)
            if len(evaluate) ==0:
                data.append(" ")
            else:
                data.append(evaluate[0])
            #相关信息
            findre  = re.compile(r'<p class="">(.*?)</p>',re.S)
            relative = re.findall(findre,item)[0]
            # relative = re.sub(r'\n                            '," ",relative)                 #去掉<br/>
            relative = re.sub('\xa0\xa0\xa0'," ",relative)                                 #替换/
            # relative = re.sub(r'...<br/>\n                            '," ",relative)
            # relative = re.sub(r'')
            relative = re.sub('...<br/>\n                            '," ",relative)                 #去掉<br/>
            relative = re.sub('/'," ",relative)
            data.append(relative.strip())
            datalist.append(data)
    #print(datalist)
    return datalist


def save_data(datalist,savepath):
    book = xlwt.Workbook(encoding='utf-8',style_compression=0)
    sheet = book.add_sheet("top250",cell_overwrite_ok=1)
    col=["链接","图片链接","中文名","外文名","评分","评价人数","一句话评价","相关信息"]
    for i in range(0,8):
        sheet.write(0,i,col[i])
        #print(datalist)
    for i in range(0,250):
        data_list = datalist[i]
        #print(data_list)
        for j in range(0,8):
            sheet.write(i+1,j,data_list[j])
    book.save(savepath)
'''    
def save_sql(savepath):
    conn = sqlite3.connect(savepath)
    sql = '''
        create table top250(
        id integer primary key autoincrement,
        lianjie  text,
        tupianlianjie  text,
        name    varchar,
        fname   varchar,
        pingfen numeric,
        rated   numeric,
        inq     text,
        relative    text
        )
    '''
    cursor = conn.cursor()
    cursor.execute(sql)
    conn.commit()
    conn.close()


def save_data(savepath,datalist):
    save_sql(savepath)
    conn = sqlite3.connect(savepath)
    cursor = conn.cursor()
    for data in datalist:
        for index in range(len(data)):
            data[index] = '"'+ data[index] +'"'
        sql='''
            insert into top250(lianjie,tupianlianjie,name,fname,pingfen,rated,inq,relative)
            values (%s
                    )       
                '''%",".join(data)
        cursor.execute(sql)
        conn.commit()

    conn.close()
'''
if __name__ == "__main__":
    main()
    print("爬取完成")

main函数

在这调用get_url,get_data,save_data仨函数,同时给出第一页的网址(去top250翻页试试,就会发现网址每翻一页,url最后的数字就会多25)

get_url函数

这里用的get方法获取网页源码,你可以暂时不管什么是get方法。往下说,head是讲自己包装成一个电脑去访问这个网页,head这句话里面的内容你可能和我不一样,这句话来自网页,你打开一个网页按F12,点network,现在这里是空白,现在在左边网页右键重新加载,然后马上点右边网页很显眼的那个红点,下面那条长线就会停止加载,鼠标左键这条长线最左边,你就会看到你的user-agent。
在这里插入图片描述
把useragent后面的信息复制并替换到上面代码中,这句话是让网页以为你是用这台电脑访问它,而非python。不加这句话运行后面代码会报404错误,即网页识别出了你是个爬虫
request是申请访问网页,response是网页给你的回应,html是读取网页返回给你的源码,最后return html,以便后面执行

get_data函数

在get_url中获得了源码,在这里就循环访问每一页并把源码中我们需要的的数据提取出来并加到datalist这个列表中。beautifulsoup美味汤是解析库,让源码看起来整齐些。re是正则表达式库,re.compile是匹配模式,re.findall是按匹配模式查找。
这里面有两个if else循环是因为html中信息是不工整的,比如有的电影有外文名有的没有,那我们就需要把外文名为空的那个位置留出来,以便excel排列不错乱

save_data函数

将get_data中datalist中的数据循环保存到excel表格

关于保存到数据库

把main函数的那条注释打开并关闭保存到excel的那条语句;再把下面’‘’ ‘’'注释的地方打开就行

if name == “main”:

程序入口,就像学校大门,进学校要进大门,从这运行程序便于调试;但将此文件作为包调入其他文件,这句话下面的代码不会在别处运行。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值