|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 jiuridi 于 2020-4-17 19:52 编辑
- import re # 正则表达式,进行文字匹配
- import urllib.request, urllib.error # 制定URL,获取网页数据
- import xlwt # 进行excel操作
- import sqlite3 # 进行数据库操作
- from bs4 import BeautifulSoup # 网页解析,获取数据
- def main():
- baseURL = "https://movie.douban.com/top250?start=0"
- #爬取网页
- datalist = getData(baseURL)
- # savepath = ".\\豆瓣电影top250.xls"
- # 保存数据
- #saveDate(savepath)
- #askURL("https://movie.douban.com/top250?start=0")
- findLink = re.compile(r'<a href="(.*?)">') #创建正则表达式对象,表示规则(字符串的模式)
- #影片图片
- findImgSrc = re.compile(r'<img.*src="(.*?)"',re.S) #re.S 让换行符包含在字符中
- #影片片名
- findTitle = re.compile(r'<span class="title">(.*)</span>')
- #影片评分
- findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
- #找到评价人数
- findJudge = 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次
- url = baseurl + str(i*25)
- html =askURL(url)
- print(html)
- print(type(html)) #保存获取到的源码
- # 解析数据
- # print(type(datalist))
- #逐一解析
- soup = BeautifulSoup(html, "html.parser")
- for item in soup.find_all(class_="item"):
- data = [] #保存一部电影的所有信息
- #print(item) #测试查看电影item
- item = str(item)
- link = re.findall(findLink,item)[0] #需要给一个规则,正则表达式查找指定字符串获取第一个【0】
- data.append(link) #添加链接
- imgSic = re.findall(findImgSrc,item)[0]
- data.append(imgSic) #添加图片
- titles = re.findall(findTitle,item) #片名可能只有一个中文名
- if(len(titles) == 2):
- ctitle = titles[0] #添加中国名
- data.append(ctitle)
- otitle = titles[1].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)[0]
- if len(inq) != 0:
- inq = inq[0].replace("。","") #去掉句号
- data.append(inq) # 添加概述
- else :
- data.append(" ") #没有也要加空
- bd = re.findall(findBd,item)[0]
- bd = re.sub("<br(\s+)?/>(\s)?"," ",bd) #去掉<br/>
- bd = re.sub("/"," ",bd) #去掉/
- data.append(bd.strip( )) #去掉空格
- datalist.append(data) #电影信息
- print(datalist)
- return datalist
- #得到指定一个URL的网页内容
- def askURL(url):
- head = {
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0"
- }
- #用户代理,伪装成浏览器
- request = urllib.request.Request(url,headers=head)
- html = " "
- try:
- response = urllib.request.urlopen(request)
- html = response.read().decode("utf-8")
- # print(html)
- # print(type(html))
- except urllib.error.URLError as e:
- if hasattr(e,"code"):
- print(e.code)
- if hasattr(e,"reason"):
- print(e.reason)
- return html
- def saveDate(savepath):
- print("save......")
- #保存数据
- if __name__ == "__main__": #当程序执行时
- #调用函数
- main()
- #init_db("movietest.db")
- print("爬取完毕!")
复制代码 |
|