浅谈python爬虫

最近心血来潮花了两天时间看了一下python的爬虫
要用到的包有

import requests		# 用来获取整个网站的信息
import re 		#正则表达式,用来匹配相对应数据
from bs4 import BeautifulSoup  #网页解析,获取数据,但和re的数据匹配有点不同
import xlwt  			# 进行excel操作,如果不想把数据放到excel中,例如图片的话可以放到文件夹中

谈一下感悟吧
首先要清楚你要爬的是什么,显然是数据,数据又可以分为很多,例如文字,链接,图片,音频,视频等等
然后你要收集的数据是对于一个网站,乃至多个网站,或者是一个网站中嵌套着另一个网站,那么如何从一个网站中获取这些信息是至关重要的
代码如下所示

# head是表示你进入这个网站的身份,有些网站会反爬虫,所以要伪装自己不是爬虫,这个head可以在自己进入网页的时候找到
# 模拟身份
head = {
    "User-Agent": "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14"
}
# url是指你想要得到信息的那个链接
def askURL(url):
    # get后得到的类型是 <class 'requests.models.Response'>
    response = requests.get(url, headers=head)

    # 防止中文出现乱码
    response.encoding = 'utf-8'

    # text后得到的类型是<class 'str'>,即string类
    # 得到的是网页的html代码
    html = response.text

    return html

之后要进行的是对于你获取这个网站的信息后,对这些庞大的数据进行分析,也就是从中找出你想要的数据,其他无用的舍去。
代码如下

# 得到想要的数据是其中最重要的一环,要从庞大的数据中筛选
def getData(baseurl):
    datalist = []		# 存储每个电影的信息,相当于一个二维数组,其中的每一个一维数组相当于一个电影拥有的信息
    for i in range(1, 10):      # 调用获取页面信息的函数,10次
        url = baseurl + str(i*25)	# 这里的baseurl+str(i*25)是指对于网页的翻页,也就是相当于从第一页翻倒第二页的样子
        html = askURL(url)      # 保存获取到的网页源码

        # 解析数据,逐一解析
        soup = BeautifulSoup(html, "html.parser")	# 这种类型的解析数据我也不大清楚,但应该就是用了之后就能进行查找
        for item in soup.find_all('div', class_="item"):       # 寻找符合要求的字符串,形成列表,这里插一句,find_all是把所有能匹配的都找出来,如果是find的话只能找出符合条件的第一个,但是,find之后还能进行find_all的查找,所以find可以用来缩小范围进行查找
            data = []			# 用来存储当前这个电影拥有的信息
            item = str(item) 	# 变为str类

            # 获取影片的名字
            name = re.findall(findName, item)	# 使用正则表达式,查找符合要求的数据,下面都差不多一样,加一些限制
            if(len(name) == 2):
                data.append(name[0].replace("/", ""))
                data.append(name[1].replace("/", ""))
            else:
                data.append(name[0].replace("/", ""))
                data.append(' ')    # 留空,为了好看

            # 获取影片的链接
            link = re.findall(findLink, item)[0]     # re库用来通过正则表达式查找指定的字符串
            data.append(link)

            # 获取影片的图片
            image = re.findall(findImage, item)[0]
            data.append(image)

            # 获取影片的简介
            bd = re.findall(findBd, item)[0]
            bd = re.sub('<br(\s+)?/>', " ", bd)
            bd = re.sub('/', " ", bd)
            data.append(bd.strip())

            # 获取影片的排名
            ranting = re.findall(findRating, item)[0]
            data.append(ranting)

            # 获取影片的评价人数
            number = re.findall(findnumber, item)[0]
            data.append(number)

            # 获取影片的概述
            inq = re.findall(findInq, item)
            if len(inq)!=0:
                data.append(inq[0].replace("。", ""))
            else:
                data.append(" ")    # 留空

            datalist.append(data)
    return datalist		# 最后得到的datalist拥有你所有想要的电影数据

最后便是数据整理,也就是把你得到的数据存储起来
代码如下

# 终于到最后一步了,存储数据对于上述的datalist中存储的数据放到excel中
def saveDate(datalist, savepath):
    book = xlwt.Workbook(encoding="utf-8", style_compression=0)	# excel中的方法,就不细谈了
    sheet = book.add_sheet('豆瓣电影', cell_overwrite_ok=True)	# sheet表示的是这个excel,这里的’豆瓣电影‘emmm不知道有什么用,也不是文件的名字
    col = ("影片中文名","影片外国名","电影链接","图片链接","相关信息","评分","评价数","概述")	
    # 这里表示的是excel中第一行的文字
    for i in range(0, 8):		# 把文字放入excel中
        sheet.write(0,i,col[i])		# 三个空,第一个表示行,第二个表示列,第三个表示数据
    for i in range(0, 50):
        print("第%d条"%(i+1))
        data = datalist[i]	
        for j in range(0, 8):
            sheet.write(i+1, j, data[j])	# 把对应的数据放进去
    book.save(savepath)		# 对excle关闭,并命名为savepath

最后放一下总的代码


import re  # 正则表达式,用来匹配相对应数据

import requests  # 用来获取整个网站的信息
import xlwt  # 进行excel操作,如果不想把数据放到excel中,例如图片的话可以放到文件夹中
from bs4 import BeautifulSoup  # 网页解析,获取数据,但和re的数据匹配有点不同


def main():
    baseurl = "https://movie.douban.com/top250?start="
    datalist = getData(baseurl)
    savepath = "豆瓣电影Top250.xls"
    # 3.保存数据
    saveDate(datalist, savepath)

# 正则表达式的匹配条件
findLink = re.compile(r'<a href="(.*?)">', re.S)  # 创建正则表达式对象,表示规则(字符串的模式)
findName = re.compile(r'<span class="title">(.*)</span>')    # re.S 让换行符包含在字符中
findImage = re.compile(r'<img.*src="(.*?)"', re.S)
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*?)</span>')
findnumber = re.compile(r'<span>(\d*)人评价</span>')
findInq = 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, 10):      # 调用获取页面信息的函数,10次
        # 这里的baseurl+str(i*25)是指对于网页的翻页,也就是相当于从第一页翻倒第二页的样子
        url = baseurl + str(i*25)	
        html = askURL(url)      # 保存获取到的网页源码

        # 解析数据,逐一解析
        soup = BeautifulSoup(html, "html.parser")	
        for item in soup.find_all('div', class_="item"):      
            data = []			# 用来存储当前这个电影拥有的信息
            item = str(item) 	# 变为str类

            # 获取影片的名字
            # # 使用正则表达式,查找符合要求的数据,下面都差不多一样,加一些限制
            name = re.findall(findName, item)	
            if(len(name) == 2):
                data.append(name[0].replace("/", ""))
                data.append(name[1].replace("/", ""))
            else:
                data.append(name[0].replace("/", ""))
                data.append(' ')    # 留空,为了好看

            # 获取影片的链接
            link = re.findall(findLink, item)[0]     # re库用来通过正则表达式查找指定的字符串
            data.append(link)

            # 获取影片的图片
            image = re.findall(findImage, item)[0]
            data.append(image)

            # 获取影片的简介
            bd = re.findall(findBd, item)[0]
            bd = re.sub('<br(\s+)?/>', " ", bd)
            bd = re.sub('/', " ", bd)
            data.append(bd.strip())

            # 获取影片的排名
            ranting = re.findall(findRating, item)[0]
            data.append(ranting)

            # 获取影片的评价人数
            number = re.findall(findnumber, item)[0]
            data.append(number)

            # 获取影片的概述
            inq = re.findall(findInq, item)
            if len(inq)!=0:
                data.append(inq[0].replace("。", ""))
            else:
                data.append(" ")    # 留空

            datalist.append(data)
    return datalist		# 最后得到的datalist拥有你所有想要的电影数据

def saveDate(datalist, savepath):
    # excel中的方法,就不细谈了
    book = xlwt.Workbook(encoding="utf-8", style_compression=0)	
    # sheet表示的是这个excel,这里的’豆瓣电影‘emmm不知道有什么用,也不是文件的名字
    sheet = book.add_sheet('豆瓣电影', cell_overwrite_ok=True)	
    col = ("影片中文名","影片外国名","电影链接","图片链接","相关信息","评分","评价数","概述")	
    # 这里表示的是excel中第一行的文字
    for i in range(0, 8):		# 把文字放入excel中
        sheet.write(0,i,col[i])		# 三个空,第一个表示行,第二个表示列,第三个表示数据
    for i in range(0, 250):
        print("第%d条"%(i+1))
        data = datalist[i]	
        for j in range(0, 8):
            sheet.write(i+1, j, data[j])    # 把对应的数据放进去
    book.save(savepath)		# 对excle关闭,并命名为savepath

def askURL(url):
    # get后得到的类型是 <class 'requests.models.Response'>
    head = {
        "User-Agent": "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14"
    }
    response = requests.get(url, headers=head)
    # 如果有中文的话会出现乱码
    response.encoding = 'utf-8'
    # text后得到的类型是<class 'str'>,即string类
    # 得到的是网页的html代码
    html = response.text
    return html

if __name__ == "__main__":
    main()
    print("爬取完毕")

写的最失败的一次了,把前面的代码复制粘贴到最后的总代码,然后发现一直报错,调试了半天就是不知道哪里出错了,然后。。。。代码完全一样,手打一遍,和复制粘贴。。。手打运行正确,复制粘贴一直报错。这是不是在暗示我要多敲代码了? 哭了
原本还想写一个爬图片的,,,现在心态崩了,明天试试吧。/喷血.jpg

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值