设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 24074|回复: 18
打印 上一主题 下一主题

抓取美女图片的爬虫小程序

[复制链接]

1

主题

0

好友

50

积分

注册会员

Rank: 2

跳转到指定楼层
楼主
发表于 2014-6-27 18:51:22 |只看该作者 |正序浏览
一个python爬虫小程序,爬的是www.22mm.cc里面的美女图片,该如何把它改成多线程呢??
  1. #!/usr/bin/env python
  2. #coding:UTF-8
  3. import urllib
  4. import re
  5. import os
  6. import os.path

  7. index=0
  8. #抓取页面的函数
  9. def getPage(url):
  10.         page=urllib.urlopen(url).read()
  11.         return page

  12. #抓取首页美女分类的链接信息
  13. def getSortLinkInfo(html):
  14.         patt='<a href="/[^\s]+?\.html" title="[^\s]+?"'
  15.         regex=re.compile(patt)
  16.         linkInfo=re.findall(regex,html)
  17.         links={}
  18.         for i in linkInfo:
  19.                 #links.append('http://www.22mm.cc'+i.split('"')[1])
  20.                 links['http://www.22mm.cc'+i.split('"')[1]]=i.split('"')[3]
  21.         return links        #links是有效链接的列表

  22. #获取特定美女页面中的链接信息
  23. def getBeautyLinkInfo(link):
  24.         page=getPage(link)
  25.         patt='<a href=\'[^\s]+?-\d+?\.html\'>\d+?</a>'
  26.         regex=re.compile(patt)
  27.         lastLink=re.findall(regex,page)
  28.         if len(lastLink)>0:
  29.                 lastLink=lastLink[-1].split("'")[1]
  30.         return lastLink                #lastLink是最后一个美女页面的相对路径

  31. #提取最终美女图片的链接
  32. def getImgLinks(lastLink):
  33.         page=getPage(lastLink)
  34.         patt='arrayImg\[0\]="(http://[^\s]+?\.jpg)"'
  35.         regex=re.compile(patt)
  36.         imgLinks=re.findall(regex,page)
  37.         return imgLinks     #imgLinks是有效的图片链接的列表

  38. #下载并且保存图片
  39. def saveImg(imgLinks,dirname):
  40.         global index
  41.         path=unicode('D:\\pics\\'+dirname,'utf8')
  42.         os.mkdir('%s' %(path))
  43.         dirname=dirname.decode('utf8')
  44.         for i in imgLinks:
  45.                 urllib.urlretrieve(i,'D:\\pics\%s\%d.jpg' % (dirname,index))
  46.                 print '%s has been downloaded and saved successfully.'%(i)
  47.                 index+=1

  48. indexURL='http://www.22mm.cc'

  49. def start():
  50.         homePage=getPage(indexURL)
  51.         links=getSortLinkInfo(homePage)
  52.         for i in links:
  53.                 #dirname=unicode('D:\\pics\\'+links[i],'utf8')
  54.                 #os.mkdir('%s' %(dirname))
  55.                 dirname=links[i]
  56.                 relPath=getBeautyLinkInfo(i)       
  57.                 if len(relPath)>0:
  58.                         lastLink='http://www.22mm.cc/mm/'+i.split("/")[4]+'/'+relPath
  59.                         tempLinks=getImgLinks(lastLink)
  60.                         imgLinks=[]
  61.                         for j in tempLinks:
  62.                                 imgLinks.append(re.sub('big','pic',j))
  63.                         saveImg(imgLinks,dirname)
  64.                     
  65.                         
  66. start()
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

19#
发表于 2017-7-4 17:22:53 |只看该作者
我叫别这样 发表于 2017-7-4 14:23
这里我获得的temp_link这个List长度是0 是怎么回事?

那就是findall没拿到结果
通过增加输出调试,确认你的 html内容对不对,regex的规则是不是其效果
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

12

积分

新手上路

Rank: 1

18#
发表于 2017-7-4 14:23:15 |只看该作者
  1. #获取美女图片的四个分类链接
  2. def get_fen_lei_link(html):
  3.         patt='<a href="/mm/[^\s]+?/" >'
  4.         regex=re.compile(patt)
  5.         fen_lei_link=[]
  6.         temp_link=re.findall(regex,html)[0:4]
  7.         for link in temp_link:
  8.                 fen_lei_link.append('http://www.22mm.cc'+link.split('"')[1])
  9.         return fen_lei_link
复制代码
这里我获得的temp_link这个List长度是0 是怎么回事?

QQ截图20170704142043.jpg (74.25 KB, 下载次数: 727)

QQ截图20170704142043.jpg

回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

17#
发表于 2016-9-8 19:10:23 |只看该作者
pythonnm 发表于 2016-9-8 16:22
看了楼主的帖子,我不禁产生这样的疑问,是程序员都是老司机,还是老司机都是程序员 ...

不想做司机的厨师,不是好程序员
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

2

主题

0

好友

26

积分

新手上路

Rank: 1

16#
发表于 2016-9-8 16:22:09 |只看该作者
看了楼主的帖子,我不禁产生这样的疑问,是程序员都是老司机,还是老司机都是程序员
回复

使用道具 举报

0

主题

0

好友

24

积分

新手上路

Rank: 1

15#
发表于 2016-6-11 10:26:59 |只看该作者
小燕smile 发表于 2016-4-13 16:25
不清楚之前该网站的源代码怎么写的,但是目前该网站很多地方貌似做了改版,没有实际测试lz的代码,估计已经 ...

实测 还是可以用的现在
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

14#
发表于 2016-4-13 22:48:24 |只看该作者
小燕smile 发表于 2016-4-13 21:46
几点说明:
1.该爬虫只是爬取该网站展示区的几组图片,全站的?自己扩展一下,不想要那么多图片,故 ...

非常赞啊
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

1

好友

38

积分

新手上路

Rank: 1

13#
发表于 2016-4-13 21:46:29 |只看该作者
几点说明:
1.该爬虫只是爬取该网站展示区的几组图片,全站的?自己扩展一下,不想要那么多图片,故一开始就没那些写;
2.D:\\pics,代码没有主动判断D盘是否有pics目录,直接下载的,故需要你提前在D盘创建该目录,否则可能无法运行比较懒……;
3.基于py3.4 win7 pycharm4.5测试可用,其他未测试;
4.不论使用哪种编辑器运行,注意设置好encoding(包括代码本身和对网页内容的解码),否则对这种中文网站encode可能会报错;
5.这种爬虫具有时效性,万一网页改版(例如使用JavaScript)就会失效,需要再次修正方可使用;
最终效果:
代码如果执行无误,会在你的D盘pics下创建几个目录,并在目录内下载相应的图片……
回复

使用道具 举报

0

主题

1

好友

38

积分

新手上路

Rank: 1

12#
发表于 2016-4-13 21:37:36 |只看该作者
既然这样,给大家一个最新该网站爬虫:
  1. from bs4 import BeautifulSoup
  2. import urllib.request
  3. from collections import deque,defaultdict
  4. import re
  5. import os


  6. url='http://www.22mm.cc/'

  7. def get_page(url):
  8.     headers = {
  9.     'Connection': 'Keep-Alive',
  10.     'Accept': "image/png,image/*;q=0.8,*/*;q=0.5",
  11.     'Accept-Language': "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
  12.     'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0",
  13.     'Referer':"http://www.22mm.cc/"
  14.     }
  15.     req = urllib.request.Request(url, headers=headers)
  16.     response = urllib.request.urlopen(req)
  17.     responseutf8 = response.read().decode()
  18.     responsegbk = responseutf8.encode('gbk', 'ignore')
  19.     page = responsegbk.decode('gbk')
  20.     return page

  21. def get_first_link(page):
  22.     queue=deque()
  23.     filename=[]
  24.     baseurl='http://22mm.xiuna.com'
  25.     soup=BeautifulSoup(page)
  26.     pic=soup.find(id = 'recshowBox')
  27.     for child in pic.children:
  28.          queue.append(baseurl+child['href'])
  29.          filename.append(child['title'])
  30.     return filename,queue

  31. def get_all_links(filename, queue):
  32.     d=defaultdict(set)
  33.     n=0
  34.     while queue:
  35.         link2=[]
  36.         linkss=link2[:]
  37.         links=link2[:]
  38.         link1=link2[:]
  39.         baselink=queue.popleft()
  40.         pagecode=get_page(baselink)
  41.         soup=BeautifulSoup(pagecode)
  42.         link=soup.find(class_="pagelist")
  43.         for child in link.children:
  44.             try:
  45.                 linkss.append(child['href'])
  46.             except:
  47.                 continue
  48.         links=linkss[1:-1]
  49.         pattern=re.compile('http.*/')
  50.         addurl=re.findall(pattern,baselink)
  51.         link1=[addurl[0]+link for link in links]
  52.         '''for link in links:
  53.             link1.append(addurl[0]+link)
  54.             link1.append(baselink)'''
  55.         for value in link1:
  56.             d[filename[n]].add(value)
  57.         n+=1
  58.     return d

  59. def download_all_pic(d):
  60.     for key in d:
  61.         print("正在创建{}的目录".format(key))
  62.         path='D:\\pics\\'+key+'\\'
  63.         os.mkdir('%s'%path)
  64.         print(path)
  65.         print("开始下载{}的图集...".format(key))
  66.         index=1
  67.         for i in d[key]:
  68.             global index
  69.             page1=get_page(i)
  70.             pattern1=re.compile(r'arrayImg\[0\]="(http.*?jpg)')
  71.             addurl1=re.findall(pattern1,page1)
  72.             down=addurl1[-1].replace('big','pic')
  73.             print("正在下载%s的第%d张图片" % (key,index))
  74.             urllib.request.urlretrieve(down,'D:\\pics\%s\%d.jpg' % (key,index))
  75.             print("下载完成")
  76.             index+=1

  77. def start(url):
  78.     page=get_page(url)
  79.     filename, queue=get_first_link(page)
  80.     d=get_all_links(filename,queue)
  81.     download_all_pic(d)

  82. start(url)
复制代码
采用了bs4完成
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

11#
发表于 2016-4-13 21:13:23 |只看该作者
小燕smile 发表于 2016-4-13 16:25
不清楚之前该网站的源代码怎么写的,但是目前该网站很多地方貌似做了改版,没有实际测试lz的代码,估计已经 ...

爬虫程序都是要经常随源站进行调整的
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-25 00:14 , Processed in 0.018647 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部