浅谈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后得到的类型是 
    response = requests.get(url, headers=head)

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

    # text后得到的类型是,即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('', " ", 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'', re.S)  # 创建正则表达式对象,表示规则(字符串的模式)
findName = re.compile(r'(.*)')    # re.S 让换行符包含在字符中
findImage = re.compile(r', re.S)
findRating = re.compile(r'(.*?)')
findnumber = re.compile(r'(\d*)人评价')
findInq = re.compile(r'(.*)')
findBd = re.compile(r'

(.*?)

'
, 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('', " ", 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后得到的类型是 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后得到的类型是,即string类 # 得到的是网页的html代码 html = response.text return html if __name__ == "__main__": main() print("爬取完毕")

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

你可能感兴趣的:(浅谈python爬虫)