热搜链接:https://s.weibo.com/top/summary?Refer=top_hot
使用Requests + Re
1.分析目标
下图可看出主要,目标全部在 tbody 里,而里面的字段都在<tr>标签里
确认过眼神 是需要的部分!
因此 可以使用RE 进行简写获取内容
[\s]* 夺取多个空格
r'[\s]*<td class="td-01 ranktop">(.*?)</td>[\s]*<td class="td-02">[\s]*<a href="(.*?)&Refer=top" target="_blank">(.*?)</a>'
2.获取像目标网页发送请求
#使用 Requests get 请求获取文本 如下图所示 微博没有做对热搜的反扒
_Response = requests.get(url=url)
3.对获取的数据进行过滤
下面展示一些 内联代码片
。
Restr = r'[\s]*<td class="td-01 ranktop">(.*?)</td>[\s]*<td class="td-02">[\s]*<a href="(.*?)&Refer=top" target="_blank">(.*?)</a>'
Txt = "请求返回的数据"
result = re.findall(Restr,Txt)
成功获取 50个Top !0也算一个
PS:如果有兴趣还可以继续对内容爬取
4.对内容重新整理
下面展示一些 内联代码片
。
// 3 里可以看出取出的数据在列表的元组中有三个元素 分别 排行 详细链接 标题
#对数据进行简单重组
result = []
for i in ResultFirst:
result.append(
{"Top":i[0],
"Link":i[1],
"Title":i[2]
}
)
5.简化代码
import requests
import re
import random
class MySpider(object):
#因为热评没用到就先放在这吧。。
def _GetUser_Agents(self):
User_Agent = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36Chrome 17.0 – MACMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11 ",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0Firefox 4.0.1 – MAC",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
]
Num = (random.random()*100)%4
#print(f"随机Num:{Num}")
return User_Agent[Num]
def _GetUrlTxt(self,url:str)->str:
_Response = requests.get(url=url)
#打印出状态码
#print(_Response.status_code)
return _Response.text
def _GetSearch(self,Restr,Txt)->list:
result = re.findall(Restr,Txt)
#print(result)
return result
def Run(self,url):
result = []
Restr = r'[\s]*<td class="td-01 ranktop">(.*?)</td>[\s]*<td class="td-02">[\s]*<a href="(.*?)&Refer=top" target="_blank">(.*?)</a>'
UrlText = self._GetUrlTxt(url=url)
#print(UrlText)
#首先获取 当前的榜单
ResultFirst = self._GetSearch(Restr=Restr,Txt=UrlText)
#print(len(ResultFirst),ResultFirst)
#重组数据
for i in ResultFirst:
result.append(
{"Top":i[0],
"Link":i[1],
"Title":i[2]
}
)
return result
#在别的程序引入时不会执行这里的代码
if __name__ =="__main__":
url = r"https://s.weibo.com/top/summary?Refer=top_hot"
pi = MySpider()
result = pi.Run(url=url)
print(result)