爬虫学习笔记(二)——使用 requests 爬取百度图片

一、抓取首页图片

静态页面

流程:

1.1、找到目标数据

这里用狗的图片来举例,接下来我们就要分析然后爬取这个页面所有狗的图片的规律

1.2、分析请求流程

先访问page页获取网页的源代码

# 网页的URL地址
url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1623639077275_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=%E7%8B%97'
#添加请求头
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"}
#访问page页面   获取网页源代码
res = requests.get(url,headers=headers)
print(res.text)

可以观察到网页源代码的提取并不完整,因此我们可以按“F12”——NetWork——ALL——Name(排在第一个)查看到请求头,把所有的请求头内容复制到代码里(一般反爬我们有User-Agent就行,不行我们就把所有的请求头加进去)

但是,每个都要改写成键值对形式有点麻烦,这里有个小技巧;
我们可以在pycharm上新建一个py文件,然后把复制的请求头放进去,按“Ctrl+R”——勾选“Regex”(这里可以让我们使用正则方式修改我们需要的内容),这样就能获取到网页的源代码了。

1.3、提取数据

我们先找随机找一张图片右击“复制图片地址”,然后在网页空白部分右击“查看网页源代码”,在网页源代码页面“Ctrl+F”查看它在网页源代码里是如何显示的;

同理我们可以多找几张图片来进行比较,通过对比可得知图片加载格式有 3 种方式(找到图片之间的规律了):"thumbURL":"xxx.jpg""middleURL":"xxx.jpg""hoverURL":"xxx.jpg",接下来我们就可以通过正则表达式获取到图片的 URL 地址了,最后通过循环就可以爬取到该页面的图片了。

1.4、完整代码

import requests
import re
import os

# 网页的URL地址
url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1623639077275_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=%E7%8B%97'
#添加请求头
headers = {
"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",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Cookie": "BDIMGISLOGIN=0; winWH=%5E6_1280x578; BDqhfp=%E7%8B%97%26%260-10-1undefined%26%260%26%261; BIDUPSID=88BFCA0DA519F42EA22F89F163D205C5; PSTM=1621005981; BAIDUID=88BFCA0DA519F42EAE9BD14C17C67F24:FG=1; __yjs_duid=1_435ea021e771bf48348cc6d1e442cb191622824721988; H_PS_PSSID=31253_26350; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; delPer=0; PSINO=6; BDRCVFR[X_XKQks0S63]=mk3SLVN4HKm; BAIDUID_BFESS=88BFCA0DA519F42EAE9BD14C17C67F24:FG=1; firstShowTip=1; cleanHistoryStatus=0; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm; BDRCVFR[tox4WRQ4-Km]=mk3SLVN4HKm; BDRCVFR[CLK3Lyfkr9D]=mk3SLVN4HKm; indexPageSugList=%5B%22%E7%8B%97%22%2C%22%E6%A2%A6%E7%90%AA%22%5D; ab_sr=1.0.1_ODM0ZmQ5MDFiNzQ3MzE4NzIyMDg2MWU5NTg5MDgzNmY4OTFhODgwYjUwOWYzZGZiYjZlMTQ4YWNhZjdlMDJiMDM1YmY0NjljZDljMmU5YzM0ZDZhNWYwODIyZWFkZWZkNjcwNjFmM2UxZmU1M2NjOGQxZjc3NGNmNWE5NjA2NWVlMzhiMTlkM2IyNzBlOTgyNDBjMDhjZmEyZDFjM2QyOQ==",
"Host": "image.baidu.com",
"sec-ch-ua": '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"',
"sec-ch-ua-mobile": "?0",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"
}
#访问page页面   获取网页源代码
res = requests.get(url,headers=headers)
#提取数据   狗图片url
urls = re.findall('"thumbURL":"(.*?)"',res.text)

# 创建存放的图片文件夹
if not os.path.exists('images'):
    os.mkdir('images')
#url发起请求,获取图片数据
for index,img_url in enumerate(urls):
	# 若图片的地址中存在\\则替换掉
    if '\\' in img_url:
        img_url = img_url.replace("\\","")

    res = requests.get(img_url)  #res 包含  狗图片数据
    #图片下载位置、及图片名称
    picname = './images/'+'cat'+ str(index) +'.png'
    print(picname)
    with open(picname,'wb') as f:
        f.write(res.content)

结果:


二、抓取多页图片

还是以狗的图片为例,当我们鼠标往下滑的时候,我们会发现会有图片不断加载出来,其实这已经是加载到下一页了。那如果我们不仅想爬第一页图片,还想爬第二页、第三页呢?

2.1、分析请求流程

构造page页,即找到多个page页之间的规律

首先,按“F12”——点击“NetWork”——点击“XHR”,然后随着鼠标滚轮不断的往下,我们可以看到各个页面的网页源代码被加载出来。

接下来我们可以复制几个网页页面的URL地址进行比价找出它们之间的规律

https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8353138729825372156&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E7%8B%97&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&word=%E7%8B%97&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&pn=90&rn=30&gsm=5a&1623720170654=
https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8353138729825372156&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E7%8B%97&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&word=%E7%8B%97&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&pn=120&rn=30&gsm=78&1623720170795=

(这里我只列举了两个,要比较的话最好多找几个)通过比较我们可以看出只有后面部分存在差异,&pn后数值相差是 30 的倍数,其他的数值差异不影响结果(这个有兴趣的可以自己去尝试),因此我们就可以通过修改 &pn 后的值来获取多个网页

&pn=120&rn=30&gsm=78&1623720170795=  #就&pn开始往后存在差异

接下来,就是找一个网页进行图片分析(这里 分析过程上面已经讲了)

2.2、完整代码

import requests
import re
import os

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"}

def getimg(urls,filename):
    """
       功能:获取百度图片,存储到文件夹
       参数:
           img_urls:图片url列表
           filename:图片存储文件夹
    """
    for index,img_url in enumerate(urls):
        if '\\' in img_url:
            img_url = img_url.replace('\\',"")

        # url发起请求,获取图片数据
        res = requests.get(img_url, headers=headers)
        picname = filename+'/'+'dog'+str(index)+'.png'
        print(picname)
        with open(picname,'wb') as f:
            f.write(res.content)

for i in range(1,4):
    url = "https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8443544291319646945&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E7%8B%97&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&word=%E7%8B%97&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&pn={0}&rn=30&gsm=1e&1623687251585="
    index = i*30
    url = url.format(index)
    res = requests.get(url,headers=headers)
    #提取数据   狗图片url
    img_urls = re.findall('"thumbURL":"(.*?)"',res.text)
    # 创建存放的图片文件夹
    filename = 'dog'+str(i)+'.png'
    if not os.path.exists(filename):
        os.mkdir(filename)
    getimg(img_urls,filename)

结果:

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 可以使用Python中的requests和BeautifulSoup库来百度图片。以下是一个简单的示例代码: ```python import requests from bs4 import BeautifulSoup import os # 搜索关键词 keyword = "猫" # 创建文件夹用于存放图片 if not os.path.exists(keyword): os.mkdir(keyword) # 请求百度图片搜索结果页面 url = "https://image.baidu.com/search/index?tn=baiduimage&word=" + keyword response = requests.get(url) # 解析页面内容,获图片链接 soup = BeautifulSoup(response.content, "html.parser") img_tags = soup.find_all("img") # 下载图片 for i, img_tag in enumerate(img_tags): img_url = img_tag.attrs.get("src") if img_url and "http" in img_url: img_name = keyword + "_" + str(i) + ".jpg" img_path = os.path.join(keyword, img_name) with open(img_path, "wb") as f: f.write(requests.get(img_url).content) ``` 运行代码后,会在当前目录下创建一个名为`猫`的文件夹,并将搜索结果中的图片下载到该文件夹中。你可以将`keyword`变量改为其他关键词进行搜索。注意,百度图片需要遵守百度的相关规定和法律法规,不要用于商业用途。 ### 回答2: 要用Python百度图片,我们可以使用requests库发送HTTP请求,并使用BeautifulSoup库解析HTML页面。以下是一个简单的示例: 1. 导入所需的库: ```python import requests from bs4 import BeautifulSoup ``` 2. 定义一个函数来获百度图片的URL: ```python def get_image_urls(keyword, num_images): url = f'https://image.baidu.com/search/flip?tn=baiduimage&word={keyword}&pn=0&tn=pc' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') img_tags = soup.find_all('img') image_urls = [] for img in img_tags: if len(image_urls) == num_images: break image_urls.append(img['src']) return image_urls ``` 该函数接受两个参数:要搜索的关键词和要获图片数量。它首先构建了百度图片搜索的URL,然后发送GET请求并解析响应的HTML页面。接下来,它找到所有的<img>标签,并提它们的src属性,将图片的URL添加到image_urls列表中,直到达到所需的图片数量。 3. 调用函数并下载图片: ```python def download_images(image_urls): for i, url in enumerate(image_urls): response = requests.get(url) with open(f'image_{i}.jpg', 'wb') as file: file.write(response.content) ``` 该函数接受一个包含图片URL的列表,并使用requests库下载每个图片。每个图片以'image_序号.jpg'的格式保存在本地。 4. 在主程序中使用上述函数: ```python if __name__ == '__main__': keyword = '猫' num_images = 10 image_urls = get_image_urls(keyword, num_images) download_images(image_urls) ``` 在主程序中,我们指定了要搜索的关键词和要获图片数量,并调用get_image_urls函数获百度图片的URL。然后,我们将URL列表传递给download_images函数,下载并保存图片。 以上就是使用Python百度图片的基本过程。请注意,网站内容要遵守相关网站的使用条款和法律法规。 ### 回答3: Python百度图片可以使用第三方库requests和BeautifulSoup来实现。 首先,我们需要导入需要的库:requests和BeautifulSoup。 ```python import requests from bs4 import BeautifulSoup ``` 然后,我们可以定义一个函数来获百度图片的链接: ```python def get_image_urls(keyword): # 设置搜索关键字 search_url = "https://image.baidu.com/search/index?tn=baiduimage&word=" + keyword # 发送GET请求 response = requests.get(search_url) # 使用BeautifulSoup解析获到的html页面 soup = BeautifulSoup(response.text, 'html.parser') # 获所有的img标签 img_tags = soup.find_all('img') # 提每个img标签中的src属性,即图片链接,并将其添加到一个列表中 image_urls = [] for img in img_tags: image_urls.append(img['src']) return image_urls ``` 接下来,我们可以定义一个函数来下载百度图片: ```python def download_images(keyword, num_images): # 获图片链接 image_urls = get_image_urls(keyword) # 创建一个用于保存图片的文件夹 folder_path = "./images/" if not os.path.exists(folder_path): os.makedirs(folder_path) # 下载并保存图片 counter = 1 for url in image_urls: if counter > num_images: break try: response = requests.get(url) with open(folder_path + keyword + str(counter) + ".jpg", 'wb') as f: f.write(response.content) print("成功下载第" + str(counter) + "张图片") counter += 1 except: print("下载第" + str(counter) + "张图片失败") ``` 最后,我们可以调用download_images函数来下载指定数量的图片: ```python keyword = "猫" num_images = 10 download_images(keyword, num_images) ``` 以上就是使用Python百度图片的简单示例。你可以根据自己的需求修改关键字和下载图片的数量。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值