前期的数据爬取及分类整理
from bs4 import BeautifulSoup
import re
import urllib.request
def main():
baseurl = "https://movie.douban.com/top250?start=0&filter="
#1.爬取网页
datalist = getData(baseurl)
savepath =r".豆瓣电影top250.xls"#./:保存至当前位置。.:保存至文件路径
#3.保存数据
saveData(savepath)
#创建正则表达式的规则:匹配掉什么?留下的是什么??
#影片详情连接的规则
findlink = re.compile(r'<a href="(.*)">') #创建正则表达式,表示规则 (.*?):网站都是字符串表示的,来表示任意的字符串
#所设立的规则中利用正则表达式的是即为所要提取的内容
#影片图片的提取
findimage = re.compile(r'<img .* src="(.*?)"/>',re.S) #re.S让换行符包含在字符中,进行无差别的匹配
#影片的片名
findname = re.compile(r'<span .*>(.*?)</span>')
#影片的评分
findscore = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#影片的简介
summary = re.compile(r'<p class="">(.*?)</p>',re.S) #换行符很重要!!!!
#爬取网页
def getData(baseurl):
datalist = []
#对网址进行加工
for i in range(0,1): #调用获取页面信息10次
url = baseurl + str(i*25)#需要对url的样式进行观察并总结其中的规律
html = askURL(url)#保存获取到的额网页源码
#2.逐一解析数据
data = []
soup = BeautifulSoup(html,"html.parser")#解析器
for item in soup.find_all("div",class_="item"): #查找符合要求的字符串,形成列表??
item = str(item)#是有对数据的类型进行字符串装换的啊!!!
link = re.findall(findlink,item)[0] #re库用来通过正则表达式查找指定的字符串,利用规则进行匹配
data.append(link)
image = re.findall(findimage, item)
data.append(image)
#对标题进行加工
titles = re.findall(findname, item)
if (len(titles)==2):
ctitles = titles[0]
data.append(ctitles)
otitles = titles[1].replace("/",'')
data.append(otitles)
else:
data.append(titles[0])
data.append(" ")#外文名留空
vieos_summary = re.findall(summary,item)[0] #这里肯定还是字符串类型!!
vieos_summary = re.sub(r'<br/>(s+)?'," ",vieos_summary) # 匹配空格 ,此处设立的规则是你所要调换的对象,
# 问题如果前后没有标识物,是否还可以(可以的)
vieos_summary = re.sub("/"," ",vieos_summary)
vieos_summary = re.sub(" ",'',vieos_summary)
data.append(vieos_summary)
print(data)
break
return datalist
#爬取网页内容
def askURL(url):#传一个参数
head = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"}
#头部信息,伪装部分成浏览器需要的必要信息
request = urllib.request.Request(url,headers=head)
html = ""
try:
response =urllib.request.urlopen(request)#发出请求返回一个对象
html = response.read().decode("utf-8")
# print(html)
except urllib.error.URLError as e:#让程序更加健壮
if hasattr(e,"code"):#分析出错类型
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
return html
#保存数据
def saveData(savepath):
pass
if __name__ == "__main__":#主函数
main()
思考及整理( 残!!!待补充!!)
# 第一步简单的网页爬取
html = "https://movie.douban.com/top250?start=0&filter="
import urllib.request
import re
head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"
}
request = urllib.request.Request(html,headers = head)
respond = urllib.request.urlopen(request)#发出请求并返回一个对象
result = respond.read().decode("utf-8")
print(result)
'''
对于urllib,request爬取网页的步骤
1.研究url的规律,是单独的网页信息还是有各种连接的
2.伪装成浏览器
3.利用Request函数进行信息的爬取此时应传入所伪装的头部信息
4.利用urlopen打开
5.读取所返回的对象(注意是否含有汉语,视情况是否加utf-8)
6.最后得出的结果应该是html类型???
'''
#第二步:对信息进行加工处理
from bs4 import BeautifulSoup
soup = BeautifulSoup(result,"result.parser") #对html进行解析
soup = soup.findall("div",class_="item") #找到完整的信息块
print(str(soup))
#利用正则表达式,对信息进行分类整理
findlink = re.compile(r'')
print(soup,type(soup))
小知识点
Beautiful Soup将复杂的HTML文档转换成一个复杂的树形结构,每个节点都是python对象,所有对象可以归纳为4种
- Tag
- NavigableString
- BeautifulSoup
- Comment