一、python requests爬虫[数据提取]
2023-12-13 21:55:59
一、正则表达式
基础储备:正则表达式
1. json
解释:爬取json储存的url
流程:
- 发现目标:打开目标网址
- 若该网址通过ajax请求图片数据,通过开发者工具发现该请求地址
import requests
import re
url = "https://www.luhuoop.cn/backgroun24d/mp/m538773p" # 不能直接使用
response = requests.get(url=url,verify=False)
data = str(response.json()) # 获取的json数据转为字符串
print(data)
# [{'id': 1, 'imgurl': './static/image/a1.jpg'}, {'id': 2, 'url': '/content?id=2', 'imgurl': './static/image/b1.jpg'}, {'id': 3, 'imgurl': './static/image/c1.jpg'}]
rule = "'imgurl': '.(.*?)'}" # 匹配规则
o = re.findall(rule, data)
print(o)
# ['/static/image/a1.jpg', '/static/image/b1.jpg', '/static/image/c1.jpg']
for j,i in enumerate(o):
u = "https://www.gaoh222.cn"+i
r = requests.get(url=u, verify=False)
with open(f'{j}.png','wb') as file: # 这里必须是wb,保存内容都要存放二进制
file.write(r.content) # 这里content也表示二进制
print(j)
2. html
流程:
- 发现目标:打开目标网址
- 若该网址通过html里面携带图片数据,直接向当前网址发起请求
import requests
import re
url = "https://huopi.com/favoe/uty" # 不一定能用
headers={
"user-agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/603.1"
}
response = requests.get(url=url,headers=headers)
data = response.text
print(data)
rule = '<a class="main-img".*?><img src="(.*?)".*?></a>'
list = re.findall(rule,data,re.S)
for i,j in enumerate(list):
http = "https:"+j
r = requests.get(url=http)
with open(f'{i}.webp','wb') as file:# 这里必须是wb,保存内容都要存放二进制
file.write(r.content)# 这里content也表示二进制
二、Xpath
1. lxml
下载:pip install lxml
语法:
from lxml import etree
c = etree.parse('1.html') # 解析本地文件
c = etree.HTML(a)# 解析获取到的html文档
c.xpath('xpath语法')
2. xpath
解释:这里会介绍语法规则
注意:Xpath下标从1开始
2.1 节点定位语法
表达式 | 描述 |
---|---|
nodename | 选中该元素。 |
/ | 从根节点选取、或者是元素和元素间的过渡。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
… | 选取当前节点的父节点。 |
@ | 选取属性。 |
text() | 选取文本。 |
举例:
- 选择所有的h2下的文本
//h2/text()
- 获取所有的a标签的href
//a/@href
- 获取html下的head下的title的文本
/html/head/title/text()
- 获取html下的head下的link标签的href
/html/head/link/@href
2.2 节点修饰语法
路径表达式 | 结果 |
---|---|
//title[@classs=“eng”] | 选择classs属性值为eng的所有title元素 |
/books/book[1] | 选取属于 books 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/books/book[last()-1] | 选取属于 books 子元素的倒数第二个 book 元素。 |
/books/book[position()>1] | 选择books下面的book元素,从第二个开始选择 |
//book/title[text()=‘Harry Potter’] | 选择所有book下的title元素,仅仅选择文本为Harry Potter的title元素 |
/books/book[price>3]/title | 选取 books 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 3 |
举例:
- 第一个书的链接
//div[@class="nav_txt"]/ul/li[1]/a/@href
- 最后一个书的链接
//div[@class="nav_txt"]/ul/li[last()]/a/@href
3. 实战
from lxml import etree
import requests
url = 'http://pic.netbian.cm/4kmeinv/' # 不一定能用
response = requests.get(url).text
do = etree.HTML(response)
list = do.xpath('//*[@id="main"]/div[3]/ul/li/a/img/@src')
print(list)
['/uploads/allimg/220804/003031-16595442318b56.jpg', '/uploads/allimg/220802/234002-1659454802afa3.jpg', '/uploads/allimg/220727/004202-1658853722bdd3.jpg', '/uploads/allimg/220707/233455-1657208095aec4.jpg', '/uploads/allimg/220715/153854-16578707348791.jpg', '/uploads/allimg/210831/102129-16303764895142.jpg', '/uploads/allimg/220717/002302-1657988582ec9f.jpg', '/uploads/allimg/220712/235655-16576414159641.jpg', '/uploads/allimg/211219/114328-1639885408db64.jpg', '/uploads/allimg/220131/012219-16435633391d32.jpg', '/uploads/allimg/210827/235918-1630079958392e.jpg', '/uploads/allimg/220722/162924-16584785647228.jpg', '/uploads/allimg/220716/222754-1657981674a9a5.jpg', '/uploads/allimg/220715/171100-1657876260243c.jpg', '/uploads/allimg/220716/222533-1657981533ff59.jpg', '/uploads/allimg/220205/002942-1643992182534d.jpg', '/uploads/allimg/210718/001826-16265387066216.jpg', '/uploads/allimg/210922/191729-16323094499dcf.jpg', '/uploads/allimg/210718/000805-16265380858e92.jpg', '/uploads/allimg/220702/222125-1656771685f559.jpg']
文章来源:https://blog.csdn.net/weixin_46765649/article/details/126132235
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!