阅读指南一个人走得远了,就会忘记自己为了什么而出发,希望你可以不忘初心,不要随波逐流,一直走下去
曆 欢迎关注点赞收藏留言
濾 本文由 程序喵正在路上 原创,CSDN首发!
系列专栏:Python爬虫
首发时间:2022年8月9日
✅ 如果觉得博主的文章还不错的话,希望小伙伴们三连支持一下哦
- bs4解析
- 1. HTML语法规则
- 2. bs4模块安装
- 3. 搞搞农产品价格
- 4. 抓取彼岸图网壁纸
- xpath解析
bs4 解析比较简单,但是呢,我们需要了解一些基础的前端知识,然后再使用 bs4 去提取,逻辑就会清晰很多,编写难度也会大大降低
HTML(Hyper Text Markup Language)超文本标记语言,是我们编写网页的最基本同时也是最核心的一种语言,其语法规则就是用不同的标签对网页上的内容进行标记,从而使网页显示出不同的展示效果
数据解析
上述代码的含义是在页面中显示 “数据解析” 4 个字,但是 “数据解析” 这 4 个字被 “” 和 “” 标记了,这个时候,浏览器在展示的时候就会让里面的内容,也就是 ”数据解析“ 这 4 个字变大加粗,俗称标题,所以 HTML 的语法就是用类似这样的标签对页面内容进行标记,不同的标签表示出来的效果也是不一样的
h1:一级标题 h2:二级标题 p:段落 font:字体 body:主体
这里只是给小白们简单科普一下,HTML 的标签远不止这些
好的,标签我们明白了,接下来就是属性了
数据解析
数据解析
我们还可以在标签中添加 ” align='right' " 这样的东西,这又是什么呢?
首先,这两个标签都是 h1 标签,都是一级标题,但是下面这个会显示在右边,也就是说,通过这种形式对 h1 标签添加了说明,这种语法在 HTML 中被称为标签的属性,并且属性可以有很多个
总结:HTML 语法:
<标签 属性="值" 属性="值"> 被标记的内容 标签>
有了这些知识,我们再去看 bs4 就会得心应手了,因为 bs4 就是通过标签和属性去定位页面上的内容的
2. bs4模块安装bs4 是一个第三方库,首先我们得进行安装
在 Python 中推荐使用 pip 进行安装,很简单,在 Pycharm 下方找到 Terminal,输入以下命令:
pip install bs4
如果安装过慢,可以考虑更换为国内源:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple bs43. 搞搞农产品价格
bs4 在使用的时候需要参照一些 HTML 的基本语法来进行使用,通过案例来学会使用 bs4 更加快捷
我们来尝试抓取北京岳各庄批发市场的农产品价格 ➔ 目标网站
代码实现:
import csv import requests from bs4 import BeautifulSoup # 获取页面源代码 url = "http://www.ygzapm.com/web/dailyPrice" resp = requests.get(url) # print(resp.text) # 测试用 f = open("农产品信息.csv", mode="w", encoding='utf-8', newline='') csvWriter = csv.writer(f) # 解析数据 # 1. 把页面源代码交给 BeautifulSoup 进行处理,生成 bs 对象 page = BeautifulSoup(resp.text, "html.parser") # 指定html解析器 # 2. 从bs对象中查找数据,两个函数 # find(标签, 属性=值) 找一个 # find_all(标签, 属性=值) 找全部 # table = page.find("table", class_="table") # 加下划线区分关键字,与下面的表达式一样 table = page.find("table", attrs={"class": "table"}) # print(table) # 测试用 trs = table.find_all("tr")[1:] for tr in trs: # 遍历表格的每一行 tds = tr.find_all("td") type = tds[0].text # 拿到被标签标记的内容 name = tds[1].text max_price = tds[2].text min_price = tds[3].text avg_price = tds[4].text unit = tds[5].text market = tds[6].text date = tds[7].text # print(type, name, max_price, min_price, avg_price, unit, market, date) # 测试用 csvWriter.writerow([type, name, max_price, min_price, avg_price, unit, market, date]) resp.close() f.close() print("over!!!")
效果:
你也可以对代码进行改进,抓取多页数据,但个人建议不要将全部数据都抓取下来
4. 抓取彼岸图网壁纸彼岸图网
你以为我们要抓取的是这些图片吗?
其实不是,我们要抓取的是点击图片进入的页面的高清图片,也就是如下
具体步骤一共有三步:
- 获取主页面源代码,然后提取子页面的链接地址
- 获取子页面源代码,查找图片的下载地址
- 下载图片
废话不多说,开搞
import requests from bs4 import BeautifulSoup import time # 1. 获取主页面源代码,然后提取子页面的链接地址 url = "https://pic.netbian.com/" resp = requests.get(url) resp.encoding = 'gbk' main_page = BeautifulSoup(resp.text, "html.parser") alist = main_page.find("div", class_="slist").find_all("a") # print(alist) # 测试用 for a in alist: href = url + a.get('href') # 通过get得到属性的值,拼接得到完整子页面链接 # print(a) # 测试用 # 2. 获取子页面源代码,查找图片的下载地址 sub_page_resp = requests.get(href) sub_page_resp.encoding = 'gbk' sub_page_text = sub_page_resp.text # 从子页面中获取图片的下载地址 sub_page = BeautifulSoup(sub_page_text, "html.parser") div = sub_page.find("div", class_="photo-pic") img = div.find("img") img_href = url + img.get("src").strip("/") # 拼接图片的下载地址 # print(img_href) # 测试用 # 3. 下载图片 img_resp = requests.get(img_href) img_name = img_href.split("/")[-1] # 图片名称 img_package = "D:\pythonProject\images\" # 先自己创建一个文件夹以便存放图片,再运行程序 with open(img_package + img_name, mode='wb') as f: f.write(img_resp.content) # 这里拿到的是字节 img_resp.close() sub_page_resp.close() print(img_name + " 已下载成功") time.sleep(1) # 让服务器休息一下 resp.close() print("over!!!")
这里是因为我的编译器设置了背景,图片效果不是特别好,还行
xpath解析xpath 是一门在 XML 文档中查找信息的语言,xpath 可用来在 XML 文档中对元素和属性进行遍历,而我们熟知的 HTML 恰巧属于 XML 的一个子集,所以完全可以用 xpath 去查找 html 中的内容
首先,我们先了解几个概念
1 天才基本法 8.9 林朝夕 裴之
在上述 html 中,
- book, id, name, price…都被称为节点.
- Id, name, price, author 被称为 book 的子节点
- book 被称为 id, name, price, author 的父节点
- id, name, price,author 被称为同胞节点
好的,有了这些基础知识后,我们就可以开始了解 xpath 的基本语法了
在 Python 中想要使用 xpath,需要安装 lxml 模块
pip install lxml
用法:
- 将要解析的 html 内容构造出 etree 对象.
- 使用 etree 对象的 xpath() 方法配合 xpath 表达式来完成对数据的提取
from lxml import etree xml = """""" tree = etree.XML(xml) # result = tree.xpath("/book") # / 表示层级关系,第一个 / 是根节点 # result = tree.xpath("/book/name/text()") # text() 获取文本 # result = tree.xpath("/book/author/nick/text()") # result = tree.xpath("/book/author//nick/text()") # 获取author里面所有nick里面的内容 # result = tree.xpath("/book/author/*/nick/text()") # * 任意的节点,通配符 result = tree.xpath("/book//nick/text()") # 获取所有nick里面的内容 print(result) 1 天才基本法 8.9 林朝夕 裴之 周杰伦1 周杰伦2 佩奇 乔治
准备一个 HTML 文件:
Title
xpath 最方便的地方在于它可以直接复制,都不用你写
浏览器右击选择检查,点左上角小箭头点击你要提取的内容,它会自动匹配对应的 HTML 代码,右击 HTML 代码,选择复制,选择 xpath
from lxml import etree tree = etree.parse("data.html") # result = tree.xpath('/html/body/ul/li[1]/a/text()') #xpath的顺序是从1开始数的 # result = tree.xpath("/html/body/ol/li/a[@href='https://blog.csdn.net/weixin_62511863/article/details/cannon']/text()") # 属性筛选 # print(result) # ol_li_list = tree.xpath("/html/body/ol/li") # for li in ol_li_list: # print(li.xpath("./a/text()")) # 在li中继续查找,相对查找 # print(li.xpath("./a/@href")) # 获取属性值 # # print(tree.xpath("/html/body/ul/li/a/@href")) print(tree.xpath("/html/body/div[1]/text()"))
笠 这次的分享就到这里啦,继续加油哦^^
我是程序喵,陪你一点点进步
有出错的地方欢迎在评论区指出来,共同进步,谢谢啦