2018/1/24 一个简单的爬虫,批量爬取京东上手机图片


韦老师的课程练习,写一个小爬虫,爬取京东上的手机图片

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)

最后在文件夹里就可以收图片了

 

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM