python爬虫:运用多线程ip代理模块爬取百度图片上小姐姐的图片(代码片段)

il_持之以恒_li il_持之以恒_li     2022-12-18     574

关键词:

Python爬虫:运用多线程、IP代理模块爬取百度图片上小姐姐的图片

1.爬取输入类型的图片数量(用于给用户提示)

使用过百度图片的读者会发现,在搜索栏上输入关键词之后,会显示出搜索的结果,小编想大多数读者应该关注的是搜索内容(这里指的是图片),也许没有注意这些搜索图片的数量吧!

虽然搜索图片是动态加载的,但是搜索图片的数量是静态的,读者来到开发者工具就知道了。

细心的读者会发现两边的搜索图片数量不相同,不过,这个对于我们最终结果没有任何影响,这个数据的差异最多也就1000,这个1000对于搜索图片总数量根本不值一提,另外,最后这1000张的图片质量也不会咋地(与关键词内容无关)。
对于这个网址进行分析:
https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=%d_R&pv=&ic=0&nc=1&z=&hd=&latest=&copyright=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&sid=&word=%s
其中%d是一个时间戳,只不过用python实现为:

import time

int(time.time()*1000)

%s就是搜索关键词了,这里需要编码一下,如下:

from urllib.parse import quote

keyword=input('输入图片类型:')
# 对输入的keyword进行编码
encodeKeyword=quote(keyword)

小编使用xpath和re模块,用来得到搜索图片数量

小编在这里提示一下,就是请求除了添加user-agent值之外,还需添加Accept,否则请求不到所需要的数据。

2.得到图片的下载链接

由于这个网址是一个动态网址,所以直接解析原网址肯定得不到图片下载链接的哈!

点击浏览器的开发者这个工具,来到Network->XHR,细心的读者可以发现 无论怎样刷新网址,XHR下面总是只有两个网址数据,这两个网址下面没有我们需要的。但是如果将左方图片下滑,就会出现一系列网址数据了,我们需要的图片下载链接就在这些网址下面。

具体网址为:
https://image.baidu.com/search/acjson?tn=resultjson_com&logid=9748117420796842251&ipn=rj&ct=201326592&is=&fp=result&queryWord=0&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=&copyright=&word=0&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&pn=1&rn=30&gsm=1e&2=
其中0和2和上述讲的一样,分别是搜索词编码和时间戳,1小编猜测应该是页数,只不过这个页数是30的倍数,后面rn是每页的数量。pn从0开始,读者下滑得到的第一个网址的这个参数应该会是30,但是把30改成0依旧能访问,并且此时的网址里面的数据是我们开始搜索得到的结果,也许这个网址直接被隐藏,防止被爬取吧!

下面还有一个参数为:thumbURL,就是图片下载链接了。

3.最终实战:使用多线程、IP代理模块爬取小姐姐的图片

Python默认是没有IP代理模块的,小编这里讲IP代理模块是自定义的,自己写的一个模块,感兴趣的读者可以看看小编的博客,博客链接:Python爬虫:制作一个属于自己的IP代理模块2Python爬虫:制作一个属于自己的IP代理模块
具体参考代码如下:

import requests
import json
from crawlers.userAgent import useragent   # 从自定义模块中导入随机获取user-agent值的模块
from urllib.parse import quote
from lxml import etree
from crawlers.ip2 import IPs   # 从自定义模块中导入IP代理模块
import re
import sys
import time
import threading  # 导入线程模块
import os

# 初始化两个自定义模块
userAgent=useragent()

keyword=input('输入图片类型:')
# 对输入的keyword进行编码
encodeKeyword=quote(keyword)
# 时间
time1=int(time.time()*1000)
# url1用来得到图片总数
url1='https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=%d_R&pv=&ic=0&nc=1&z=&hd=&latest=&copyright=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&sid=&word=%s'%(time1,encodeKeyword)
# https://image.baidu.com/search/index?ct=201326592&z=3&tn=baiduimage&ipn=r&word=%E9%A3%8E%E6%99%AF&pn=0&istype=2&ie=utf-8&oe=utf-8&cl=2&lm=-1&st=-1&fr=&fmq=1622874884985_R&ic=0&se=&sme=&width=0&height=0&face=0
# print(url1)
headers='User-Agent':userAgent.getUserAgent(),
         'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
         
try:
    rsp=requests.get(url=url1,headers=headers)
    html=etree.HTML(rsp.text)
    nums=html.xpath("//div[@id='resultInfo']/text()")[0]  # 图片总数
    nums=re.findall('找到相关图片约(.*)张',nums)[0]
except Exception as e:
    print(e)
    sys.exit()
print('------该类图片页数为->%d'%(int(nums.replace(',',''))//30))

pn=int(input('用户输入下载页数:'))
names=[]
urls=[]

for i in range(pn):
    time2=int(time.time()*1000)
    url2='https://image.baidu.com/search/acjson?tn=resultjson_com&logid=9748117420796842251&ipn=rj&ct=201326592&is=&fp=result&queryWord=0&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=&copyright=&word=0&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&pn=1&rn=30&gsm=1e&2='.format(encodeKeyword,i*30,time2)
    # https://image.baidu.com/search/acjson?tn=resultjson_com&logid=9668459090674682963&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E9%A3%8E%E6%99%AF&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=3&ic=0&hd=&latest=&copyright=&word=%E9%A3%8E%E6%99%AF&s=&se=&tab=&width=0&height=0&face=0&istype=2&qc=&nc=&fr=&expermode=&nojc=&pn=30&rn=30&gsm=1e&1622876252843=
    # print(url2)
    response=requests.get(url=url2,headers=headers)
    imgList=json.loads(response.text)['data']
    for i in range(len(imgList)-1):
        try:
            imgUrl=imgList[i]['replaceUrl'][0]['ObjURL']
        except:
            imgUrl=imgList[i]['thumbURL']
        imgName=imgList[i]['fromPageTitleEnc']
        names.append(imgName)
        urls.append(imgUrl)
    time.sleep(0.1)


nameList=['/','\\\\',':','*','"', '<', '>','|' ,'.','?']  # 对爬取的图片名称进行处理,使图片文件命名规范

for i in range(len(names)):
    for name in nameList:
        names[i]=names[i].replace(name,'')

urlAndName=[[urls[i],names[i]] for i in range(len(urls))]
for list_1 in urlAndName:
    print(list_1)
print(len(urlAndName))
ips=IPs()
proxies=ips.getUserIps()
# 得到ip代理
proxy=proxies.pop()

savePath='./%s'%(keyword)
try:
    os.mkdir(savePath)
except:
    pass

def download(urlAndName):
    global proxy
    while True:
        if len(proxies)==0:
            print('ip代理已经使用完毕!')
            break
        if len(urlAndName) == 0:
            break
        headers='user-agent':userAgent.getUserAgent()
        try:
            img=urlAndName.pop()
            rsp=requests.get(url=img[0],headers=headers,proxies=proxy)
            if rsp.status_code==200:
                with open(file='/.jpg'.format(savePath,img[1]),mode='wb') as f:
                    f.write(rsp.content)
                print('==>ip数量:====>网址数量:'.format(len(proxies),len(urlAndName)))
        except Exception as e:
            print(e)
            print('-------->', len(urlAndName))
            proxy = proxies.pop()

threads=[]
for i in range(10):
    thread=threading.Thread(target=download,args=(urlAndName,))
    thread.start()
    threads.append(thread)

for thread in threads:
    thread.join()

上述代码中导入两个自定义模块不懂的读者可以看看小编提到的两篇博客喔!




4.总结

小编的参考代码中使用多线程还有一定问题,读者从运行结果就可以看出,另外,还有一个问题就是快运行结束的时候,会出现多个线程运行一个网址,虽然这对最终结果没有什么影响,但这是一个问题。因为这个百度图片网站虽然搜索小姐姐这个关键词,但是还是出现了许多其他乱七八糟的图片 ,希望读者自己运行的时候理解。小编正在参加新星计划,读者觉得小编的这篇文章还可以的话,记得点赞,当然,对于程序代码有什么问题和建议,欢迎在评论区评论!

python爬虫必备技能,使用动态代理ip爬取youtube游戏模块主页示例(代码片段)

🎬博客主页:https://xiaoy.blog.csdn.net🎥本文由呆呆敲代码的小Y原创,首发于CSDN🙉🎄学习专栏推荐:Unity系统学习专栏🌲游戏制作专栏推荐:游戏制作专栏🏅欢迎点赞👍收藏⭐留言Ǵ... 查看详情

使用scrapy爬虫设置了ip代理报错是怎么回事

...集速度,也可以不被限制IP。3、使用高匿名代理IP,对于python网络爬虫来说,有时候业务量繁重,分布式爬虫是最佳的增强效率方式,而分布式爬虫又急切需要数目众多的IP资源,这一点免费IP是满足不了的,并且免费代理一般不... 查看详情

多线程爬取免费代理ip池(给我爬)(代码片段)

多线程爬取免费代理ip池(给我爬)文章目录多线程爬取免费代理ip池(给我爬)安装的库IP隐藏代理ip多线程爬取读入代理ip写入代理ip验证代理ip解析网页得到代理ip获取网页响应测试已有文件的ip是否正确多线程... 查看详情

python爬虫+多线程+多进程+构建ip代理池

目标网站:静听网网站url:http://www.audio699.com/目标文件:所有在线听的音频文件附:我有个喜好就是晚上睡觉听有声书,然而很多软件都是付费才能听,免费在线网站虽然能听,但是禁ip很严重,就拿静听网来说,你听一个在线音频,... 查看详情

python多线程爬虫爬取顶点小说内容(beautifulsoup+urllib)

参考技术A之前写过python爬取起点中文网小说,多线程则是先把爬取的章节链接存到一个列表里,然后写一个函数get_text每次调用这个函数就传一个章节链接,那么就需要调用n次该函数来获取n章的内容,所以可以用for循环创建n个... 查看详情

python多线程爬虫(代码片段)

实现了一个简单的多线程爬虫,爬取百度贴吧某个帖子的回帖用户、回帖内容和回帖时间。1.使用pool.map实现一个简单的多线程效果。2.使用xpath,代替查找正则表达式的方法。#-*-coding:utf-8-*-importreimporttimeimportrequestsimportjso... 查看详情

python爬虫如何配置动态爬虫代理

...et请求,即直接从对方服务器上获取数据。首先,Python中自带urllib及urllib2这两个模块,基本上能满足一般的页面抓取。另外,requests也是非常有用的包,与此类似的,还有httplib2等等。importrequestsurl=http://... 查看详情

python多线程爬虫爬取电影天堂资源(代码片段)

  最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载。刚开始学习python希望可以获得宝贵的意见。  先来简单介绍一下... 查看详情

爬虫简介和requests模块(代码片段)

...redis,mysql,mongodb)。app的爬虫,本质上是一模一样的。python做爬虫的优势在于:包多,而且有爬虫的框架scrapy,是一个性能很高的爬虫框架,类似后台框架中的Django,该框架,大而全(爬虫相关的东西都集成了。)百度和谷歌... 查看详情

python爬虫深造篇——多线程网页爬取(代码片段)

一、前情提要相信来看这篇深造爬虫文章的同学,大部分已经对爬虫有不错的了解了,也在之前已经写过不少爬虫了,但我猜爬取的数据量都较小,因此没有过多的关注爬虫的爬取效率。这里我想问问当我们要爬... 查看详情

python爬虫爬取豆瓣影评返回403怎么办,代理ip和cookie都设置了

如果只是爬取影评的话,没必要登录。返回的304是你的cookie用的是旧的。去掉cookie,正常抓取就可以了。参考技术A使用618动态爬虫就可以,电信ADSL每次拨号就会更换一个IP,可以按这个思路去做。可以根据爬虫对象的限制策略... 查看详情

python爬虫asyncioaiohttpaiofiles单线程多任务异步协程爬取图片(代码片段)

python爬虫asyncioaiohttpaiofiles多任务异步协程爬取图片main.py"""===coding:UTF8==="""#requests.get()同步代码->异步操作aiohttpimportasyncioimportaiohttpimportaiofilesurls&# 查看详情

python多线程和多线程问题

单线程爬虫和多线程爬虫哪个封IP的几率高。延时一样那肯定是多线程,爬的频率更高了参考技术A当然是多线程了。如果使用代理IP的话,封ip的概率就会降低。 查看详情

python中,进行爬虫抓取怎么样能够使用代理ip?

...序去指定的dailiy的服务ip和端口,进行爬取。参考技术A在python中用爬虫再用到代理服务器,有两个办法,①直接在布署该python爬虫的电脑上设置代理服务器,这样从该电脑上出站的信息就只能由代理服务器处理了,爬虫的也不例... 查看详情

爬虫总被禁?看看代理在python中的运用吧(代码片段)

💂个人网站:IT知识小屋🤟版权:本文由【IT学习日记】原创、在CSDN首发、需要转载请联系博主💬如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦💅想寻找共同成长的小伙伴,请点击【技... 查看详情

go写的爬虫相比python写的都有哪些优势

Go没有泄露,并发原生支持,速度快。Python如果用代理IP,如果代理IP失效,会莫名其妙使用本地IP。且Go写爬虫可以和很多的数据库如mongo,redis,hbase,mysql集成。Go开发效率还高,半个小时就写了个爬虫,看,写分布式爬虫也是Go的... 查看详情

python爬虫如何避免爬取网站访问过于频繁

...去跑同一个项目,效率也能大幅提升。打包技术。可以将python文件打包成可执行的exe文件,让其在后台执行即可。其他。比如,使用网速好的网络等等。三.反爬虫的措施限制请求头,即requestheader。解决方法:我们可以填写user-ag... 查看详情

多线程爬虫介绍

...时候就需要使用多线程技术了。这里有一点要强调一下,Python这门语言在设计上的时候,有一个GIL锁。这个东西让Python的多线程都是 查看详情