Spider爬虫个人练习

Virginia ·
更新时间:2024-11-14
· 666 次阅读

# -*- codeing = utf-8 -*- # @Time : 2020/4/4 21:14 # @Author : LIU J # @File : spider.py # @Software: PyCharm import bs4 # 网页解析,获取数据 from bs4 import BeautifulSoup # 网页解析,获取数据(其实只用到了BeautifulSoup) import re # 正则表达式,进行文字匹配 import urllib.request, urllib.error # 制定URL,获取网页数据 import xlwt # 进行Excel操作 import sqlite3 # 操作SQLite数据库 import urllib.request import urllib.parse ''' def main(a): print("hello",a) if __name__ == "__main__": #当程序执行时,第一个执行的函数 (保证了程序的入口) main(1) #调用函数 ''' # 流程: # 1.爬取网页 # 2.逐一解析数据 # 3.保存数据 def main(): baseurl = "https://movie.douban.com/top250?start=" datalist = getData(baseurl) savepath = ".\\豆瓣电影Top250.xls" saveData(datalist,savepath) # 1.爬取网页 # datalist = getData(baseurl) # savepath = ".\\豆瓣电影Top250.xls" # 给定保存路径, "." 表示保存到本地文件夹,第一个 "\" 表示转义字符, 如果不想用转译字符在等号后面加 r 也可以 # 3.保存数据 # saveData(savepath) # askURL("https://movie.douban.com/top250?start=") #创建正则表达式规则 #"."表示一个字符 ".*"表示0次到多次,多个字符 ".*?"表示0次或一次 #影片详情链接的规则 findLink = re.compile(r'') #创建一个全局的正则表达式对象,表示规则(字符串的模式) #影片图片 findImgSrc = re.compile(r'',re.S) #re.S 表示忽略换行符,让换行符包含在字符中 #影片的片名 findTilte = re.compile(r'(.*)') #影片评分 findRating = re.compile(r'(.*)') #找到评价人数 findJudge = re.compile((r'(\d*)人评价')) #\d表示整数,\d*表示多个整数组成的数 #找到概况 findInq =re.compile(r'(.*)') #找到影片的相关内容 findBd = re.compile(r'

(.*?)

',re.S) # 1.爬取网页 def getData(baseurl): datalist = [] # 2.逐一获取数据 for i in range(0,10): #调用获取页面信息的函数,10次 url = baseurl + str(i*25) html = askURL(url) #保存获取到的网页源码 # 2.逐一解析数据 soup = BeautifulSoup(html,"html.parser") for item in soup.find_all('div', class_="item"): #print(item) #测试:查看电影item全部信息 data = [] #保存一部电影的所有信息 item = str(item) #影片详情的链接,并追加进data link = re.findall(findLink,item)[0] #通过正则表达式re库查找指定的字符串 #[0]是因为这是一个字符串我们需要拿到str中的第一个值 data.append(link) #添加链接 # 影片详图片的链接,并追加进data imgSrc = re.findall(findImgSrc,item)[0] data.append(imgSrc) #添加图片 # 标题 titles = re.findall(findTilte,item) #片名可能只有一个中文名,没有外文名 if len(titles)==2: ctitle = titles[0] data.append(ctitle) #添加中文名 otitle = titles[1].replace("/","") #replace("/","")表示把"/"替换成空值"",去掉无关的符号 data.append(otitle) #添加外文名 else: data.append(titles[0]) data.append(" ") #没有外文名,留空 # 打分 rating = re.findall(findRating,item)[0] data.append(rating) #添加评分 judgeNum = re.findall(findJudge,item)[0] data.append(judgeNum) #添加评价人数 inq = re.findall(findInq,item) if len(inq)!=0: inq = inq[0].replace("。","") data.append(inq) #添加概述 else: data.append("") #没有概述,留空 #bd信息 bd = re.findall(findBd,item)[0] bd = re.sub('(\s+)?'," ",bd) #去掉
bd = re.sub('/'," ",bd) #替换/ data.append(bd.strip()) #去掉前后的空格 datalist.append(data) #把处理好的一部电影的信息放入datalist return datalist # 得到一个指定URL的网页信息 def askURL(url): head = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36 Edg/80.0.361.109"} # 模拟浏览器头部信息,向豆瓣服务器发送消息 # 用户代理, 表示高速服务器,我们什么类型的机器,浏览器(本质上是高速浏览器,我们可以接受什么水平的信息) request = urllib.request.Request(url=url, headers=head) html = "" # 用来存储返回信息的字符串 try: response = urllib.request.urlopen(request,timeout = 50) html = response.read().decode("utf-8") #print(html) return html except urllib.error.URLError as e: if hasattr(e, "code"): # 打印错误原代码,404 418什么的 print(e, code) if hasattr(e, "reason"): # 打印错误原原因,time out什么的 print(e.reason) # 3.保存数据 def saveData(datalist,savepath): print("save...") book = xlwt.Workbook(encoding="utf-8",style_compression=0) # 创建workbook对象 sheet = book.add_sheet("豆瓣电影Top250",cell_overwrite_ok=True) # 创建工作表 col = ("电影详情链接","图片链接","影片中文名","影片外文名","评分","概况","相关信息") for i in range(len(col)): sheet.write(0,i,col[i]) #列名 for i in range(0,250): print("第%d条"%(i+1)) data = datalist[i] for j in range(len(col)): sheet.write(i+1,j,data[j]) #数据 book.save("豆瓣电影Top250.xls") #保存 print("爬取完毕") if __name__ == "__main__": main()

作者:Bobby?



spider

需要 登录 后方可回复, 如果你还没有账号请 注册新账号