经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
Python爬虫(二):写一个爬取壁纸网站图片的爬虫(图片下载,词频统计,思路)
来源:cnblogs  作者:养肥胖虎  时间:2023/6/19 18:07:18  对本文有异议

好家伙,写爬虫

 

代码:

 

  1. import requests
  2. import re
  3. import os
  4. from collections import Counter
  5. import xlwt
  6. # 创建Excel文件
  7. workbook = xlwt.Workbook(encoding='utf-8')
  8. worksheet = workbook.add_sheet('url_list')
  9. # 将数据写入Excel文件
  10. worksheet.write(0, 0, '序号') #写入对应的字段
  11. worksheet.write(0, 1, '图片详细地址')
  12. worksheet.write(0, 2, '图片TAG')
  13. def get_response(html_url):
  14. headers ={
  15. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.43'
  16. }
  17. response = requests.get(url=html_url,headers=headers)
  18. return response
  19. def get_img_src(html_url):
  20. #获取榜单地址
  21. response =get_response(html_url)
  22. list_url =re.findall('<img src="(.*?)"',response.text)
  23. return list_url
  24. def get_img_src_ciping(html_url):
  25. #获取榜单地址
  26. response =get_response(html_url)
  27. # print(response.text)
  28. list_url =re.findall('title="(.*?)">',response.text)
  29. if(list_url):
  30. return list_url[0]
  31. else:
  32. return "无内容"
  33. url = 'https://wallspic.com/cn/topic/pc_wallpapers'
  34. response = get_response(html_url=url)
  35. html_code = response.text
  36. # print(html_code)
  37. # 定义正则表达式匹配模式
  38. pattern = r'"link":"(.*?)"'
  39. # 使用re.findall()方法获取所有匹配结果
  40. result_list = re.findall(pattern, html_code)
  41. cleaned_urls_1 = []
  42. for url in result_list:
  43. cleaned_url = url.replace("\\/\\/", "/")
  44. cleaned_url = url.replace("\\/", "/")
  45. cleaned_urls_1.append(cleaned_url)
  46. print(cleaned_url)
  47. cleaned_urls_2 = []
  48. cleaned_urls_3 = []
  49. for url in cleaned_urls_1:
  50. # 使用os.path.splitext()方法将URL路径拆分为文件名和扩展名
  51. filename, ext = os.path.splitext(url)
  52. # 判断扩展名是否为.jpg
  53. if ext.lower() == '.jpg':
  54. cleaned_urls_2.append(url)
  55. if ext.lower() != '.jpg' and ext.lower() !='.webp':
  56. cleaned_urls_3.append(url)
  57. # print(cleaned_urls_2)
  58. save_dir = 'C:/Users/10722/Desktop/python答辩/canuse/img/' # 指定保存路径
  59. if not os.path.exists(save_dir):
  60. os.makedirs(save_dir)
  61. #下载图片
  62. row = 1
  63. for url in cleaned_urls_2:
  64. worksheet.write(row, 0, row+1) #将排行写入excel表格
  65. worksheet.write(row, 1, url) #将歌名写入excel表格
  66. filename = os.path.basename(url) # 获取文件名
  67. filepath = os.path.join(save_dir, filename) # 拼接保存路径和文件名
  68. response = requests.get(url)
  69. with open(filepath, 'wb') as f:
  70. f.write(response.content)
  71. print(f'{filename} 下载完成')
  72. row+=1
  73. print('全部图片下载完成')
  74. cleaned_urls_4 =[]
  75. roww = 1
  76. for url in cleaned_urls_3:
  77. # print(url)
  78. response=get_img_src_ciping(html_url=url)
  79. # print(response)
  80. worksheet.write(roww, 2, response) #将tag写入excel表格
  81. roww+=1
  82. cleaned_urls_4.append(response)
  83. print(cleaned_urls_4)
  84. # urls=str(cleaned_urls_4)
  85. # 将数组中的字符串拼接成一个长字符串
  86. long_string = " ".join(cleaned_urls_4)
  87. # 使用空格将长字符串分割成一个单词列表
  88. word_list = long_string.split()
  89. # 使用Counter对单词列表进行词频统计
  90. word_counts = Counter(word_list)
  91. words =str(word_counts)
  92. worksheet.write(roww, 2, words) #将歌手写入excel表格
  93. print(word_counts)
  94. workbook.save('C:/Users/10722/Desktop/python答辩/canuse/图片详情.xls')
Pachong.py

 

效果展示

 

 

上次爬虫去答辩了,爬的酷狗音乐的某个排行榜,

老师问我为什么没有把音乐也爬下来,

然后去翻了一下,这个音乐加密有点超出我的能力范围了(他真的太会藏了)

 

重写吧

我决定换个网站,爬个图片吧

找个壁纸网站

最佳 电脑壁纸 [30000+] |在 Wallspic 上免费下载

 

看上去好爬

 可以直接拿到图片的src

开干!

 

依旧按照以下思路进行

1.发请求,随后拿到服务器发过来的.html文件

2.用正则表达式去套对应的,我们需要的数据

3.处理数据,最后把他们以某种方式呈现

 

1.发请求拿到.html文件 

  1. url = 'https://wallspic.com/cn/topic/pc_wallpapers'
  2. response = get_response(html_url=url)
  3. html_code = response.text
  4. print(html_code)

来看看拿到的.html文本

我们并不能很直观的直接拿到<img>标签中的src

他似乎是通过某种方式注入

 

2.拿到图片的src

但是没有太大问题,我们依旧能够找到其中的src

用一个方法()把他们"过滤出来"

  1. cleaned_urls_1 = []
  2. for url in result_list:
  3. cleaned_url = url.replace("\\/\\/", "/")
  4. cleaned_url = url.replace("\\/", "/")
  5. cleaned_urls_1.append(cleaned_url)
  6. print(cleaned_url)

 来看看

 这里可以看到,在这些地址中,以两条为一组,其中,第一条为该壁纸的详情页,第二条为该壁纸的真正src

随后,可以想个办法把他们分别放到不同的数组中

  1. cleaned_urls_2 = []
  2. cleaned_urls_3 = []
  3. for url in cleaned_urls_1:
  4. # 使用os.path.splitext()方法将URL路径拆分为文件名和扩展名
  5. filename, ext = os.path.splitext(url)
  6. # 判断扩展名是否为.jpg
  7. if ext.lower() == '.jpg':
  8. cleaned_urls_2.append(url)
  9. if ext.lower() != '.jpg' and ext.lower() !='.webp':
  10. cleaned_urls_3.append(url)

这里偷个懒,直接使用第三方插件os去做一个拆分,然后用ext.lower拿到他们的后缀,再进行一个判断

把两种地址分类,把他们放到不同的数组中,

详情页在后面有用,要对图片的TAG进行一个词频统计

 

3.下载图片到本地

  1. save_dir = 'C:/Users/10722/Desktop/python答辩/canuse/img/' # 指定保存路径
  2. if not os.path.exists(save_dir):
  3. os.makedirs(save_dir)
  4. #下载图片
  5. row = 1
  6. for url in cleaned_urls_2:
  7. worksheet.write(row, 0, row+1) #将排行写入excel表格
  8. worksheet.write(row, 1, url) #将歌名写入excel表格
  9. filename = os.path.basename(url) # 获取文件名
  10. filepath = os.path.join(save_dir, filename) # 拼接保存路径和文件名
  11. response = requests.get(url)
  12. # with open(filepath, 'wb') as f:
  13. # f.write(response.content)
  14. # print(f'{filename} 下载完成')
  15. row+=1
  16. print('全部图片下载完成')

这里用response发一个get请求就可以了,

 

 

4.词频统计

这里同样的,我们去到图片的详情页,然后用一个正则表达式去套图片的TAG

  1. def get_img_src_ciping(html_url):
  2. #获取榜单地址
  3. response =get_response(html_url)
  4. # print(response.text)
  5. list_url =re.findall('title="(.*?)">',response.text)
  6. if(list_url):
  7. return list_url[0]
  8. else:
  9. return "无内容"

 

再使用插件collections去统计词频

  1. cleaned_urls_4 =[]
  2. roww = 1
  3. for url in cleaned_urls_3:
  4. # print(url)
  5. response=get_img_src_ciping(html_url=url)
  6. # print(response)
  7. worksheet.write(roww, 2, response) #将tag写入excel表格
  8. roww+=1
  9. cleaned_urls_4.append(response)
  10. print(cleaned_urls_4)
  11. # urls=str(cleaned_urls_4)
  12. # 将数组中的字符串拼接成一个长字符串
  13. long_string = " ".join(cleaned_urls_4)
  14. # 使用空格将长字符串分割成一个单词列表
  15. word_list = long_string.split()
  16. # 使用Counter对单词列表进行词频统计
  17. word_counts = Counter(word_list)
  18. words =str(word_counts)

 

然后就,搞定啦

完整代码:

  1. import requests
  2. import re
  3. import os
  4. from collections import Counter
  5. import xlwt
  6. # 创建Excel文件
  7. workbook = xlwt.Workbook(encoding='utf-8')
  8. worksheet = workbook.add_sheet('url_list')
  9. # 将数据写入Excel文件
  10. worksheet.write(0, 0, '序号') #写入对应的字段
  11. worksheet.write(0, 1, '图片详细地址')
  12. worksheet.write(0, 2, '图片TAG')
  13. def get_response(html_url):
  14. headers ={
  15. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.43'
  16. }
  17. response = requests.get(url=html_url,headers=headers)
  18. return response
  19. def get_img_src(html_url):
  20. #获取榜单地址
  21. response =get_response(html_url)
  22. list_url =re.findall('<img src="(.*?)"',response.text)
  23. return list_url
  24. def get_img_src_ciping(html_url):
  25. #获取榜单地址
  26. response =get_response(html_url)
  27. # print(response.text)
  28. list_url =re.findall('title="(.*?)">',response.text)
  29. if(list_url):
  30. return list_url[0]
  31. else:
  32. return "无内容"
  33. url = 'https://wallspic.com/cn/topic/pc_wallpapers'
  34. response = get_response(html_url=url)
  35. html_code = response.text
  36. # print(html_code)
  37. # 定义正则表达式匹配模式
  38. pattern = r'"link":"(.*?)"'
  39. # 使用re.findall()方法获取所有匹配结果
  40. result_list = re.findall(pattern, html_code)
  41. cleaned_urls_1 = []
  42. for url in result_list:
  43. cleaned_url = url.replace("\\/\\/", "/")
  44. cleaned_url = url.replace("\\/", "/")
  45. cleaned_urls_1.append(cleaned_url)
  46. print(cleaned_url)
  47. cleaned_urls_2 = []
  48. cleaned_urls_3 = []
  49. for url in cleaned_urls_1:
  50. # 使用os.path.splitext()方法将URL路径拆分为文件名和扩展名
  51. filename, ext = os.path.splitext(url)
  52. # 判断扩展名是否为.jpg
  53. if ext.lower() == '.jpg':
  54. cleaned_urls_2.append(url)
  55. if ext.lower() != '.jpg' and ext.lower() !='.webp':
  56. cleaned_urls_3.append(url)
  57. # print(cleaned_urls_2)
  58. save_dir = 'C:/Users/10722/Desktop/python答辩/canuse/img/' # 指定保存路径
  59. if not os.path.exists(save_dir):
  60. os.makedirs(save_dir)
  61. #下载图片
  62. row = 1
  63. for url in cleaned_urls_2:
  64. worksheet.write(row, 0, row+1) #将排行写入excel表格
  65. worksheet.write(row, 1, url) #将歌名写入excel表格
  66. filename = os.path.basename(url) # 获取文件名
  67. filepath = os.path.join(save_dir, filename) # 拼接保存路径和文件名
  68. response = requests.get(url)
  69. # with open(filepath, 'wb') as f:
  70. # f.write(response.content)
  71. # print(f'{filename} 下载完成')
  72. row+=1
  73. print('全部图片下载完成')
  74. cleaned_urls_4 =[]
  75. roww = 1
  76. for url in cleaned_urls_3:
  77. # print(url)
  78. response=get_img_src_ciping(html_url=url)
  79. # print(response)
  80. worksheet.write(roww, 2, response) #将tag写入excel表格
  81. roww+=1
  82. cleaned_urls_4.append(response)
  83. print(cleaned_urls_4)
  84. # urls=str(cleaned_urls_4)
  85. # 将数组中的字符串拼接成一个长字符串
  86. long_string = " ".join(cleaned_urls_4)
  87. # 使用空格将长字符串分割成一个单词列表
  88. word_list = long_string.split()
  89. # 使用Counter对单词列表进行词频统计
  90. word_counts = Counter(word_list)
  91. words =str(word_counts)
  92. worksheet.write(roww, 2, words) #将歌手写入excel表格
  93. print(word_counts)
  94. workbook.save('C:/Users/10722/Desktop/python答辩/canuse/图片详情.xls')
  95. # <img width="500" height="281" class="deferred_image deferred_image-clear" src="https://img2.wallspic.com/previews/2/2/8/3/7/173822/173822-kui_jia-dian_shi-chao_ji_ying_xiong-kong_jian-dong_zuo_mao_xian_de_you_xi-500x.jpg" alt="图片 盔甲, 电视, 超级英雄, 空间, 动作冒险的游戏">

 

原文链接:https://www.cnblogs.com/FatTiger4399/p/17491649.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号