low-level~python爬虫(一)爬取京东手机类图片

学习爬虫有一段日子,一直都是看博客学习总是一知半解。面试了一次爬虫工程师,才感觉自己的学习方法出了问题,找到一本书来系统学习,才有点通。
开始京东手机类图片的爬虫。。。。。。。。。。。。。

这里我们用到了re库(正则表达式)和urllib.request库,首先打开京东-->找到手机类,对应的网址即为我们要爬取的第一个网页,对应界面如图1所示:

image

r如果想爬取不止这一个页面的图片,则可以找到下一页,单击之后看一下网址发生了什么变化,https://list.jd.com/list.htmlcat=9987,653,655&page=2&sort=sort_rank_asc&trans=1&JL=6_0_0&ms=6#J_main,由此可以推知page字段是我们爬取网页时需要的,所以我们可以发现获取第几页是通过URL网址识别的。这个可以验证,当我们把page=6时,即网址换为https://list.jd.com/list.html?cat=9987,653,655&page=6,此时展示的是第六页的手机商品列表。此外,我们想自动获取多个网页可以使用for循环实现,每次循环后对应网址中的page字段值加一,自动切换到下一页。

观察网页,我们会发现爬取的图片中存在干扰图片,如图2所示:

image

所以,我们先用一次正则表达式把无关图片去掉。单击F12,找到源代码。那么如何找到我们需要的图片呢?如下图3所示的小技巧,先单击1,然后在网页中知道我们需要爬取的第一个图片并指向它,这时你会发现对应的代码部分会自动变色。

image

可以多翻几页或者多找几个图片观察会发现图4,<div id="plist">这个代码距离我们需要爬取的图片距离最近并且在页面中是唯一的,说明我们可以把它作为有效信息的起始过滤位置。

image

那么结尾的位置,我们去哪找呢?可以按照图3的方法指到网页末尾的翻页处查看对应源代码中距离相对较近并在页面中唯一的一小段代码的位置如图5所示,可以把“<div class="page clearfix">”作为结束的标识。则我们的第一个正则表达式可以构造为:pat1='<div id="plist".*<div class="page clearfix">'

image

OK!在第一次过滤的基础上再将图片链接信息过滤出来。此时我们可以观察一下图片链接的不同之处。比如以下两张图片的对应源代码:

image
image

会发现这两张图的基本格式是一样的,据此可以根据该规律构造出提取图片的正则表达式:

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

具体的编程思路如下:

1,自定义一个爬取图片的函数,负责爬取一个网页中需要的图片。

爬取过程为:使用build_opener()修改报头的方法模拟浏览器访问网页。定义一个变量存储对应的User-Agent信息,定义的格式为("User-Agent",具体信息,)具体信息为:"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"一般网页的user-agent是一样的,故可以建立一个txt保存下来不用每次都查找一次。然后需要使用urllib.request.build_opener()创建自定义的opener对象并赋给变量opener,接下来设置opener对象的addheaders,即设置对应的头信息,设置格式为:"对象名.addheaders=[头信息]",设置好信息后,我们可以使用opener对象的open()方法打开对应的网址了。此时,打开操作是已经具有头信息的打开操作行为,即模仿为浏览器去打开,格式是"opener对象名.open(url地址)"。打开对应网址后,再使用read()方法读取对应数据,并赋给data变量。到此为止你已经学会爬取整个网页了,(当然记得把网页的格式转化为字符串格式)

然后根据第一个正则表达式进行第一次信息过滤,在第一次过滤结果的基础上进行第二次正则表达式的过滤,提取出的图片链接存储在一个列表中,随后遍历该列表并通过urllib.request.urlretrieve(imageurl,filename=imagename)存储到本地(PS:imagename设为本地文件地址),

最后,为了避免程序中途崩溃,可以建立异常处理,这样即使某个图片不能爬取也会执行x+=1自动跳到下一个图片

2,通过for循环将该分类下的所有网页都爬取一遍,链接构造为:url="http://list.jd.com/list.html?cat=9987,653,655&page="+str(i),在for循环里面,每一次循环对应的i自动加1,每次循环通过调用1中函数实现该页图片的爬取

完整代码如下:(亲测有效)


#...........@author :潘雪雯

#...........@time  :2018.04.15.21:19

#...........@software:window7+pycharm+python3.6

#...........@abstract:爬取京东手机类图片

import re

import urllib.request

#简历一个爬取图片的自定义函数,该函数负责爬取一个页面下的我们最想爬取的图片

def craw(url,page):

# req = urllib.request.Request(url)

    headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36")

#获取对应网页的全部源代码

    opener = urllib.request.build_opener()

opener.addheaders=[headers]

html1 = opener.open(url).read()

html1 =str(html1)

#进行第一次信息过滤

    pat1='<div id="plist".*<div class="page clearfix">'

    #findall()函数得到的是一个列表

    result1 =re.compile(pat1,re.S).findall(html1)

    print(result1)

   result2=result1[0]

#第二次过滤提取该网页所以目标图片的链接并存储在一个列表中

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

    imagelist= re.compile(pat2).findall(result2)

   x=1

    for imageurlin imagelist:

imagename =r"E:/Program Files/编程/data/picture"+str(page)+str(x)+".jpg"

        imageurl ="http://"+imageurl

print(imageurl)

try:#该函数可以直接将对应信息写入本地文件

            urllib.request.urlretrieve(imageurl,r"E:/Program Files/编程/data/picture"+str(page)+str(x)+".jpg")

except urllib.error.URLErroras e:

if hasattr(e,"code"):

x+=1

            if hasattr(e,"reason"):

x+=1

        x+=1

for iin range(1,167):

url ="https://list.jd.com/list.html?cat=9987,653,655&page="+str(i)

print(url)

craw(url,i)

爬取结果:


image.png

分析:关键是正则表达式的运用和爬取思想的熟悉。
PS:以上代码和思想来自《精通Python网络爬虫 核心技术、框架与项目实战 ,韦玮》有需要的小伙伴可以私聊我,share with you!一起学习

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 月末都要关网一段时间,因为流量包不够用。就像工资不够用一样,月初都信誓旦旦地说,一定每天就用xM,绝对少刷图!但是...
    小肆阅读 457评论 1 2
  • 街角的方形桌 早已被白日梦磨平了棱角 木凳上来来回回更换着 清澈的灵魂 我在桌旁拾起了五谷和弄堂的露水 我把半碗痴...
    人间观光录阅读 361评论 3 8
  • 回到姥姥家之后,我心里也真是放松了,动不动就10点多睡着,夜里起都起不来,白天腾腾不让我看手机,这日记也被迫中断了...
    文娟_f阅读 274评论 0 0