作者:山间农夫的家 | 来源:互联网 | 2023-10-12 17:31
虽然今天很累,但是其实也没有学很多东西,还是来整理一下,以免忘记,之后会自己去爬一些网站数据… 今天主要学了bs4和xpath,分为这两个部分来整理笔记:
1.bs4解析 为什么需要在爬虫中使用数据解析 数据解析的通用原理(解析的数据指挥存在于标签之间或者属性中) bs4数据解析的解析原理/流程 实例化一个BeautifulSoup的对象,且将等待被解析的数据加载到该对象中 方式1: BeautifulSoup(fp,‘lxml’) #解析本地存储的html文件 方式2: BeautifulSoup(page_text,‘lxml’) #解析互联网上请求到的页面数据 调用BeautifulSoup对象中的相关方法和属性进行标签定位和数据的提取 标签定位 soup.tagName:返回第一次出现的tagName标签 属性定位:soup.find(‘tagName’,attrName=‘value’) findALL和find的用法一样,但是返回值不同 选择器定位:select(‘selector’) 数据的提取 提取标签中存在的数据 .string:取出标签直系的文本内容 .text:取出标签中所有的文本内容 提取标签属性中存储的数据 环境的安装: pip install bs4 pip install lxml 直接用一个例子来看,使用bs4爬取某网站上面三国演义的内容,需要添加headers
import requests url = 'http://shicimingju.com/book/sanguoyanyi.html' page_text = requests. get( url, headers= headers) . text fp = open ( './sanguo.txt' , 'w' , encoding= 'utf-8' ) soup = BeautifulSoup( page_text, 'lxml' ) a_list = soup. select( '.book-mulu > ul > li >a' ) for a in a_list: title = a. stringdetail_url = 'http://shicimingju.com' + a[ 'href' ] page_text_detail = requests. get( url= detail_url, headers= headers) . textsoup = BeautifulSoup( page_text_detail, 'lxml' ) content = soup. find( 'div' , class_= 'chapter_content' ) . textfp. write( title+ ':' + content+ '\n' ) print ( title, '下载成功' )
2.xpath解析 html标签结构 xpath解析原理 实例化一个etree对象,且将被解析的数据加载到该对象中 解析本地存储的html文档: 解析网上爬取的html数据: 使用etree对象中的xpath方法结合不同的xpath表达式实现标签定位和数据提取 标签定位 最左侧的/:必须要从根标签开始逐层的定位目标标签 非最左侧的/:表示一个层级 非最左侧的//:表示多个层级 最左侧的//:可以从任意位置定义目标标签 属性定位://tagName[@attrName=‘value’] 索引定位://tagName[index],index索引从1开始 模糊匹配 //div[contains(@class,“ng”)] :定位到class属性中包含ng的div标签 //div[starts-with[@class,“ta”]] :定位到clss属性值中是以ta开头的div标签 数据提取 取标签中的数据 /text():直系文本内容 //text():所有的文本内容 取属性中的数据 下面介绍爬取图片数据和图片名称并将其保存到本地的例子,需要添加headers
import requestsimport os dirName = 'img' url = 'http://pic.netbian.com/4kdongman/index_%d.html' for page in range ( 1 , 6 ) : if page == 1 : new_url = 'http://pic.netbian.com/4kdongman/' else : new_url = format ( url% page) response = requests. get( new_url, headers= headers) response. encoding= 'gbk' page_text = response. text tree = etree. HTML( page_text) li_list = tree. xpath( '//div[@class="slist"]/ul/li' ) for li in li_list: img_src = 'http://pic.netbian.com' + li. xpath( './a/img/@src' ) [ 0 ] img_name = li. xpath( './a/img/@alt' ) [ 0 ] + '.jpg' img_data = requests. get( img_src, headers= headers) . contentfilePath = dirName+ '/' + img_namewith open ( filePath, 'wb' ) as fp: fp. write( img_data) print ( img_name, '下载成功' )
今天就先写这么多了…还没学tableau,/(ㄒoㄒ)/~~,要加油呀