废话少说,先上代码!
1 import requests 2 import parsel 3 import shutil 4 import os 5 import time 6 7 headers={ 8 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" 9 } 10 number=6646 11 web_url="http://www.网址.cn/" 12 path = 'D:PythonProject贴吧爬虫' 13 14 for n in range(number,0,-5): 15 url = "http://www.网址.cn/qlife-{}.html".format(n) #对http网址进行插值 16 response = requests.get(url,headers) 17 response.encoding=response.apparent_encoding #设置编码,不然返回的数据中如果含有中文则中文会乱码 18 html_str = response.text 19 html=parsel.Selector(html_str) 20 html_img_src=html.xpath('//div[@class="cnt_txtbox"]/p/img/@src2').extract() #使用xpath的跨节点提取数据,返回的是一个数组 21 22 # 得到文件夹的名字 23 img_files_name=html.xpath('//div[@class="fl qsh_c2"]/h2/text()').extract() #得到每一组图片的标题,后期我会根据该标题来创建对应的文件夹存储图片文件 24 time.sleep(0.1) #设置延时0.1毫秒,在测试时跑得太快出错了,设置延时有一定的作用 25 file_name=img_files_name[0].replace('/', '').replace(':','') #过滤字符串数据中的 : / 符号,这些特殊符号用音响你保存文件,因为Windows不支持文件名中包含这些字符 26 os.mkdir(path + '/{}'.format(file_name)) #生成文件夹, 27 # 保存的位置路径 28 file_save=path+"\"+file_name 29 print("正在下载第{}组".format(n)) 30 for img_url in html_img_src: #遍历每一页中的图片的src地址 31 img=requests.get(img_url,headers).content #图片、音频、视频,在请求数据时使用content,因为他们是以2进制编码传输的 32 img_name=str(html_img_src.index(img_url)+1)+".jpg" #定义文件名 33 with open('照片\' + img_name, mode="wb")as f1: #保存图片文件 34 print("正在下载图片:", img_name) 35 f1.write(img) 36 shutil.move(path + '\' + img_name, file_save) #移动到指定地方。 37 print("第{}组下载完成".format(n))
python环境:3.0 以上
需要用到一下几个python模块:
1、requests:用于请求数据。
2、parsel:用于将请求后的字符串格式解析成re,xpath,css进行内容的匹配提取。
3、shutil:用于对文件的管理
4、os:用于对文件的操作
5、time:用于对程序延时运行
一、解释一下 number 的作用,我发现了该网站的每一组图片地址是有规律变化的,该规律从6646开始,下一组图片的地址为 www.网址.com/6641.html 每一组图片相差-5,这样我就可以用for 循环来递减。
二、headers 的值是浏览器的标识,他能告诉服务器,我是浏览器。用于伪装自己,不伪装服务器会把你当做爬虫不返回请求数据给你。
三、为什么要移动,因为我在动态更改保存路径时会出错,原因是地址只能是字符串形势,且加上\时 变量与\无法转换成一个正确可用的地址,所以保险起见还是移动好
总结: 1、爬取目标网站时,可用先分析一下目标网站的结构,其次是分析要爬取目标数据的http地址看是否有规律。
2、requests进行请求数据,得到返回数据后进行设置编码,然后使用parsel模块进行装换成可使用xpath选择的数据。
3、使用xpath进行提取数据。
4、遍历得到每一个img的地址,然后使用它再次请求资源(注意:图片、音频、视频的数据请求是用 content 而不是使用 extract(),因为这些数据是使用二进制编码传输的)。
5、数据的保存,需要注意的是保存地址不能是变量,因为变量不能与 特殊字符 \ 进行拼接。
6、数据的移动,方便程序的运行与管理。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
时间:2020年6月8日 01:48
编写:kinwind
留言:明天又是bug满满的的一天!
2020-06-08 01:48