当前位置:   article > 正文

(python)入门小爬虫详细教程(获取网站的图片,文字等)_python 抓取网页 图片和名称

python 抓取网页 图片和名称

一. 前言

因为最近做了一个小型app,关于图像识别方向的,所以需要很多图片做数据集,一个个下载太慢了,所以就研究写了一个简单的小爬虫,就想着把这些经验记录下来,每一个网站的html结构都是不同的,所以对于不同的网站需要做出相应的更改,读这篇可能需要一些前端知识,总代码我发在最后了

这里用一个服装网站当作例子 (用哪个网站都可以,主要的是方法和代码)==》 https://www.black-up.kr/product/detail.html?product_no=32474&cate_no=96&display_group=1

二. 代码

2.1 三个工具库 requests,BeautifulSoup,os

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import os

2.2 获取并格式化浏览器请求头

我们需要准备一个浏览器的请求头,他是一个字典的形式,爬虫的本质就是利用请求头伪装成浏览器然后去进行访问,每个浏览器的请求头格式又不太一样,但是内容是一样的,我们要将请求头变为字典的形式,这里我写了一个小脚本可以帮助格式化请求头,但是可能只限于我用的edge浏览器,如果你不同浏览器也可以试试这个脚本,你也可以手动给他格式化就是麻烦一点

获取步骤如下:

1)打开浏览器进入目标网址(我用的是edge浏览器),按F12进入后台,点击网络,找到名称列表最上面的一条也就是第一条,在标头的位置也就是右方滚轮向下滑,可以看到请求标头四个字,从Accept开始复制,一直复制到最后面的user-agent,Accept前面都不需要

将复制的请求头进行格式化

格式化代码如下:

headerStr这个长字符串里面的内容就是刚才复制的请求头,你只需要将headerStr里面的内容删除换成你自己复制的请求头即可

注意:headerStr里面的未格式化的请求头最好和下面的位置一样,顶头复制,不要在Accept这些属性前面留有空格什么的

  1. import re
  2. def formulate_head():
  3. header_lines_value = ''
  4. headerStr = '''
  5. Accept:
  6. text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
  7. Accept-Encoding:
  8. gzip, deflate, br
  9. Accept-Language:
  10. zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
  11. Cookie:
  12. _gcl_au=1.1.511254458.1684805008; CUK45=cuk45_skfo900815_4d9322403b6cab3d50371082910e0531; CUK2Y=cuk2y_skfo900815_4d9322403b6cab3d50371082910e0531; _fbp=fb.1.1684805009113.971249844; black-up.kr-crema_device_token=LzzlyHO6YLN0keIv2jauEH73Xy2PRdBz; CFAE_CUK1Y=CFAE_CUK1Y.skfo900815_1.PZPJ94T.1684805009865; ch-veil-id=dafe7ccc-ecc3-43cd-ade9-bfcb8e1187dd; _wp_uid=2-45d93ef5ddc801f3dc97e1ec636ad20b-s1684809260.904994|windows_10|chrome-eqdzf9; _ga=GA1.2.1044427573.1684823556; recent_plist=31429%7C31417%7C31495%7C31421%7C31458%7C31211; wcs_bt=s_47112a8eb19a:1686401209; cto_bundle=k7_3Fl9saEF4MGhSelVRU3EwVDFZMElMRXZCdHpEZUk0WnNFcG5GRG5lS3dGJTJCSkIydXM5aXlHdnglMkJ5JTJGdFJ3QkxMYTRKRjdkYnJQcHA2eVp4U1lTbUFscXlvOHU2VHduaCUyQldHQXhLR3BJNmp5dFlKVXJGcUdPejZmVTNRV24xOXlMU3JGdmhKY3BBZnFKSVMwZEIzRCUyRm11SW93JTNEJTNE
  13. Sec-Ch-Ua:
  14. "Not/A)Brand";v="99", "Microsoft Edge";v="115", "Chromium";v="115"
  15. Sec-Ch-Ua-Mobile:
  16. ?0
  17. Sec-Ch-Ua-Platform:
  18. "Windows"
  19. Sec-Fetch-Dest:
  20. document
  21. Sec-Fetch-Mode:
  22. navigate
  23. Sec-Fetch-Site:
  24. none
  25. Sec-Fetch-User:
  26. ?1
  27. Upgrade-Insecure-Requests:
  28. 1
  29. User-Agent:
  30. Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188
  31. '''
  32. header_lines = headerStr.strip().split('\n')
  33. # print(header_lines)
  34. # exit()
  35. ret = ""
  36. jump = 0
  37. for i in range(jump,len(header_lines)):
  38. if i >= jump:
  39. if header_lines[i].rfind(':') != -1:
  40. ret += '\'' + header_lines[i] + ' ' + header_lines[i+1] + '\'' + ',\n'
  41. jump = i+2
  42. ret = re.sub(": ", "': '", ret)
  43. ret = ret[:-2]
  44. print(ret)
  45. return ret
  46. formulate_head()

运行上面的代码,结果如下,可以看到已经都被格式化为字典的形式了,将生成的结果复制下来,放到参数中

将格式化后的headers放入字典中即可

  1. if __name__ == '__main__':
  2. # 爬虫网址
  3. url = "https://www.black-up.kr/product/detail.html?product_no=32474&cate_no=96&display_group=1"
  4. # 文件命名
  5. pic_name = "download_pic_"
  6. # 保存文件目录
  7. save_dir = "D:\lableimg1.8\csdn\spider_pic"
  8. # 请求头
  9. headers = {
  10. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
  11. 'Accept-Encoding': 'gzip, deflate, br',
  12. 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
  13. 'Cookie': '_gcl_au=1.1.511254458.1684805008; CUK45=cuk45_skfo900815_4d9322403b6cab3d50371082910e0531; CUK2Y=cuk2y_skfo900815_4d9322403b6cab3d50371082910e0531; _fbp=fb.1.1684805009113.971249844; black-up.kr-crema_device_token=LzzlyHO6YLN0keIv2jauEH73Xy2PRdBz; CFAE_CUK1Y=CFAE_CUK1Y.skfo900815_1.PZPJ94T.1684805009865; ch-veil-id=dafe7ccc-ecc3-43cd-ade9-bfcb8e1187dd; _wp_uid=2-45d93ef5ddc801f3dc97e1ec636ad20b-s1684809260.904994|windows_10|chrome-eqdzf9; _ga=GA1.2.1044427573.1684823556; recent_plist=31429%7C31417%7C31495%7C31421%7C31458%7C31211; wcs_bt=s_47112a8eb19a:1686401209; cto_bundle=k7_3Fl9saEF4MGhSelVRU3EwVDFZMElMRXZCdHpEZUk0WnNFcG5GRG5lS3dGJTJCSkIydXM5aXlHdnglMkJ5JTJGdFJ3QkxMYTRKRjdkYnJQcHA2eVp4U1lTbUFscXlvOHU2VHduaCUyQldHQXhLR3BJNmp5dFlKVXJGcUdPejZmVTNRV24xOXlMU3JGdmhKY3BBZnFKSVMwZEIzRCUyRm11SW93JTNEJTNE',
  14. 'Sec-Ch-Ua': '"Not/A)Brand";v="99", "Microsoft Edge";v="115", "Chromium";v="115"',
  15. 'Sec-Ch-Ua-Mobile': '?0',
  16. 'Sec-Ch-Ua-Platform': '"Windows"',
  17. 'Sec-Fetch-Dest': 'document',
  18. 'Sec-Fetch-Mode': 'navigate',
  19. 'Sec-Fetch-Site': 'none',
  20. 'Sec-Fetch-User': '?1',
  21. 'Upgrade-Insecure-Requests': '1',
  22. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188'}
  23. get_content_black(url,pic_name,save_dir,headers)

2.3 request访问

requests.get(url,headers)就代表获取网站信息,url代表网址,headers代表上面的请求头,返回的response.status_code会保存状态码,200即为访问成功,其他则为失败

  1. response = requests.get(url, headers=headers)
  2. if response.status_code != 200:
  3. print('访问失败')
  4. return
  5. if response.status_code == 200:
  6. print('访问成功')

2.4 查看获取的html

beautifulSoup()将response返回的html结构转化成lxml的格式,方便后续进行操作

  1. html = BeautifulSoup(response.content, 'lxml')
  2. print(html) # 查看html

打印出来的html如下:

接下来就可以像操纵数组一样还获取html中的内容

2.5 获取html中想要的内容地址

1) 首先你要找到你目标位置的html结构,比如你想要这个卖衣服网站的细节图,操作如下:

还是按F12切出后台,点击上面带有鼠标箭头的按钮,然后点击图片,这时候右边就会显示出这个图片所在的html结构,可以看出这些细节图片都是封装在一个名为detailArea的类下面,而这图片地址本身又是封装在一个img标签的src属性之中,那么知道这些就够了

2) 代码寻找结构

先通过.find_all找到类名为detailArea的里面的所有标签信息

  1. content = html.find_all('div', class_="detailArea")
  2. print(content)

打印结果如下:

发现里面有我们想要的img标签,里面也正好是细节图,自己可以对照一下,下一步就很明确了,通过find_all再抽取出所有img标签,这里用content[0]是因为上一步返回的其实就是一个列表格式(注意看上面图片的方括号),而这个列表又只有一个元素(因为只找到一个detailArea类名,如果有多个detailArea的div类就会有多个元素了,列表用逗号分隔),虽然很长,但是调用的时候也得取第一个元素所以就出现了content[0]

  1. pics = content[0].find_all('img') # 第一个子集
  2. print(pics)

打印结果如下:

可以看到因为detailArea这个类下有多个img标签返回的也是列表形式,所以下一步就是对这个列表进行for循环取出所有的src值

利用for循环取出每一个src等于号后面的值,再拼接上网址的表头,再将拼接好的网址信息依次放入一个新列表中,这时候新列表中存储的就都是图片的链接地址了

  1. # 循环获得子集里img的键值对
  2. for i in pics:
  3. pic_url = 'https://www.black-up.kr/' + i['src']
  4. pic_urls.append(pic_url)

列表打印结果如下:

最后一步就是对图片进行下载和保存了,代码如下:

requests.get(url,headers)这个方法是用来下载网址内容的,参数url代表网址,headers就是一直用的请求头,因为每个图片的网站都不同,所以每次都要判断一下status_code是否为200也就是是否访问成功,访问成功就代表图片下载成功了,接下来就设置文件名并将保存路径和文件名拼接在一起,最后保存到本地即可

  1. num = 0
  2. for each_img_url in pic_urls:
  3. response = requests.get(each_img_url, headers=headers)
  4. # print(response.status_code)
  5. # exit()
  6. if response.status_code == 200:
  7. # 获取文件名
  8. file_name = pic_name + str(num) + '.jpg'
  9. num = num + 1
  10. # 拼接保存图片的完整路径
  11. save_path = os.path.join(save_dir, file_name)
  12. # 保存图片到本地
  13. with open(save_path, 'wb') as file:
  14. file.write(response.content)
  15. print(f'图片已保存为 {file_name}')
  16. # print(f'图片已保存为 {file_name}')
  17. else:
  18. print('无法下载图片')
  19. print(f'保存完毕')

运行截图如下:

三. 总结

到这就全部结束了,说点番外的,如果你想取一些特定的信息,比如特定的图片,就可以看一下这个图片的html结构与其他图片html结构的区别,然后用一些if条件给他分离出来就行了,一个熟能生巧的过程,用代码的时候别忘了headers用自己的然后格式化一下,要说的就这么多了,全部代码我放下面了,如果还有什么没懂的或者有困难的也可以邮箱联系我,大家一起进步 874302104@qq.com

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import os
  4. def get_content_black(url, pic_name, save_dir, headers):
  5. pic_urls = []
  6. response = requests.get(url, headers=headers)
  7. if response.status_code != 200:
  8. print('访问失败')
  9. return
  10. if response.status_code == 200:
  11. print('访问成功')
  12. # print(response) # 查看是否请求成功
  13. print("**开始获取图片**")
  14. html = BeautifulSoup(response.content, 'lxml')
  15. # print(html) # 查看html
  16. content = html.find_all('div', class_="detailArea") # class为detail的子集
  17. # print(content)
  18. first_single = html.find_all('div', class_="keyImg") # 首页第一个照片
  19. # print(first_single)
  20. first_single_a = first_single[0].find_all('a') # 获取a标签
  21. first_single_a_i = first_single_a[0].find_all('img') # 进入img标签
  22. first_single_src = first_single_a_i[0]['src'] # 取键值对
  23. first_single_src = 'https:' + first_single_src
  24. # first_single_src = first_single_src.replace("//", "", 1) # 删除字符串开头的//
  25. pic_urls.append(first_single_src) # 添加到数组中
  26. # print(first_single_src)
  27. pics = content[0].find_all('img') # 第一个子集
  28. # print(pics)
  29. # 循环获得子集里img的键值对
  30. for i in pics:
  31. pic_url = 'https://www.black-up.kr/' + i['src']
  32. pic_urls.append(pic_url)
  33. # print(pic_url)
  34. # print(pic_urls)
  35. if len(pic_urls) == 0:
  36. print(f'图片获取失败')
  37. return
  38. print(f'图片获取成功')
  39. # 下面是下载图片
  40. num = 0
  41. for each_img_url in pic_urls:
  42. response = requests.get(each_img_url, headers=headers)
  43. # print(response.status_code)
  44. # exit()
  45. if response.status_code == 200:
  46. # 获取文件名
  47. file_name = pic_name + str(num) + '.jpg'
  48. num = num + 1
  49. # 拼接保存图片的完整路径
  50. save_path = os.path.join(save_dir, file_name)
  51. # 保存图片到本地
  52. with open(save_path, 'wb') as file:
  53. file.write(response.content)
  54. print(f'图片已保存为 {file_name}')
  55. else:
  56. print('无法下载图片')
  57. print(f'保存完毕')
  58. return pic_urls
  59. if __name__ == '__main__':
  60. # 爬虫网址
  61. url = "https://www.black-up.kr/product/detail.html?product_no=32474&cate_no=96&display_group=1"
  62. # 文件命名
  63. pic_name = "download_pic_"
  64. # 保存文件目录
  65. save_dir = "D:\lableimg1.8\csdn\spider_pic"
  66. # 请求头
  67. headers = {
  68. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
  69. 'Accept-Encoding': 'gzip, deflate, br',
  70. 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
  71. 'Cookie': '_gcl_au=1.1.511254458.1684805008; CUK45=cuk45_skfo900815_4d9322403b6cab3d50371082910e0531; CUK2Y=cuk2y_skfo900815_4d9322403b6cab3d50371082910e0531; _fbp=fb.1.1684805009113.971249844; black-up.kr-crema_device_token=LzzlyHO6YLN0keIv2jauEH73Xy2PRdBz; CFAE_CUK1Y=CFAE_CUK1Y.skfo900815_1.PZPJ94T.1684805009865; ch-veil-id=dafe7ccc-ecc3-43cd-ade9-bfcb8e1187dd; _wp_uid=2-45d93ef5ddc801f3dc97e1ec636ad20b-s1684809260.904994|windows_10|chrome-eqdzf9; _ga=GA1.2.1044427573.1684823556; recent_plist=31429%7C31417%7C31495%7C31421%7C31458%7C31211; wcs_bt=s_47112a8eb19a:1686401209; cto_bundle=k7_3Fl9saEF4MGhSelVRU3EwVDFZMElMRXZCdHpEZUk0WnNFcG5GRG5lS3dGJTJCSkIydXM5aXlHdnglMkJ5JTJGdFJ3QkxMYTRKRjdkYnJQcHA2eVp4U1lTbUFscXlvOHU2VHduaCUyQldHQXhLR3BJNmp5dFlKVXJGcUdPejZmVTNRV24xOXlMU3JGdmhKY3BBZnFKSVMwZEIzRCUyRm11SW93JTNEJTNE',
  72. 'Sec-Ch-Ua': '"Not/A)Brand";v="99", "Microsoft Edge";v="115", "Chromium";v="115"',
  73. 'Sec-Ch-Ua-Mobile': '?0',
  74. 'Sec-Ch-Ua-Platform': '"Windows"',
  75. 'Sec-Fetch-Dest': 'document',
  76. 'Sec-Fetch-Mode': 'navigate',
  77. 'Sec-Fetch-Site': 'none',
  78. 'Sec-Fetch-User': '?1',
  79. 'Upgrade-Insecure-Requests': '1',
  80. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188'}
  81. get_content_black(url,pic_name,save_dir,headers)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/446036
推荐阅读
相关标签
  

闽ICP备14008679号