韦老师的课程练习,写一个小爬虫,爬取京东上的手机图片
1.正则表达式:
通过查看京东手机页面的源代码确定了两个过滤的正则表达式:
a.是确定手机展示部分的起始标志位和结束标志位,正则表达式为:
<div id="plist".+?<div class="page clearfix">
b.是图片的正则表达式,也是从网页的源代码可以发现其正则表达式为:
pat = '<img width="220" height="220" data-img="1" data-lazy-img="//(.+?\.jpg)">' # 括号表示分组,将括号的内容捕获到分组当中 # .+表示匹配至少一个任意字符,问号?表示懒惰匹配,也就是匹配尽可能少的字符串。 # .+?\.jpg合起来表示尽可能少匹配字符的匹配到.jpg,避免匹配范围超出src的范围 # 这个括号也就可以匹配网页中图片的url了
接下来写代码:
思路主要是:
1.建立一个爬取图片的自定义函数,该函数负责爬取一个页面下我们想爬取的图片
a.通过urllib.request.urlopen(url).read()读取对应网页全部源代码
b.通过两个正则表达式进行信息过滤,提取图片目标链接,将地址存储在列表中,随后遍历该列表
2.分别将对应链接通过urllib.request.urlretrieve(imageurl,filename = imagename) 存储到本地,建立异常处理,通过x+1自动跳到下一个图片
3.通过for循环,调用函数,开始爬取
# -*- coding:utf-8 -*- # Author : 何子辰 # 爬取京东手机图片 ——批量爬取 import re import urllib.request def craw(url,page): html1 = urllib.request.urlopen(url).read() html1 = str(html1) pat1 = '<div id="plist".+?<div class="page clearfix">' #第一次过滤,网页源代码中标志位 result1 = re.compile(pat1).findall(html1) result1 = result1[0] pat2 = '<img width="220" height="220" data-img="1" data-lazy-img="//(.+?\.jpg)">' imagelist = re.compile(pat2).findall(result1) x = 1 for imageurl in imagelist: imagename = "F:/爬虫/2018.1.24/jdpics/"+str(page)+str(x)+".jpg" imageurl = "http://"+imageurl try: urllib.request.urlretrieve(imageurl,filename=imagename) except urllib.error.URLError as e: if hasattr(e,"code"): x+=1 if hasattr(e,"reason"): x+=1 x+=1 for i in range(1,20): url = "https://list.jd.com/list.html?cat=9987,653,655&page="+str(i) craw(url,i)
最后在文件夹里就可以收图片了