Python图片爬取方案,百度图片爬取程序设计,requests模块的用法

目录

一、requests模块

1.安装requests

2.requests模块的基本用法

二、百度图片爬取程序

1.需求分析

2.URL分析

3.正则表达式分析

4.程序设计

5.程序代码


 

一、requests模块

1.安装requests

如果是在windows下,你使用的python编程软件, 在Terminal下输入python -m pip install requests模块即可。

如果是Linux系统,在任意终端输入pip install requests

 

2.requests模块的基本用法

requests最常用的方法是get(),这个函数有很多参数,这里简单的看几个:

req=requests.get(url=url,headers=headers,params=params,timeout=1,auth=auth)

1)url:被爬取网页的url

2)headers:头信息,常用于伪装User-Agent,写法如下

headers= {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36"}

3)timeout:设置超时时间,有的网站可能打不开,为了不占用时间,在所设置的时间内没有相应的网站被排除

4)params:url中涵盖的参数

如 url=http://tieba.baidu.com/f?kw=周杰伦&pn=50

我们可以将params写成:

params={

'kw':'周杰伦',

'pn':'50'

}

url写成:http://tieba.baidu.com/f?

5)auth:当访问某网站提示输入用户名密码时,自动输入

使用方式:首先定义auth

auth=('账户名','密码')

在调用:req=requests.get(url=url,auth=auth)

二、百度图片爬取程序

1.需求分析

我们进入百度图片搜索,搜索周杰伦,看到一下界面。

打开源码分析,看到图片的链接地址。

复制这一段链接在浏览器中打开,发现可以正常打开。所以我们的目的就是编写python程序提取图片url然后下载。

经过分析,我发现百度图片的url并不是静态文件代码,而是JS生成的。鼠标右键查看源代码。很明显的可以看出这一段JS代码。

并且我发现在不翻页的情况下,百度图片的首页只会显示不超过30张图片。

我们可以得出结论:

1.百度搜索图片只会显示不超过30张图片

2.图片是由JS文件动态生成 

2.URL分析

百度图片搜索的URL如下,tn=baiduimage代表搜索图片。

word=周杰伦代表搜索关键字

 这是两段图片的URL,可以确定大部分是以.jpg结尾。

http://img2.imgtn.bdimg.com/it/u=1435330949,2933798089&fm=26&gp=0.jpg

http://img3.imgtn.bdimg.com/it/u=1334437254,2025956451&fm=26&gp=0.jpg

3.正则表达式分析

1)图片搜索URL分析

http://image.baidu.com/search/index?tn=baiduimage&word=周杰伦

根据上面的URL,我们可以写入出正则表达式:

http://image.baidu.com/search/index?tn=baiduimage&word={}

参数用{}代替,我们可以用format来导入关键字

2)图片URL分析

由于图片是由JS生成的,所以我们写出匹配JS代码的正则表达式,我们看到JS代码,是一个键值对的形式。这样的正则表达式非常好写。

"thumbURL":"http://img2.imgtn.bdimg.com/it/u=1435330949,2933798089&fm=26&gp=0.jpg"

以thumbURL开头,采用非贪婪匹配,用子模式取出结果,如下:

"thumbURL":"(.*?)"

4.程序设计

1.定义一个类,名为BaiduImage_spider

2.初始化构建,定义若干个参数,定义百度图片搜索的url,定义一个数字用于计数(用于文件命名)count,定义关键字名(即搜索栏中填写的)word,定义文件保存路径dir,定义图片正则regex,一段代码用于判断文件路径是否存在

3.定一个函数用于获取图片的链接:get_image()

4.定义一个函数用于下载图片:download_image()

5.定义一个函数用于保存图片到本地:save_local()

6.定义入口函数

5.程序代码

注意事项:

1.本程序所需模块有requests(下载页面),parse(字符串转编码),random和time(模拟人操作,不定时请求),re正则匹配,os(判断路径和生成路径)

2.如果在执行程序时发现下载的页面报403错误,建议更换User-Agent

import requests
from urllib import parse
import random
import os
import re
import time

class BaiduImage_spider(object):

    def __init__(self):
        self.url="http://image.baidu.com/search/index?tn=baiduimage&word={}"
        self.count=1
        self.word=input("请输入关键词名:")
        self.dir="C:\\Users\\Administrator\\Desktop\\新建文件夹\\"
        self.regex='"thumbURL":"(.*?)"'
        #判断是否存在路径,不存在则创建
        if not os.path.exists(self.dir):
            os.makedirs(self.dir)

    #获取图片链接
    def get_images(self,url):
        #获取响应结果
        rep=requests.get(url=url,headers= {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36").text
        #正则匹配,返回图片链接
        pattern=re.compile(self.regex,re.S)
        image_lists=pattern.findall(rep)
        #遍历集合,下载每一张图片
        for i in image_lists:
           self.download_images(i)
           #间隔请求
           time.sleep(random.randint(0,2))

    #下载图片
    def download_images(self,url):
        #下载图片
        image= requests.get(url=url, headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36"}).content
        #字符串拼接
        filename = self.dir + self.word + "_" + str(self.count) + ".jpg"
        self.count += 1
        #保存到本地
        self.save_local(filename,image)
        print(filename,"下载成功........")


    #本地存盘
    def save_local(self,filename,file):
        with open(filename,"wb") as f:
            f.write(file)

    #入口函数
    def run(self):
        #字符转码
        word=parse.quote(self.word)
        url=self.url.format(word)
        self.get_images(url)

if __name__=="__main__":
    spider=BaiduImage_spider()
    spider.run()
发布了209 篇原创文章 · 获赞 85 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/ck784101777/article/details/104279129