还是基于request和xpath的爬虫代码
嗯,逻辑清楚
选择某个标签,使用 /,也可以多层查找,如/html/body/h2
获取所有信息,使用 //,如//p,将p标签的所有信息都提取出来
获取文本内容:text()
获取注释:comment()
获取其它任何属性:@xx,如:@href、@src、@title
更多详细的语法可以看这个,很清楚的讲解
xpath语法基础
requests对象的get和post方法都会返回一个Response对象, 这个对象里面存的是服务器返回的所有信息,包括响应头,响应状态码等。其中返回的网页部分会存在.content和.text 两个对象中
两者区别在于:
我们使用requests.content输出的内容是需要解码的(因为网页上的内容是编码而成的,而在Python中字符串形式是以Unicode形式存在的,当然我们只想看到那些字符串,不想看到那些乱七八糟的字节,所以我们爬下来的东西才需要去解码)
1.使用content输出
print(response.content.decode('utf-8')) # 以utf-8的编码的方式解码为Unicode
2.使用text输出
response.encoding = 'utf-8' # 为请求的网页指定该网页的编码方式
print(response.text)
依旧是 requests 库直接请求,可以看上一篇(是一样的)传送门
在请求网页时,我们需要将我们的爬虫伪装成浏览器,具体通过添加请求头 headers 实现。
请求头以字典的形式创建,可以包括很多内容,主要关注:User-Agent, Cookie
这个网页的解码一般是“utf-8“或者“gbk“,可以查看网页的源码,来看下编码方式。
import time
import requests
from lxml import etree #这是导入xpath模块
headers= {
'User-Agent': '...',
'Cookie': '...',
}
url="https://pic.netbian.com/"
resp=requests.get(url=url,headers=headers)
main_text = resp.content.decode('gbk')
print(main_text)
有输出,证明请求成功。
接着,我们用xpath解析图片数据,首先找到图片路径和名称。
从网页源代码可以看出,图片的地址都在一个
resp.encoding="gbk"
tree=etree.HTML(resp.text)
tu_list = tree.xpath('//*[@id="main"]/div[3]/ul/li')
for tu in tu_list:
tu_html = url + tu.xpath("./a/img/@src")[0] #循环获取图片的url
name = tu.xpath("./a/img/@alt")[0] # 获取图片名称
print(tu_html)
print(name)
输出结果为:
https://pic.netbian.com/uploads/allimg/230819/143449-169242688936cb.jpg
彼岸图网原创 蓝色裙子美女 唯美 鲜花 4k壁纸
https://pic.netbian.com/uploads/allimg/230817/133011-16922502118cba.jpg
敦煌美女 唯美 彼岸图网原创 4K壁纸
...
图片url和名称我们都有了,接下来就是保存了,
tu_get = requests.get(url=html, headers=headers).content # 响应为二进制(bytes)形式
name_path = "img/" + name + '.jpg'
with open(name_path,"wb") as f:
f.write(tu_get)
print(name , "下载完成")
注意,我们需要往后点几页看下它的URL,就会发现它们之间是有点不同的
第一页,https://pic.netbian.com/4kdongman/index.html
第二页,https://pic.netbian.com/4kdongman/index_2.html
第三页,https://pic.netbian.com/4kdongman/index_3.html
。。。
因此,可以在代码中加一条判断
根据网页url的规律,来得到要爬取的网址,接着我们把之前的代码封装成一个函数 get_pic,循环爬取前5页的图片,并保存至本地。
for i in range(1,6):
if i == 1:
url = "https://pic.netbian.com/4kdongman/index.html"
else:
url = "https://pic.netbian.com/4kdongman/index_{}.html".format(i)
print('这是第'+str(i)+"页数据")