linux下python怎么写爬虫获取图片

linux下python怎么写爬虫获取图片,第1张

跟linux有什么关系,python是跨平台的,爬取图片的代码如下:

import urllib.requestimport osimport randomdef url_open(url):

req=urllib.request.Request(url)    #为请求设置user-agent,使得程序看起来更像一个人类

req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1WOW64rv:43.0) Gecko/20100101 Firefox/43.0')    #代理IP,使用户能以不同IP访问,从而防止被服务器发现

'''iplist=['1.193.162.123:8000','1.193.162.91:8000','1.193.163.32:8000']

proxy_support=urllib.request.ProxyHandler({'http':random.choice(iplist)})

opener=urllib.request.build_opener(proxy_support)

opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.154 Safari/537.36 LBBROWSER')]

urllib.request.install_opener(opener)'''

response=urllib.request.urlopen(req)

html=response.read()    return htmldef get_page(url):

html=url_open(url).decode('utf-8')

a=html.find('current-comment-page')+23

b=html.find(']',a)    #print(html[a:b])

return html[a:b]def find_imgs(url):

html=url_open(url).decode('utf-8')

img_addrs=[]

a=html.find('img src=')    while a!=-1:

b=html.find('.jpg',a,a+140)        if b!=-1:            if html[a+9]!='h':

img_addrs.append('http:'+html[a+9:b+4])            else:

img_addrs.append(html[a+9:b+4])        else:

b=a+9

a=html.find('img src=',b)    for each in img_addrs:

print(each+'我的打印')    return img_addrsdef save_imgs(folder,img_addrs):

for each in img_addrs:        #print('one was saved')

filename=each.split('/')[-1]        with open(filename,'wb') as f:

img=url_open(each)

f.write(img)def download_mm(folder='ooxx',pages=10):

os.mkdir(folder)

os.chdir(folder)

url=""

page_num=int(get_page(url))    for i in range(pages):

page_num=page_num-1

page_url=url+'page-'+str(page_num)+'#comments'

img_addrs=find_imgs(page_url)

save_imgs(folder,img_addrs)if __name__=='__main__':

download_mm()1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

完成

运行结果

目标

抓取网站上的妹子照片。

第三方模块

superagent : 第三方Nodejs 模块,用于处理服务器和客户端的Http请求。

cheerio : 为服务器端定制的Jquery实现。

思路

通过superagent 获取目标网站的dom

通过cheerio对dom进行解析,获得通用布局。

如果只是爬取一个页面,则可以直接将目标页面的目标元素获取

如果是分页或者多个页面,可以通过循环获得目标链接,进行多次抓取。

实现

这里我们实现一个抓取网站妹子的照片。

目标网址:http://jandan.net/ooxx/ (对于该网站,并没有恶意攻击的意思.)

代码如下:

//引入第三方和通用模块

var fs = require('fs')//为了将抓取的图片存到本地,使用fs

var superagent = require('superagent')//引入superagent

var cheerio = require('cheerio')//引入jquery实现

 

var filePath = '/node/学习/sis/img/'//定义抓取妹子文件存放路径

var count = 0//记录抓取数量

var test = []

//抓取一个页面的实现。

var getOnePage = function(url){

    //因为煎蛋对请求做了限制,所以将cookie加上了。如果你要访问该网站的话,可以通过<a href="https://www.baidu.com/s?wd=%E6%B5%8F%E8%A7%88%E5%99%A8&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3uAndPH6zm1I9PjPhuhRz0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPjRLP1msP1TzPjTYnj0vnjfd" target="_blank" class="baidu-highlight">浏览器</a>查找cookie 并进行替换

    superagent.get(url)

    .set({

            'user-agent':'Mozilla/5.0 (Windows NT 10.0 WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36'

    })

    .set('cookie','500322148=53 Hm_lvt_fd93b7fb546adcfbcf80c4fc2b54da2c=1454117846 Hm_lpvt_fd93b7fb546adcfbcf80c4fc2b54da2c=1454119909')

    .set({

        'accept' : 'text/html,application/xhtml+xml,application/xmlq=0.9,image/webp,*/*q=0.8',

        'connection' : 'keep-alive',

        'host' : 'jandan.net'

    })

    .end(function(err,sres){//这里是对获取的dom进行处理

        if(err)throw err

        var $ = cheerio.load(sres.text)

        var nextUrl = $('.previous-comment-page').attr('href')//获得下一页的链接,为了开始下一次请求

        $('img').each(function(index,ele){//循环该页面的所有图片并得到对应的链接,放进数组。

            var u = ''

            if($(ele).attr('org_src')){

                u = $(ele).attr('org_src')

            }else{

                u = $(ele).attr('src')    

            }

            test.push(u)

            //通过superagent 获取图片数据,并保存到本地。

            superagent.get(u).end(function(err,sres){

                if(err)throw err

                //根据访问路径获得文件名称

                var ttt = u.split('/')

                var name = ttt[ttt.length-1]

                var path = filePath+name

                fs.writeFile(path,sres.body,function(){

                    count++

                    console.log(u)

                    console.log('已成功抓取..'+count+'张')

                })

            })

        })

        if(null != nextUrl && '' != nextUrl){ //何时开始下一次请求

            getOnePage(nextUrl)

        }

    }) 

 

}

 

getOnePage('http://jandan.net/ooxx/')//触发第一次请求开始


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11403960.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存