经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
Python爬小草1024图片,盖达尔的诱惑(urllib.request)
来源:cnblogs  作者:viczc  时间:2019/1/16 9:23:20  对本文有异议

项目说明:

Python版本:3.7.2

模块:urllib.request,re,os,ssl

目标地址:http://小草.com/

第二个爬虫项目,设备转移到了Mac上,Mac上的Pycharm有坑, 环境变量必须要配置好,解释器要选对,不然模块加载不出来

 项目实现: 

  1. #!/usr/bin/env python3
  2. # -*- coding:utf-8 -*-
  3. #__author__ = 'vic'
  4. ##导入模块
  5. import urllib.request,re,os

小草图片下载时后有ssl证书验证,我们全局跳过验证

  1. ssl._create_default_https_context = ssl._create_unverified_context

一、设置代理

小草服务器在海外,需要绕过GFW,代理软件选择的是ssX-NG,偏好设置查看监听地址 

  1. Path = '/Users/vic/Pictures/'
  2. ##设置代理,http和https都用的是http监听,也可以改为sock5
  3. proxy = urllib.request.ProxyHandler({'http':'http://127.0.0.1:1087/','https':'https://127.0.0.1:1087'})
  4. ##创建支持处理HTTP请求的opener对象
  5. opener = urllib.request.build_opener(proxy)
  6. ##安装代理到全局环境
  7. urllib.request.install_opener(opener)
  8. ##定义请求头,Upgrade-Insecure-Requests表示能够处理https
  9. header = {'Upgrade-Insecure-Requests':'1',"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15"}

二、获取源代码

  1. def getcontent(url):
  2. req = urllib.request.Request(url,headers = header)
  3. ##同requests一样,request转为response
  4. res = urllib.request.urlopen(req)
  5. content = res.read()
  6. ##内存及时关闭
  7. res.close()
  8. return content

三、获取列表链接

  1. ##链接最后为相应页码
  2. url = 'http://小草.com/thread0806.php?fid=16&search=&page='

分析文章链接,也就是http://小草.com/直接加上后缀即可,把所有颜色的链接全部扒下来

但是有个公告栏只在第一页有,所以我想到了在第一页把list切片

  1. def geturl_list(url,i):
  2. ##列表链接+页码
  3. article_url = url + str(i)
  4. ##转为字符串
  5. content = str(getcontent(article_url))
  6. ##创建正则模式对象,匹配全文链接
  7. pattern = re.compile(r'<a href="htm_data.{0,30}html" target="_blank" id="">.*?')
  8. ##取出所有匹配内容
  9. com_list = pattern.findall(content)
  10. ##如果是第一页,把公告栏链接切片
  11. if i == 1:
  12. com_list = com_list[7:]
  13. ##链接正则
  14. pattern_url = re.compile(r'a href="(.*?)"')
  15. ##取出所有链接后缀
  16. url_list = pattern_url.findall(str(com_list))
  17. return url_list

四、获取图集信息

先找标题 

这个简单,re直接找title就好了 

然后是图片地址,图片的后缀大多是JPG和少量的GIF,但是Python的格式好像太严格了?所以图片格式分别大小写 ,图床地址全是https协议的,最重要的是有大图片小图片链接,大图片下载是盗链,我解决不了,所以可以等差求奇数链接

  1. def getTitle_Imgurl(url):
  2. content = getcontent(url)
  3. ##内容转gbk
  4. string = content.decode('gbk', 'replace')
  5. #print(string)
  6. m = re.findall("<title>.*</title>", string)
  7. ##切片去掉标题两边的标签
  8. title = m[0][7:-35]
  9. ##图片地址匹配正则,gif文件太大,我只要jpg格式的
  10. pattern = re.compile(r'(https:[^\s]*?(JPG|jpg))')
  11. ##取出图片地址,返回tuple添加到list里,tuple结构为(网址,格式类型)
  12. Imgurl_list = pattern.findall(str(content))
  13. return title,Imgurl_list

五、下载函数

  1. rllib.request.urlretrieve()

下载也有坑,这个远程下载在PC上好像可以直接使用,但是在mac上单文件链接可以下载,但是放进程序了死活下不下来,而且还慢,所以还是选择传统的

  1. def downImg(url,path,count):
  2. try:
  3. req = urllib.request.Request(url, headers=header)
  4. res = urllib.request.urlopen(req)
  5. content = res.read()
  6. with open(path + '/' + str(count) + '.jpg', 'wb') as file:
  7. file.write(content)
  8. file.close()
  9. except:
  10. print('ERROR')

六、主函数

  1. def main():
  2. ##1到20页列表
  3. for i in range(1,20):
  4. ##第一页文章列表
  5. url_list = geturl_list(url,i)
  6. ##文章地址拼接,list从0开始
  7. for t in range(0,len(url_list) - 1):
  8. artical_url = 'http://小草.com/' + url_list[t]
  9. print(artical_url)
  10. ##取标题,图片地址list
  11. title, Imgurl_list = getTitle_Imgurl(artical_url)
  12. ##创建文件夹
  13. Img_Path = Path + title
  14. if not os.path.isdir(Img_Path):
  15. os.mkdir(Img_Path)
  16. ##循环图片地址,小图片和大图片通过取奇数解决,大图片下载会得到盗链
  17. for num in range(1,len(Imgurl_list) - 1,2):
  18. Imgurl = Imgurl_list[num][0]
  19. downImg(Imgurl,Img_Path,num)
  20. else:
  21. print('已下载跳过')

七、全部代码

  1. #!/usr/bin/env python3
  2. # -*- coding:utf-8 -*-
  3. #__author__ = 'vic'
  4. import urllib.request,re,os,ssl
  5. ssl._create_default_https_context = ssl._create_unverified_context
  6. url='http://小草.com/thread0806.php?fid=16&search=&page='
  7. Path = '/Users/vic/Pictures/'
  8. proxy = urllib.request.ProxyHandler({'http':'http://127.0.0.1:1087/','https':'https://127.0.0.1:1087'})
  9. opener = urllib.request.build_opener(proxy)
  10. urllib.request.install_opener(opener)
  11. header = {'Upgrade-Insecure-Requests':'1',"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15"}
  12. def getcontent(url):
  13. req = urllib.request.Request(url,headers = header)
  14. res = urllib.request.urlopen(req)
  15. content = res.read()#.decode('gbk','replace')
  16. res.close()
  17. return content
  18. def geturl_list(url,i):
  19. article_url = url + str(i)
  20. content = str(getcontent(article_url))
  21. pattern = re.compile(r'<a href="htm_data.{0,30}html" target="_blank" id="">.*?')
  22. com_list = pattern.findall(content)
  23. if i == 1:
  24. com_list = com_list[7:]
  25. pattern_url = re.compile(r'a href="(.*?)"')
  26. url_list = pattern_url.findall(str(com_list))
  27. return url_list
  28. def getTitle_Imgurl(url):
  29. content = getcontent(url)
  30. string = content.decode('gbk', 'replace')
  31. m = re.findall("<title>.*</title>", string)
  32. title = m[0][7:-35]
  33. pattern = re.compile(r'(https:[^\s]*?(JPG))')
  34. Imgurl_list = pattern.findall(str(content))
  35. return title,Imgurl_list
  36. def downImg(url,path,count):
  37. try:
  38. req = urllib.request.Request(url, headers=header)
  39. res = urllib.request.urlopen(req)
  40. content = res.read()
  41. with open(path + '/' + str(count) + '.jpg', 'wb') as file:
  42. file.write(content)
  43. file.close()
  44. except:
  45. print('ERROR')
  46. def main():
  47. for i in range(1,20):
  48. url_list = geturl_list(url,i)
  49. for t in range(0,len(url_list) - 1):
  50. artical_url = 'http://小草com/' + url_list[t]
  51. print(artical_url)
  52. title, Imgurl_list = getTitle_Imgurl(artical_url)
  53. Img_Path = Path + title
  54. if not os.path.isdir(Img_Path):
  55. os.mkdir(Img_Path)
  56. for num in range(1,len(Imgurl_list) - 1,2):
  57. Imgurl = Imgurl_list[num][0]
  58. downImg(Imgurl,Img_Path,num)
  59. else:
  60. print('已下载跳过')
  61. if __name__ == '__main__':
  62. if not os.path.isdir(Path):
  63. os.mkdir(Path)
  64. main()

八、项目成果 

文件名也是成等差了,有点尴尬,就这样吧。

最后总的来说爬虫,BeautifulSoup要比正则好用的多,requests也要比urllib.request简单,搞了一晚上,等两天再爬其他的

 

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

本站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号