zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    linux内核启动汇编部分详解
    linux内核zImage详解
    Linux内核zImage怎么来的?
    Linux内核编译make做了什么?
    关于makefile的几点经验
    note
    tmp0000
    tmp
    SSL学习与总结
    C++学习笔记
  • 原文地址:https://www.cnblogs.com/kinwind/p/13063338.html
Copyright © 2011-2022 走看看