irpas技术客

爬虫之bs4、xpath数据解析(案例—scrapy获取菜鸟HTML页面数据)_朱莉安娜·_python爬虫scrapy和bs4

irpas 3587

文章结构 1、爬虫概念简介2、爬虫的流程3、数据解析(1)bs4解析(I)根据标签名查找 soup.a(II)获取属性 soup.a[attr](III)soup.a.text 获取响应文本内容(字符串)(IV)soup.find("target") 找到第一个符合要求的标签,外加属性定位(V)soup.find_all("target"):找到所有符合要求的标签(VI)根据选择器select选择指定的内容 (2)xpath解析(I) 定位标签内容etree.xpath()(II)定位class=song的div(III)跨多级标签获取数据(IV)/text() 取标签直系文本, //text()取所有(V)取属性 tree.xpath("//a/@href) (3)正则解析(I)单字符:(II)数量修饰:(III)边界:(IV)分组: 4、爬虫实战案例5、数据解析案例数据

1、爬虫概念简介

1、爬虫:通过编写程序模拟浏览器上网,让其去互联网获取数据的程序。

2、爬虫分类:

a)通用爬虫:获取整张页面b)聚焦爬虫:获取一张页面中的某部分数据(一般通过正则过滤)c)增量式爬虫:实时更新数据抓取反爬机制:通过相关技术阻止爬虫进行网站数据的爬取反反爬策略:攻破反爬机制获取数据

3、 http协议:client与server进行数据交互的形式。

请求访问使用的头部(headers)常用信息:

User-Agent:请求载体的身份标识Connection:‘close’content-type:服务器返回给客户端的数据类型

4、https:安全的http协议(证书密钥加密)

2、爬虫的流程 1)指定url。即网页地址,这里需要注意是否为Ajax请求,如果是我们需要通过定位找到真正携带我们想要数据的页面的url。2)发起请求。request.get(url), request.post(url)3)获取响应数据。根据步骤(2)请求页面会有响应数据响应,根据响应数据的类型,可以用content标是二进制数据,text表示文本,json()表示json类型。4)数据解析。为什么要数据解析呢?当获取到网页整个数据时,我们并不是需要整个页面的数据,这样不利于查找和发现价值信息。这时需要通过数据解析,例如xpath,beautifulSoup库来获取需要的某一部分数据。5)数据持久化存储。在完成了步骤(4)之后,数据已经干净了,数据格式也规范统一了,这时可以存储到本地数据库或者其他地方。 3、数据解析

整个爬虫流程关键的部分之一:数据解析。试想一下,你把整个页面的数据给你老板,老板啥也看不到,还得戴眼镜慢慢查找他想要的信息。如果你的数据没有任何规律可言,你觉得有价值吗?可利用吗?

数据解析目的:聚焦获取的数据

数据解析方法:

正则xpathbs4

数据解析原理:

1.标签的定位2.提取标签中存储的文本数据或标签属性中存储的数据 (1)bs4解析

解析原理:

实例化一个beautiful对象,并且将源码数据加载到数据中使用该对象的相关属性和方法实现标签定位和数据提取

实例化对象

BeautifulSoup(page_text,‘lxml’) 从网页加载响应数据(网页数据)BeautifulSoup(fp,‘lxml’) 从本地加载数据 (I)根据标签名查找 soup.a soup.a 只能找到第一个符合要求的标签 f = open('./test.html', 'r', encoding='utf-8') soup = BeautifulSoup(f, 'lxml') print(soup.div.text)

打印结果如下,上下各有一个换行符,这不是必须有的,得看源数据格式是怎么样的。

(II)获取属性 soup.a[attr] soup.a.attrs 获取a所有的属性和属性值,返回一个字典soup.a.attrs[‘href’] 获取href属性soup.a[‘href’] 也可简写为这种形式 print('\n', soup.a.attrs) # 输出结果:{'href': 'http://·Html import CnhtmlSpider def spider_interface(): settings = get_project_settings() cp = CrawlerProcess(settings) cp.crawl(CnhtmlSpider) cp.start() if __name__ == '__main__': spider_interface()

另外在配置文件setting.py中,我们需要开启下载中间件和pipeline,即启用原先注释的语句

DOWNLOADER_MIDDLEWARES = { 'spider_engine_cainiao.middlewares.SpiderEngineCainiaoDownloaderMiddleware': 543, } ITEM_PIPELINES = { 'spider_engine_cainiao.pipelines.SpiderEngineCainiaoPipeline': 300, }

尝试用通用爬虫直接暴力爬取,但是遇到访问过快的问题,后续会完善,通过增加ip代理池或者其他手段。

import time import requests import kuser_agent as kua from lxml import etree url = 'https://·/html/html-tutorial.html' headers = {'User-Agent': kua.get()} page_text = requests.get(url=url, headers=headers, timeout=100).text text = etree.HTML(page_text).xpath('//div[@id="leftcolumn"]/a') for idx, a in enumerate(text): href = 'https://·' + a.xpath('./@href')[0] filename = a.xpath('./text()')[0].strip() + '.html' content = requests.get(url=href, headers={'User_Agent': kua.get()}).content with open('./cainiao/%s' % filename, 'wb') as f: f.write(content) time.sleep(3) 5、数据解析案例数据 <html lang="en"> <head> <meta charset="UTF-8" /> <title>测试bs4</title> </head> <body> <ul>'就看见离开家'</ul> <div class="hhh"> <span class="tag-item">语文</span> <span class="tag-item">数学</span> <span class="tag-item">物理</span> </div> <div class="song"> <span class="kong">'上看见看见啦'</span> <span class="wu">上看见</span> <p>李清照</p> <p>王安石</p> <p>苏轼</p> <p>柳宗元</p> <a href="http://·/" title="赵匡胤" target="_self"> <span>this is span</span> 宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱 </a> <a href="" class="du">总为浮云能蔽日,长安不见使人愁</a> <img src="http://·/meinv.jpg" alt="" /> </div> <div class="qingkong"> <p>百里守约</p> </div> <div class="tang"> <ul> <li><a href="http://·" title="qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a></li> <li><a href="http://·" title="秦">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a></li> <li><a href="http://·" alt="qi">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a></li> <li><a href="http://·" class="du">杜甫</a></li> <li><a href="http://·" class="du">杜牧</a></li> <li><b>杜小月</b></li> <li><i>度蜜月</i></li> <li><a href="http://·" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a></li> </ul> </div> </body> </html>


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #url #osimport #scrapyfrom #lxml