矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 1560|回复: 13

求教完善Python爬虫爬取图片

[复制链接]
     
发表于 2023-11-10 14:25:49 | 显示全部楼层 |阅读模式
本帖最后由 天天爱玛丽 于 2023-11-10 14:28 编辑

如题,也是在网上找的,专门爬取169tp网图片的Python爬虫程序,目前我只做到爬取每个美女的第一页,有5张图片,实际上都有15张,初学Python,有点不会弄了,希望Python大神能帮我完善这个程序,谢谢,重点不在爬取美女图片,在于学习Python,爬取美女,不枯燥,
  1. import requests
  2. from pyquery import PyQuery as pq
  3. from bs4 import BeautifulSoup
  4. import os
  5. import re
  6. import time

  7. headers={
  8.     'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'
  9. }

  10. #下载图片的模块,目前仅能读取第一页
  11. def Download_the_module(file, tehurl):
  12.     count = 1
  13.     # 进入网站下载图片
  14.     response = requests.get(tehurl, headers=headers)
  15.     # 解析为HTML对象,存储在soup变量中
  16.     soup = BeautifulSoup(response.text, "html.parser")
  17.     # 使用select方法选择class为big_img的div标签
  18.     bigimg = soup.select('.big_img')
  19.     # 提取图片地址列表
  20.     srclist = re.findall(r'https.*?jpg', str(bigimg))
  21.     # print("srclist" + str(srclist))
  22.     for imgurl in srclist:
  23.         print("src: " + str(imgurl))
  24.         # 提取图片
  25.         r = requests.get(imgurl, headers=headers)
  26.         dir='./图片/'+file #保存目录
  27.         # print("dir:" + dir)
  28.         save_dir = str(dir)
  29.         # 检测是否有image目录没有则创建
  30.         if not os.path.exists(save_dir):
  31.             os.makedirs(dir)
  32.         else:
  33.             with open(save_dir+'/%s.jpg'%count,'wb')as f:
  34.                 f.write(r.content)
  35.                 # print('已经下载了%s张'%count)
  36.             count += 1
  37.         #os.system('pause')

  38. '''
  39. def GetPageList(page_url):
  40.     # 进入图片首页
  41.     rp = requests.get(page_url, headers=headers)
  42.     # 解析HTML
  43.     soup = BeautifulSoup(rp.text, "html.parser")
  44.     pagelist = soup.select('.dede_pages')
  45.     #print(str(pagelist))
  46.     page_num = re.findall(r'共.*?页', str(pagelist).encode('utf-8'))
  47.     print("page_num:")+ page_num
  48. '''

  49. #爬取地址
  50. def Climb_to_address(a, b):
  51.     for page in range(a, b):
  52.         URL='https://www.169tp.com/gaogensiwa/list_3_%s.html'%page
  53.         sponse=requests.get(URL,headers=headers)
  54.         sponse.encoding='gbk'
  55.         encodin=sponse.text
  56.         doc=pq(encodin)
  57.         extract=doc('.pic').items()
  58.         for i in extract:
  59.             #文件名
  60.             page_name=i.text()
  61.             print("page name: " + page_name)
  62.             #提取到的网站
  63.             page_url=i.attr('href')

  64.             #GetPageList(page_url)
  65.             Download_the_module(page_name, page_url)

  66. #目前一共有590页,网站的实际页数会不定期变化
  67. a=int(input('开始页数:'))
  68. b=int(input('结束页数:'))
  69. Climb_to_address(a, b)
复制代码

评分

1

查看全部评分

发表于 2023-11-10 14:48:15 来自手机 | 显示全部楼层
github上去找相关的,或者挂github上

评分

2

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2023-11-10 14:53:27 | 显示全部楼层
本帖最后由 JuncoJet 于 2023-11-10 14:54 编辑

这个涉及html css选择器,标签 类 id 这些知识
还有http get  post 方法,然后cookie ua,还有proxy
先学着吧

评分

2

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2023-11-10 15:22:09 | 显示全部楼层
不要以为学会python就会爬虫,写爬虫的时间最多是花在分析网页页面结构和里面的脚本程序,

评分

2

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2023-11-10 15:44:50 | 显示全部楼层
本帖最后由 guizi676 于 2023-11-10 15:53 编辑

做爬虫要会解析html标签,像C#的类似这样,
scraw.png

评分

2

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-11-10 16:36:06 | 显示全部楼层
guizi676 发表于 2023-11-10 15:44
做爬虫要会解析html标签,像C#的类似这样,

我会解析HTML标签的,遇到的问题是
  1. <div class="dede_pages">
  2.            <ul class="pagelist">
  3.             <li><a>共8页: </a></li><li><a href='#'>上一页</a></li><li class="thisclass"><a href='#'>1</a></li><li><a href='53360_2.html'>2</a></li><li><a href='53360_3.html'>3</a></li><li><a href='53360_2.html'>下一页</a></li>
  4.            </ul>
  5.           </div>
复制代码

这种多页面链接,'#'页面是 53360.html,下一页是53360_2.html,这个代码不好弄,貌似需要提取出''53360_''再拼接当前页的网址,用代码实现起来容错性是个问题,这一页的规律,到了其它页面不一定相符了.
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-11-10 16:52:13 | 显示全部楼层
这个网站不讲武德,事情是这样的,我开始爬了一些图片都是对的,后来就不对了,
解析的图片地址是正确,下载的图片都换成他网站的LOGO,从浏览器地址栏直接输图片地址打开的也会变成该网站的LOGO图片,现在网站的防爬技术越来越厉害了
回复 支持 反对

使用道具 举报

     
发表于 2023-11-10 16:58:55 | 显示全部楼层
天天爱玛丽 发表于 2023-11-10 16:36
我会解析HTML标签的,遇到的问题是

这种多页面链接,'#'页面是 53360.html,下一页是53360_2.html,这个代 ...

我这边是按以下思路做的:
        string[] sWD = sCurAdr.Split('.');        //拆分字符串
        string sBaseURL=sWD[0];                //基址
        sToURL = sBaseURL + "_" + nToPag.ToString() + "." +sWD[1];        //加页码重新组合,得到目标网页地址

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2023-11-10 17:01:58 | 显示全部楼层
天天爱玛丽 发表于 2023-11-10 16:52
这个网站不讲武德,事情是这样的,我开始爬了一些图片都是对的,后来就不对了,
解析的图片地址是正确,下载的 ...

很多网站都有防爬,如果时间不急的话,可以把爬的速度降下来,尽量模拟人浏览网页的操作。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2023-11-10 23:06:44 | 显示全部楼层
天天爱玛丽 发表于 2023-11-10 16:36
我会解析HTML标签的,遇到的问题是

这种多页面链接,'#'页面是 53360.html,下一页是53360_2.html,这个代 ...

你这个先
li=select("li")
for i in li:
  a=i.select("a")
  if a:
    print a[0].get("href")

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2023-11-10 23:51:17 | 显示全部楼层
爬虫写的好。牢饭吃的早

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2024-1-15 09:04:41 | 显示全部楼层
模拟人浏览网页的行为就行了,看完一页之后,会点击下一页,然后看完再点击下一页,只要把这个递归一下,就可以把整个图集下载完成了。像这种图片网站,大多数的网页结构都是类似的,一个根,然后下面几个分类,然后每个分类里面排列一定数量的图集,然后分页,大多数这种不需要充值的网站,分页的url都是按顺序来的,只要在第一页获取一些元素,就可以直接用循环构造页面的url了。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2024-1-15 13:01:55 来自手机 | 显示全部楼层
论坛上真是大有人才呀!采集的都有

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2024-1-15 15:16:20 | 显示全部楼层
天天爱玛丽 发表于 2023-11-10 16:36
我会解析HTML标签的,遇到的问题是

这种多页面链接,'#'页面是 53360.html,下一页是53360_2.html,这个代 ...

你只要把第一页链接最右边的反斜杠后面的去掉保存成一个单独的字符串,然后用这个新的字符串跟第几页的相对链接拼接一下,就可以直接得到下一页的连接了。然后你再用第一页里面的共几页那个数字提取出来,就可以直接用for循环获取所有页面的链接了,然后就是下载图片的问题了。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-3 04:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表