一、python requests爬虫[数据提取]

一、正则表达式

基础储备:正则表达式

1. json

解释:爬取json储存的url

流程:

  1. 发现目标:打开目标网址
  2. 若该网址通过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

流程:

  1. 发现目标:打开目标网址
  2. 若该网址通过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 = ''

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']

你可能感兴趣的:(#,Python爬虫,python,爬虫,okhttp)