系列文章目录

python爬虫系列:BeautifulSoup爬取小说讲解(零基础向)(版权问题下架)

python爬虫系列:requests下载酷我音乐讲解(零基础向)(版权问题下架)


先放上代码,因为本人是萌新,所以代码和爬取的数据都是不美观的请见谅(没有第四行的代码也完全可以只不过都要再缩进)。

from lxml import etree  #导入Xpath
import requests
import os
if __name__ == '__main__':

    url = "https://pic.netbian.com/4kdongman/index.html"
    headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
    res = requests.get(url,headers=headers).text.encode("ISO-8859-1")   #中文转码
    tree = etree.HTML(res)     #实例化HTML
    pictict = tree.xpath('//div[@class="slist"]//li') #获取<li>的数据
    if not os.path.exists("./pictict") :    #创建文件以便保存图片
        os.mkdir("./pictict")
    for list in pictict :
      html = 'https://pic.netbian.com' + list.xpath("./a/img/@src")[0]   #循环获取图片的url
      name = list.xpath("./a/img/@alt")[0] + ".png"   #获取图片名称
      pictict_get = requests.get(url=html,headers=headers).content   #进行持久化存储
      name_path = "pictict/" + name    #

      with open(name_path,"wb") as f:
          f.write(pictict_get)
          print(name , "下载完成")


    page = input("页数:")   #因为第一张和后面的不太一样所以就从新写了一个
    page = int(page)
    for i in range(page) :
      url_next = "https://pic.netbian.com/4kdongman/index_{}.html".format(page)
      get_next = requests.get(url_next,headers=headers).text.encode("ISO-8859-1")
      tree_next = etree.HTML(get_next)
      pictict_next = tree_next.xpath('//div[@class="slist"]//li')
      for list2 in pictict_next :
         html_next = 'https://pic.netbian.com' + list2.xpath("./a/img/@src")[0]
         name_next = list2.xpath("./a/img/@alt")[0] + ".png"
         pictict_get_next = requests.get(url=html_next, headers=headers).content
         name_path_next = "pictict/" + name_next
         with open(name_path_next, "wb") as f:
             f.write(pictict_get_next)
             print(name_next, "下载完成")

一、思路

1.我们要明确我们的目标

2.我们要分析怎样实现目标

3.进行详细的代码敲写

二、使用步骤

1.引入库

这次我们要使用Xpath来进行图片的爬取,所以我们先进行安装库,话说是使用xpath,实际上就是把lxml,下下来。

pip install lxml

2.代码分析

Xpath并不是像requests那样导入,而是使用from lxml import etree这样来导入,而且在这里说一下,当你使用Xpath的时候Xpath是没有补全的,不过Xpath仍能正常使用。

其次我们也需要requests来进行从网页源码导入Xpath。

from lxml import etree  #导入Xpath
import requests

接下来就是实例化网页源码,先按F12进入开发者工具(记得按F5刷新),再看下面几幅图。

我们可以看到这个网页支持get请求,所以我们就用requests中的get请求。

url = "https://pic.netbian.com/4kdongman/index.html"
headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36(KHTML,like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
res = requests.get(url,headers=headers).text.encode("ISO-8859-1")   #中文转码
tree = etree.HTML(res)     #实例化HTML

我们也要使用headers进行UA伪装,你也不必这么纠结这个UA伪装,他的意思就是让网页识别我们为用户而非爬虫记住小心复制上空格以导致运行时出错。大家也可能看到我圈的cookie了,你可以把它当做饼干,可以贿赂网页,但在这我没写。我们就用get进行请求,因为我们要实例化网页源码才能使用Xpath来进行爬取图片,所以我们后面就跟上了   .text   以便实例化,后面的就是中文转码,要不然名字什么的,都是乱码。Xpath就是用 etree.HTML  进行实例化,这是网页的实例化,还可以本地的保存的HTML实例化,用  etree.parse  进行本地的实例化。

 既然实例化好了,那么我们就应该来找到每张壁纸的url,来进行爬取,我们进行网页分析。

这么一看,这些个图片的url藏得有点深,不过还是可以一步一步的爬出来。

pictict = tree.xpath('//div[@class="slist"]//li') #获取<li>的数据

仅这一行代码就可以爬到

标签,我来说下这层代码的含义(Xpath没补全是正常的)。

如果看过那篇BeautifulSoup的话应该也会明白一点,虽然BeautifulSoup和Xpath的关系不大,不过他们的用法却有些相似,因为BeautifulSoup是空格跨级爬取,而在Xpath是通过//来进行跨级爬取,因为简单所以我直接就用//直接跳到了

标签这里。

毕竟要爬的准确一点,所以就有了div后面的那一块,它并不能向BeautifulSoup那样直接输入,它需要用[ ]来进行输入,还要加@,这样以后才能输入div后面的内容。

我们又拿到了

标签,我们就需要循环来帮我们拿到全部的标签的内容,我们就用  for...in...  循环来进行循环。

for list in pictict :
    html = 'https://pic.netbian.com' + list.xpath("./a/img/@src")[0]   #循环获取图片的url
    name = list.xpath("./a/img/@alt")[0] + ".png"   #获取图片名称

 我们再来看一下网页。

图片的url在里面,那我们怎么获取呢?

html = 'https://pic.netbian.com' + list.xpath("./a/img/@src")[0]

 上面我们也说了//跳级,不过/就不是了,它是一级一级的爬,所以就用/来到了标签里,而想要获取到src,就需要一个Xpath的用法了,那就是@,再通过/@src就能获得它的内容,是不是感觉Xpath还是蛮好用的?在讲一下前面的   .   这个点的意思就是在

标签中。还有那个 [0],因为你 获取的是一个列表,所以你 要把列表的[ ]给去掉,所以就用了这个来进行 索引因为索引是从0开始的,所以就用了[0]。

再看一下网页 ,毕竟我们要一个整的图片的url,刚才获取的只不过是一部分。

可见它的地址是https://pic.netbian.com/uploads/allimg/210621/225658-162428741823f5.jpg,而我们获取的地址是/uploads/allimg/210621/225658-162428741823f5.jpg,由此我们可以看出图片的整个url缺的是https://pic.netbian.com,然后通过上面的代码把它们拼接在一起就可以了。

 图片也总得有个名字进行保存,我们就去网页看看名字在哪里。

这么一看名字在这个地方,那么获取方法不就和上面的一样了吗?大家自己悟一下吧。 

 图片url和名称我们都有了,接下来就是保存了。

pictict_get = requests.get(url=html,headers=headers).content   #进行持久化存储
name_path = "pictict/" + name    #
with open(name_path,"wb") as f:
     f.write(pictict_get)
     print(name , "下载完成")

 requests中保存的用法就是.content,这个用法就是持久化存储,我们只要把上面我们拿到的url放上就行,还有那些大部分都是自己取的名字,不必太在意。第二行的代码意思是,在pictict的文件夹下面,相当于一个路径,因为之前的name后面加了".png"所以在第三行保存时就不用写了,关于文件读写可以去看大佬的文章传送门。在这里就简单讲一下,wb就是写入的意思(好像w也行),后面的f也是可以自己编。下完要记得提醒一下,要不然啥也不知道,于是就我们打印一下某某某下载完成就行了。 

这只是第一页,第二页就和第一页不同了。

这是第一页。 

 这是第二页。

这是第三页。

 看出他们之间的差异了吧,2,3页多了个_2和_3。那我们怎么办?

page = input("页数:")   #因为第一张和后面的不太一样所以就从新写了一个
page = int(page)
for i in range(page) :
    url_next = "https://pic.netbian.com/4kdongman/index_{}.html".format(page)

因为input这个可以自己输入,所以我们就用这个,因为input返回的是字符串,不是数字,所以我们才会用int来变成数字,我们再用到range()这个函数,这个函数配上for....in... 循环可以循环数字,比如range(5),会输出:1,2,3,4,5 。所以我们选择这个。后面的.format()可以讲我们所循环的数字一个一个的输进去,不过在我们要换数字的地方要换上大括号。

下面的内容就和上面一样了,只不过名字都换了一下。 

总结

善于分析网页的结构,有清晰的思路,灵活运用各种方法。

文章有不对的地方请大佬指正。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐