用xpath、bs4、re爬取B站python数据
import requests,re from lxml import etree from bs4 import BeautifulSoup def get_page(page): try: #这里要加上cookie headers = { 'Cookie': 'LIVE_BUVID=AUTO5015218915110407; sid=4oag5i0u; fts=1521891539; pgv_pvi=3655305216; UM_distinctid=16257cdfffd2e4-032750a28294b2-3b60450b-100200-16257cdfffe2a0; buvid3=7B94813D-1039-4A88-A1EE-9AEFDF54BE05140244infoc; rpdid=kxsliqpkisdosikxllmww; CURRENT_QUALITY=80; finger=edc6ecda', 'Host': 'search.bilibili.com', 'Referer': 'https://www.bilibili.com/', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' } url = 'https://search.bilibili.com/all?keyword=python&from_source=banner_search&spm_id_from=333.334.banner_link.1&page={}'.format(str(page)) response = requests.get(url,headers=headers) if response.status_code == 200: return response.text except Exception: return None #用xpath解析网页,获取属性值用符号@ def xpath_parse_page(html): data = etree.HTML(html) items = data.xpath('//*[@class="video-contain clearfix"]/li') for item in items: yield { 'video_image' : item.xpath('./a/div/div[1]/img/@src')[0], 'video_title' : item.xpath('./div/div[1]/a/text()')[0], 'video_view' : item.xpath('./div/div[3]/span[1]/text()')[0].strip(), 'video_updateTime' : item.xpath('./div/div[3]/span[3]/text()')[0].strip(), 'video_up' : item.xpath('./div/div[3]/span[4]/a/text()')[0] } #用bs4解析网页 def bs4_parse_page(html): soup = BeautifulSoup(html,'lxml') items = soup.find_all('li',{'class':'video matrix'}) for item in items: yield{ 'video_image' : item.find('img').get('src'), 'video_title' : item.find('a',{'class':'title'}).get_text(), 'video_view': item.find('span',{'class':'so-icon watch-num'}).get_text().strip(), 'video_updateTime' : item.find('span', {'class': 'so-icon time'}).get_text().strip(), 'video_up': item.find('span',{'title':'up主'}).get_text()#这里用class的属性得到的结果是播放量,要用title } #用正则解析网页,关键是确定好字段的定位,一般来说定位在字段上面的class属性里 def re_parse_page(html): pattern = re.compile('<li.*?info.*?title="(.*?)".*?icon-playtime"></i>(.*?)</span>.*?icon-date"></i>(.*?)</span>.*?up-name">(.*?)</a>',re.S) items = re.findall(pattern,html) for item in items: yield { 'video_title': item[0], 'video_view': item[1].strip(), 'video_updateTime':item[2].strip(), 'video_up': item[3].strip() } def main(): #处理翻页 for page in range(1,2):#这里更改爬取的页数 html = get_page(page) for result in bs4_parse_page(html):#这里更改使用哪一种方式解析网页,xpath、bs4、re print(result) if __name__ == '__main__': main()

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Grafana+prometheus+php 自动创建监控图
版权声明:作者:汤青松 https://blog.csdn.net/u013431141/article/details/81488180 背景 在grafana+ prometheus+php 监控系统实践文章当中已经实现了我们的第一个监控图表,现在我们有了一个新需求,需要对多个节点实现不同的监控,以及一个汇总的监控; 按照我们之前手动创建仪表盘的方法,每新增一个节点都需要手动去修改prometheus配置,并且需要去grafana系统当中创建一个仪表盘,在节点很少的时候这种方式也能满足,但当节点数量多起来的时候,就会增加很大一部分工作量,并且存在每次创建的图表规则不一致的风险,因此我们的需求是在新增节点之后让grafana自动创建一个仪表盘。 实现过程 操作步骤 prometheus调用中间件 中间件收集各节点数据 验证中间件数据有效性 调试仪表盘API接口 编写节点变动事件处理 一、prometheus调用中间件 1.修改prometheus配置文件 修改配置文件的目的是把之前直接连接单个节点的地址更改为中间件地址,之前单节点的uri为’==/api/v1/rrd/metrics...
- 下一篇
初识 Spring(05)---(Annotation注解)
Annotation 注解 注入注解:@Autowired 注入 1.加在set方法上,默认按类型by type,如果在 spring 容器中能够找到多个相同的类型,就从这多个类型找查找有没有一个key的值跟我们的 set 方法的参数名相同,如果有,就注入;没有的话,就无法判断要注入哪一个,导致报错 如果想用byName,使用@Qulifie 需要写在参数上 文件目录 代码:配置文件:beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://ww...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库