本例教程嫌麻烦可直接跳到最底下复制代码粘贴运行,在Python中完成爬虫功能分三步,建立网页请求——解析网页——保存文件
一、建立网页请求
代码部分:
import requests
url = 'https://anime-pictures.net/pictures/view_posts/0?lang=en'
header = {
'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Mobile Safari/537.36 Edg/103.0.1264.62'
}
r = requests.get(url,headers=header)
html = r.text
解释:
首先导入包requests,idea中的导入方法是去到项目结构中导入
再定义一个变量,令其等于你要爬取的网址:url = '***'
由于Python请求网页的请求头带有Python关键字,某些网站以此关键字来反爬,因此定义一个请求头,请求头可从网页上复制,use-agent中的内容header={***}
再调用request方法建立网页连接,r = requests.get(url,headers=header)
再将网页代码赋值给变量html = r.text
二、解析网页
代码部分:
from lxml import etree
selector = etree.HTML(html)
sl_list = selector.xpath('//*[starts-with(@id,"common_preview_img_")]/@data-srcset')
ent=[]#自定义一个列表,用于接收一个个的网址
for rm in sl_list:
rm2 = rm.split(sep=' ')
# print(rm2[0])#拿到了一个个的网址
ent.append('https:'+rm2[0])
导入etree包中的lxml方法,用于解析网页
使用xpath路径定位到需要获取的元素,返回值为一个列表,但本例中列表中每个值含有不需要的一部分字符串
selector = etree.HTML(html) sl_list = selector.xpath('***')
因此定义一个新列表ent,用于接收分开后的列表,由此得到了所有需要的网址
附录:xpath的语法
1.// 双斜杠 定位根节点,会对全文进行扫描,在文档中选取所有符合条件的内容,以列表的形式返回。
2. / 单斜杠 寻找当前标签路径的下一层路径标签或者对当前路标签内容进行操作
3. /text() 获取当前路径下的文本内容
4. /@xxxx 提取当前路径下标签的属性值
5. | 可选符 使用|可选取若干个路径 如//p | //div 即在当前路径下选取所有符合条件的p标签和div标签。
6. . 点 用来选取当前节点
7. .. 双点 选取当前节点的父节点8. starts-with 解决标签属性值以相同字符串开头的情况
三、保存文件
代码部分:
import time
mark=0
for address in ent:
time.sleep(1)#延时一秒抓取
response = requests.get(address)#建立网页请求
with open('每日舟图'+'/'+str(mark)+'.jpg','wb') as f:
f.write(response.content)#写入二进制数据流
mark+=1
导入包time,使用语句time.sleep(1),间隔一秒爬图
定义一个标记mark,每次爬取后将图片名字按顺序排序
将每一个网址都建立连接,response = requests.get(address)#建立网页请求
使用wiht open语句将图片写入文件夹,response.content是从将网页以二进制流的形式返回,'每日舟图'是自己在项目中建立好的文件夹
完整代码:
# 开发者 :瑆玥琼
# 开发时间:2022/7/19 23:48
'''建立网页请求'''
import requests
url = 'https://anime-pictures.net/pictures/view_posts/0?lang=en'
header = {
'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Mobile Safari/537.36 Edg/103.0.1264.62'
}
r = requests.get(url,headers=header)
html = r.text
'''解析网页'''
from lxml import etree
selector = etree.HTML(html)
sl_list = selector.xpath('//*[starts-with(@id,"common_preview_img_")]/@data-srcset')
ent=[]#自定义一个列表,用于接收一个个的网址
for rm in sl_list:
rm2 = rm.split(sep=' ')
# print(rm2[0])#拿到了一个个的网址
ent.append('https:'+rm2[0])
'''保存文件'''
import time
mark=0
for address in ent:
time.sleep(1)#延时一秒抓取
response = requests.get(address)#建立网页请求
with open('每日舟图'+'/'+str(mark)+'.jpg','wb') as f:
f.write(response.content)#写入二进制数据流
print(mark)
mark+=1
运行效果: