Python网络爬虫学习笔记(三)

手写一个图片爬虫

    将京东上的笔记本图片全部下载到本地,通过Python图片爬虫实现。京东笔记本商城的页面网址为“https://list.jd.com/list.html?cat=670,671,672”,这就是我们要爬取的第一个网页。该爬虫程序的关键是自动爬取第一页以外的其他页面。单击下一页,观察到网址有如下变化:

https://list.jd.com/list.html?cat=670,671,672&page=2&sort=sort_totalsales15_desc&trans=1&JL=6_0_0#J_main

可以发现,获取第几页是通过URL识别的,也就是通过GET方式请求的。这里GET请求有多个字段,其中有一个page字段,对应的值为2,故可知该字段对应着商品列表的第几页。

    故自动获取商品页面的方法:使用for循环,每次循环使得page字段值加1。在每一页中,我们使用正则表达式匹配源码中图片的链接部分,然后通过urllib.request.urlretrieve()直接将对应链接的图片保存在本地。

根据第一个商品“联想拯救者R720 15.6英寸大屏”,可以在网页源代码中定位到该商品在源代码中的位置。这里是"<div id="plist">",最后一个商品结束的标记为“<div class="page clearfix">”故可以通过这两个标签进行第一次过滤,正则表达式为:pat1='<div id="plist".+?<div class="page clearfix">',即只取特殊标识中间的代码。第一次过滤后,留下的图片链接就是我们想爬取的图片了,第二次过滤的目的就是在第一次过滤的基础上将图片链接过滤出来。

第一个商品对应的图片代码如下:

<img width="220" height="220" data-img="1" src="//img12.360buyimg.com/n7/jfs/t21313/152/576243349/299675/32a7dafd/5b11634fN6153fccf.jpg">

第二个商品对应的图片代码如下:

<img width="220" height="220" data-img="1" src="//img11.360buyimg.com/n7/jfs/t14848/365/2076510540/93902/e5883831/5a6947e5N39e16ed8.jpg">

可以看出只有图片链接地址不同,因此可以根据这个规律构造出提取图片链接的正则表达式:

pat2='<img width="220" height="220" data-img="1" src="//(.+?\.jpg)">'

根据这个正则表达式就可以提取出一个页面中所有想爬取的图片的链接。图片爬虫的思路如下:

  1. 建立一个爬取图片的自定义函数,负责爬取一个页面下的我们想爬取的图片,爬取过称为:首先通过urllib.request.urlopen(url).read()读取对应网页的全部源代码,然后根据上面的第一个正则表达式进行第一次信息过滤,再通过第二个正则表达式提取出网页上所有的目标图片的链接imageurl,并将这些链接地址存储到一个列表中,随后遍历该列表,分别将对应链接通过urllib.request.urlretrieve(imageurl,filename=imagename)存储到本地。
  2. 通过for循环完成自动翻页的功能。
import re
import urllib.request
import urllib.error

def craw(url,page):
    html1=urllib.request.urlopen(url).read()  #读取当且页面中的所有内容
    html1=str(html1)   #转换成string
    pat1 = '<div id="plist".+?<div class="page clearfix">'
    result1=re.compile(pat1).findall(html1)   #在html1中全局匹配pat1
    result1=result1[0]   #由于返回的是一个列表,而pat1在html1中只有一个匹配成功项,故返回列表的第一个元素
    pat2 = '<img width="220" height="220" data-img="1" src="//(.+?\.jpg)">'
    imagelist=re.compile(pat2).findall(result1) #在result1中对pat2进行匹配
    imagecount=1
    for imageurl in imagelist:
        imagename="D:\\PyCharm\\workplace\\Crawler\\picture\\"+str(page)+str(imagecount)+".jpg"
        imageurl="http://"+imageurl
        try:
            urllib.request.urlretrieve(imageurl,filename=imagename)
        except urllib.error.URLError as e:
            if hasattr(e,"code"):
                imagecount+=1
            if hasattr(e,"reason"):
                imagecount+=1
        imagecount+=1


if __name__=='__main__':
    for page in range(1,8):
        url="https://list.jd.com/list.html?cat=670,671,672&page="+str(page)
        craw(url,page)


猜你喜欢

转载自blog.csdn.net/qq_29599907/article/details/80743230