【python爬虫】爬取百度图片

学习的时候常常忘记做记录,想起来就记录下,有写错或者写的不好的地方希望看到的朋友能指出(虚心求教脸)

爬虫三步走:F12、抓包、存数据

爬到数据之后可以开始学习分析识别总结或者预测啦。

由于没有把python能做到的相关技术(爬虫啊,画图啊,Gui啊,分析处理呀,机器学习呀,人工智能呀)作为工作内容,所以初学至今为止乐趣无穷呀。

首先,F12是个伟大的发明,我没有专业学过HTML css js等等前端内容,仅粗略接触以及基本能看懂(os:没机会接触前端,大多领域都是自己玩玩大致理解就不深入啦,这种劣性一定是天生的!)所以找到我想要的图片链接所在位置也不是难事啦。

在爬百度图片的时候,我起初是在html里找图片链接,但显然是徒劳的,因为这是动态网页!(人家不可能把这么成百上千 成千上万 成万上亿的图放到浏览器中吧)

实际上,在浏览图片的时候滚动滑条会向服务器发送请求,请求30个网址,以json包的形式发过来。所以根本不用分析网页啦,抓包吧!

抓请求的时候记得选择XHR通道呀,然后找规律,计较几个请求request的区别在哪里,后来发现其中只有一个重要参数在变,那就是pn。

https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result
&queryWord=表情包&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&
word=表情包&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=&fr=&pn=150&rn=30&gsm=5a&1520829304174="

pn这个值是按照30的倍数递增的。所以代码设计就简单啦,其他的参数大多不变的,有几个会变的不知道什么意思,但是好像填什么也不影响结果(这个要发送试试看才知道重不重要)

于是,代码就很简单啦。用requests模块

主方法在这里啦:

if __name__ == '__main__':
#我在池里开了10个线程去跑34页,range这个方法是左闭右开的哦![1,35)
    p = multiprocessing.Pool(10)
    #for i in range(1, 34):
    p.map(getnegimgs,range(1, 35))
    p.close()
    p.join()

存图方法:

def getnegimgs(page):
    #page是页数,从1开始  
    htmls = []
    try:
        url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E8%A1%A8%E6%83%85%E5%8C%85&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&word=%E8%A1%A8%E6%83%85%E5%8C%85&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=&fr=&pn="+str(page*30)+"&rn=30&gsm=5a&1520829304174="
    #要加上header啊!而且不要加错,从浏览器里复制出来就好,加错或不加可能会返回403错误的
        res = requests.get(url,headers=headers)
        htmls.append(res.json().get('data'))
    except Exception as e:
        print(e)
#上面获得了很多json包,现在一个一个把图片网址get后写入本地文件夹吧!
    global count
    count = (page-1)*30
    for html in htmls:
        for i in html:
            if i.get('thumbURL') != None:
                try:
                    ir = requests.get(i.get('thumbURL'),headers=headers)
                    if ir.status_code == 200:
                        open('F:/negimage/' + '%d.jpg'%count, 'wb').write(ir.content)
                        print(str(count) + "----" + i.get('thumbURL'))
                        count = count + 1
                except Exception as e:
                    print(e)

如何写出优雅的代码是一种修行,我还没拜师哈,
也可以取一个包包就执行下面的分析网址然后get存储。只是我之后还想试试别的存储方式,数据库之类的。

另外,为什么range是左闭右开?
1.如果都闭上的话 做循环就等于是 while(i<=X) 而只有左边闭上的话就是while(i!=X),第二种的处理速度会不会比第一种快?
2. 左闭右开可以变成很多个左闭右开,而全闭不可以变成很多个全闭,会重叠。
3. 为什么不是右闭左开?不好看!不习惯!不好理解!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值