#爬取网页
def getData(baseurl):
datalist=[]
for i in range(0,10):
url=baseurl+str(i*25) #调用10词循环 拿到250条信息
html=askURL(url) #保存获取到的网页源码
def askURL(url):
head={
"User-Agent":"Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 105.0.0.0Safari / 537.36"
} #被理解为浏览器 用户代理表示告诉豆瓣 模拟浏览器头部信息发送消息
req=urllib.request.Request(url=url,headers=head)
html=""
try:
response=urllib.request.urlopen(req)
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
#2.解析数据 for之中 一个网页解析一下
soup=BeautifulSoup(html,"html.parser")
for item in soup.find_all('div',class_="item"): #查找符合要求的字符串 形成列表 class做属性加下划线
#print(item) 测试用:查看所以item信息
data=[]#保存一部电影的所有信息
item=str(item) #变成一个字符型 可以用正则表达式
link=re.findall(findLink,item)[0] #需要给他一个规则 也就是正则表达式 [0]就是筛选出第一个
print(link) #获取到影片详情的链接
(1)首先还是接着上次的说 得到全部的html源码
(2)用soup=BeautifulSoup(html,"html.parser") 对源码进行翻译,变成tag
(3)观察网页源码 发现我们要的信息在div这个字符串下的class_属性中的item里面,相当于这个是他的一级目录。
(4)item转换成str形式 即将进行finaall中findlink的操作,这里涉及源码的正则编译
def main():
baseurl="https://
#1.爬取网页
datalist=getData(baseurl)
savapath = ".\\.xls"
#3.保存数据
#savaData(savepath) #quanj
#链接的规则
findLink=re.compile(r'<a href="(.*?)">') #创建正则表达式对象,表示出目标规则 herf后面是网址的表示 ?0词或一次
#图片的规则
findImgSrc=re.compile(r'<img.*src="(.*?)"'.re.S) #re.S 忽略中间的换行符
#片名
findt=re.compile(r'<span class="title">(.*)</span>')
#评分
findra=re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#评价人数
findpeo=re.compile(r'<span>(\d*)人评价</span>')
#找概况
findinq=re.compile(r'<span class="inq">(.*)</span>') #()
#相关内容
findbd=re.compile(r'<p class="">(.*))</p>',re.S)
一般把编译规则放到主程序下 而不用进单一的网页解析循环中
findLink=re.compile(r'<a href="(.*?)">')
以href为例,其实基本的操作都差不多,不同的是编译规则 这个从网页源代码中来的。
r'是破解转译符号 相同的地方复制粘贴 不同的地方进行编译
都有()这样的括号 对内容进行分组
.表示中间有任意字符
(.*) 表示中间的任意字符有任意多个
(\d*) 0-9内的数字可以无限多
(.*?) 可以有字符 也可以什么都没有 范围其实更大