WordPress站内跳转设置,跨境电商公司招聘岗位及要求,交互效果很好的网站,邮箱地址怎么注册聚焦爬虫:爬取页面中指定的页面内容。 - 编码流程#xff1a; - 指定url - 发起请求 - 获取响应数据 - 数据解析 - 持久化存储 数据解析分类#xff1a;
正则bs4xpath#xff08;***#xff09; 数据解析原理概述#xff1a; - 解析的局部的文本内容都会在标签之间或者标… 聚焦爬虫:爬取页面中指定的页面内容。 - 编码流程 - 指定url - 发起请求 - 获取响应数据 - 数据解析 - 持久化存储 数据解析分类
正则bs4xpath*** 数据解析原理概述 - 解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储 - 1.进行指定标签的定位 - 2.标签或者标签对应的属性中存储的数据值进行提取解析 一、正则解析
常用正则表达式回顾
div classthumba href/article/121721100 target_blank
img src//pic.qiushibaike.com/system/pictures/12172/121721100/medium/DNXDX9TZ8SDU6OK2.jpg alt指引我有前进的方向
/a/divex div classthumb.*?img src(.*?) alt.*?/div项目需求爬取糗事百科指定页面的热图并将其保存到指定文件夹中 import requests
import re
import osif __name__ __main__:# 创建一个文件夹用来保存所有的图片if not os.path.exists(./qiutuLibs):os.mkdir(./qiutuLibs)# 2.UA伪装将对应的User-Agent封装到一个字典中headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36}# 设置一个通用的url模板url https://www.qiushibaike.com/imgrank/page/%d/for pageNum in range(2,3):# 对应页码的urlnew_url format(url%pageNum)# 使用通用爬虫对url对应的一整张页面进行爬取page_text requests.get(urlnew_url,headersheaders).text# 使用聚焦爬虫将页面中所有的图片进行解析他/提取ex div classthumb.*?img src(.*?) alt.*?/divimg_src_list re.findall(ex,page_text,re.S)print(img_src_list)for src in img_src_list:# 拼接出一个完整的图片urlsrc https: srcresponse requests.get(urlsrc,headersheaders)# 请求到了图片的二进制数据img_data response.content# 生成图片名称img_name src.split(/)[-1]# 图片最终存储的路径imgPath ./qiutuLibs/ img_namewith open(imgPath,wb) as fp:fp.write(img_data)print(img_name,下载成功)
二、bs4解析
bs4进行数据解析- 数据解析的原理- 1.标签定位- 2.提取标签、标签属性中存储的数据值- bs4数据解析的原理- 1.实例化一个BeautifulSoup对象并且将页面源码数据加载到该对象中- 2.通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取- 环境安装- pip install bs4- pip install lxml - 如何实例化BeautifulSoup对象- from bs4 import BeautifulSoup- 对象的实例化- 1.将本地的html文档中的数据加载到该对象中fp open(./test.html,r,encodingutf-8)soup BeautifulSoup(fp,lxml)- 2.将互联网上获取的页面源码加载到该对象中page_text response.textsoup BeatifulSoup(page_text,lxml)- 提供的用于数据解析的方法和属性- soup.tagName:返回的是文档中第一次出现的tagName对应的标签- soup.find():- find(tagName):等同于soup.div- 属性定位-soup.find(div,class_/id/attrsong)- soup.find_all(tagName):返回符合要求的所有标签列表- select- select(某种选择器idclass标签...选择器),返回的是一个列表。- 层级选择器- soup.select(.tang ul li a)表示的是一个层级- oup.select(.tang ul a)空格表示的多个层级- 获取标签之间的文本数据- soup.a.text/string/get_text()- text/get_text():可以获取某一个标签中所有的文本内容- string只可以获取该标签下面直系的文本内容- 获取标签中属性值- soup.a[href]from bs4 import BeautifulSoupif __name__ __main__:# 想要将本地的html文档的数据加载到对象中fp open(./test.html,r,encodingutf-8)soup BeautifulSoup(fp,lxml)# print(soup)# print(soup.a) # soup.tagName返回的是html中第一次出现的tagName标签# find(tagName) : 等同于soup.tagName# print(soup.find(div))# 属性定位# print(soup.find(div,class_song))# print(soup.find_all(a)) # 返回符合要求的所有标签返回一个列表# print(soup.select(.tang)) # 返回一个列表# print(soup.select(.tang ul li a)[0]) # 返回一个列表# print(soup.select(.tang ul a)[0]) # 返回一个列表# 获取标签之间的文本数据# text/get_text()可以获取某一个标签中所有的文本内容print(soup.a.text)print(soup.a.get_text())# string只可以获取该标签下面直系的文本内容print(soup.a.string)# 获取标签中属性值print(soup.a[href]) 项目需求使用bs4实现将诗词名句网站中三国演义小说的每一章的内容爬去到本地磁盘进行存储 import requests
from bs4 import BeautifulSoupif __name__ __main__:# 对首页的页面数据进行爬取url https://www.shicimingju.com/book/sanguoyanyi.html# 2.UA伪装将对应的User-Agent封装到一个字典中headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36}page_text requests.get(urlurl,headersheaders).text.encode(ISO-8859-1)# 1.实例化BeautifulSoup对象需要将页面源码数据加载到该对象中soup BeautifulSoup(page_text,lxml)# 2.解析章节标题和详情页的urlli_list soup.select(.book-mulu ul li)print(li_list)fp open(./sanguo.txt,w,encodingutf-8)for li in li_list:title li.a.stringdetail_url https://www.shicimingju.com/ li.a[href]# 对详情页发起请求解析出章节内容detail_page_text requests.get(urldetail_url,headersheaders).text.encode(ISO-8859-1)# 解析成详情页中相关的章节内容detail_soup BeautifulSoup(detail_page_text,lxml)div_tag detail_soup.find(div,class_chapter_content)# 解析到了章节的内容content div_tag.text# print(div_tag.text)fp.write(title:content\n)print(title,爬取成功)三、xpath解析
xpath解析最常用且最便捷高效的一种解析方式。通用性最强。- xpath解析原理- 1.实例化一个etree的对象且需要将被解析的页面源码数据加载到该对象中。- 2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。- 环境的安装- pip install lxml- 如何实例化一个etree对象:from lxml import etree- 1.将本地的html文档中的源码数据加载到etree对象中etree.parse(filePath)- 2.可以将从互联网上获取的源码数据加载到该对象中etree.HTML(page_text)- xpath(xpath表达式)- xpath表达式:- /:表示的是从根节点开始定位。表示的是一个层级。- //:表示的是多个层级。可以表示从任意位置开始定位。- 属性定位//div[classsong] tag[attrNameattrValue]- 索引定位//div[classsong]/p[3] 索引是从1开始的。- 取文本- /text() 获取的是标签中直系的文本内容- //text() 标签中非直系的文本内容所有的文本内容- 取属性/attrName img/src1.项目需求xpath解析案例-4k图片解析爬取 import requests
from lxml import etree
import osif __name__ __main__:url http://pic.netbian.com/4kmeishi/# UA伪装将对应的User-Agent封装到一个字典中headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36}response requests.get(urlurl,headersheaders)# 手动设定响应数据的编码格式# response.encoding utf-8page_text response.text# 数据解析 src的属性值 alt的属性值tree etree.HTML(page_text)li_list tree.xpath(//div[classslist]/ul/li)print(li_list)#创建一个文件夹if not os.path.exists(./picLibs):os.mkdir(./picLibs)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_name img_name.encode(iso-8859-1).decode(gbk)# print(img_src img_name)# 请求图片进行持久化存储img_data requests.get(urlimg_src,headersheaders).contentimg_path picLibs/ img_namewith open(img_path,wb) as fp:fp.write(img_data)print(img_name,下载成功) 2.项目需求xpath解析案例-全国城市名称爬取 import requests
from lxml import etreeif __name__ __main__:url https://www.aqistudy.cn/historydata/# UA伪装将对应的User-Agent封装到一个字典中headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36}page_text requests.get(urlurl,headersheaders).texttree etree.HTML(page_text)# 解析到热门城市和所有城市对应的a标签a_list tree.xpath(//div[classbottom]/ul/div[2]/li/a | //div[classbottom]/ul/li/a)all_city_names []for a in a_list:city_name a.xpath(./text())[0]all_city_names.append(city_name)print(all_city_names,len(all_city_names)) 3.项目需求批量爬取站长素材免费ppt并保存到本地 import time
import requests
from lxml import etree
import osif __name__ __main__:start time.perf_counter()if not os.path.exists(./ppt):os.mkdir(./ppt)headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36,}url https://sc.chinaz.com/ppt/free_1.htmlresponse requests.get(urlurl,headersheaders)page_text response.texttree etree.HTML(page_text)num 0urls tree.xpath(//div[idvueWaterfall]//a/href)for url in urls:url https://sc.chinaz.com/ urlpage_text requests.get(urlurl,headersheaders).texttree etree.HTML(page_text)download_url tree.xpath(//div[classdownload-url]/a[1]/href)[0]print(download_url)response requests.get(urldownload_url,headersheaders).contentwith open(./ppt/ download_url.split(/)[-1],wb) as fp:fp.write(response)num num 1print(已经下载str(num)个模板)print(爬取完成)end time.perf_counter()print(共耗时, end - start, 秒)