python 爬虫新手的第一个案例(图片网站)

废话少说,先上代码!

 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

posted @ 2020-06-08 01:48  水谷之风  阅读(250)  评论(0编辑  收藏  举报