【裁员警告】这是一段让各大电影网站的资料整理人员下岗的代码,用BeautifulSoup+urllib+python爬虫豆瓣top250电影详细信息,哪还需要低效的人力呢?

我们发现很多电影网站的电影信息,和豆瓣网中的电影信息一模一样,连标点符号都分毫不差!!!各大平台的数据维护人员如此严谨敬业有耐心??NO!!他们只是靠爬虫直接把豆瓣里的数据放入了自己的平台,丝毫不费人工、文笔、脑子,是彻彻底底的拿来主义(网络爬虫)!

网络爬虫,是按照一定规则,自动抓取互联网信息的程序。由于用户需求具有针对性,所以定向抓取相关网页并分析成为了主流的爬取策略。

我前两天用浏览器驱动+selenium进行了爬虫,过程比较顺利,但普适性不强,尤其是浏览器版本众多,把程序打包给人家用,人家可能还需要根据自己的浏览器版本去下载浏览器驱动,一个好的程序不应该这样,所以能不用浏览器驱动就不用,于是,今天就尝试BeautifulSoup+urllib+python的方法,爬取豆瓣网上电影TOP250信息。
在这里插入图片描述

爬虫程序的基本步骤:爬取数据、解析数据、保存数据。

一、构建爬虫框架

def main():
    baseurl = "https://movie.douban.com/top250?start="
    #爬取网页
    movielist = getData(baseurl)
    #保存数据
    savepath = "豆瓣top250.xls"
    saveData(movielist,savepath)

运行报错1:在这里插入图片描述
解决:点击file –> setting设置 –> Project:your project name –> Project Interpreter –> 设置 –> Add Local –> 查看venv1位置,找到将文件夹下内容删除–>点击ok,重新配置环境。

运行报错2:
在这里插入图片描述
解决:点击进入设置install package即可:点击file –> setting设置

运行报错3:安装urllib失败
在这里插入图片描述
解决:我盲选了个版本,安装了urllib5就没问题了。

二、获取一个网页的数据
1、F12,找Network中的各种headers属性

2、编写获取一页网页信息代码如下:

#得到一个指定url的网页信息
def askURL(url):
    #将本地身份证亮出来告诉服务器,获取的信息的格式
    head = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}
    #新建request接受信息
    request = urllib.request.Request(url,headers=head)
    html = ""
    #将获取的网页信息存入html
    try:
        response = urllib.request.urlopen(request)
        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)

三、翻页返回新url,边爬虫边解析

#爬取网页
def getData(baseurl):
    datalist = []
    for i in range(0,10,1):
        url = baseurl+str(i*25)
        html = askURL(url)
    #逐一解析
    soup = BeautifulSoup(html, "html.parser")  # 声明解析器
    for item in soup.find_all("div",class_="item"):
        print(item)

这样就打印出了top250的信息,但这些信息是未经过分类整理的,接下来,需要用正则表达式制定规则(此处需用到re库),把电影信息分类存放在列表里。

四、定义查找规则(正则表达式)
正则表达式的使用方法,参照:https://www.cnblogs.com/buzaiyicheng/p/11202966.html
1、链接:findlink = re.compile(r'<a href="(.*?)">')
compile表示创建规则;r’表示后面的内容都不转义;.表示一个字符;*表示多个字符;?表示有或者没有。
运行报错:expected string or bytes-like object,一般为数据类型不匹配造成的。
Python3中有六个标准的数据类型:
Number(数字)
string(字符串)
List(列表)
Tuple(元组)
Sets(集合)
Dictionary(字典)
可以通过print(type(object))来查当前的数据类型,式中object为要查询的对象。
在这里插入图片描述
将item先转化为字符串最为保险:找到一个符合要求的item→转为字符串→在item中找符合规则的link→打印
在这里插入图片描述
2、获取图片
在这里插入图片描述
re.S表示让换行符保持不变

3、继续添加规则

findlink = re.compile(r'<a href="(.*?)">')#创建正则表达式对象,表示规则
findimg = re.compile(r'<img.*src="(.*?)"',re.S)#让换行符保持不变
findtitle = re.compile(r'<span class="title">(.*?)</span>')
findrate = re.compile(r'<span class="rating_num" property="v:average">(.*?)</span>')
findcomnum = re.compile(r'<span>(\d*)人评价</span>') #\d表示数字,加*表示很多数字
findintroduce = re.compile(r'<span class="inq">(.*?)</span>')
findbd = re.compile(r'<p class="">(.*?) </p>',re.S)

4、将爬取的数据加入列表

    #爬取网页
def getData(baseurl):
    movielist = []
    for i in range(0,10,1):
        url = baseurl+str(i*25)
        html = askURL(url)
    #逐一解析
        soup = BeautifulSoup(html, "html.parser")  # 声明解析器
        for item in soup.find_all("div",class_="item"):#寻找符合要求的字符串形成列表
            item = str(item)
            movie_one = []
            #print(item)
            link = re.findall(findlink,item)[0]
            movie_one.append(link)

            imgSrc = re.findall(findimg,item)[0]
            movie_one.append(imgSrc)

            title = re.findall(findtitle,item) #存在中文和英文名
            if len(title)==2:
                ctitle = title[0]
                movie_one.append(ctitle)
                etitle = title[1].replace("/","") #去掉外国名前面的/
                movie_one.append(etitle)
            else:
                movie_one.append(title[0])
                movie_one.append('') #将英文名留空

            rate = re.findall(findrate, item)[0]
            movie_one.append(rate)

            commentnum = re.findall(findcomnum, item)[0]
            movie_one.append(commentnum)

            produce = re.findall(findintroduce, item)
            if len(produce)!=0:
                produce = produce[0]
                movie_one.append(produce)
            else:
                movie_one.append(" ")

            bd = re.findall(findbd,item)[0]
            bd = re.sub('<br(\s+)?/>(\s+)?',"",bd)
            movie_one.append(bd.strip())   #去掉前后的空格

            movielist.append(movie_one)

        #print(movielist)
    return  movielist

四、保存数据

def saveData(datalist,savepath):
    print("开始保存")
    book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建work对象
    sheet =book.add_sheet('豆瓣TOP250',cell_overwrite_ok=True)#修改单元格权限 true
    col = ("电影详情链接","图片链接","中文名","外文名","评分","评价数","简介","相关信息")
    for i in range(0,8):
        sheet.write(0,i,col[i])
    for i in range(0,250):
        print("第%d条"%(i+1))
        data = datalist[i]  #提取1条数据
        for j in range(0,8):
            sheet.write(i+1,j,data[j]) #写入第i条的每一列
    book.save(savepath)

注意:是%d,千万不要写成d%!!!

五、小结:
1、正则表达式筛选的时候,注意中英文切换,注意采用替换或者删除的方式把不必要的空格,斜杠等处理掉;
2、写入列表时,记得留空位,不然保存到excel表会发生错位,oh不,根本保存不了,它会报错;
3、保存的操作就是个套娃游戏,脑袋容易被套晕;

补充:
当遇到下拉滚动条加载更多的时候,可以尝试用PhantomJS。PhantomJS是一个无界面的、可脚本编程的WebKit浏览器引擎,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。

官方下载地址:http://phantomjs.org/download.html

配置环境变量:在这里插入图片描述
win+R,输入cmd打开控制台,输入phantomjs -v,若输出了版本号,则证明安装成功了。
设置了环境变量,我这里还是报错:Message: ‘phantomjs’ executable needs to be in PATH
在这里插入图片描述
最后发现,将pyantomjs.exe放入python文件夹里即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值