最近心血来潮花了两天时间看了一下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