Python爬虫——针对某榴社区的图片爬取V0.1
2014-06-28 03:37
162 查看
相信很多同学学习Python都是被Python的爬虫所吸引,不得不说Python写爬虫是十分方便的,因为urllib库和其他的一些插件的存在,本来需要很麻烦的事Python只要几行代码就可以搞定。在这里再次推荐BeautifulSoup这个插件,对于HTML和XML的解析十分强大,基本省去了我们写正则表达式的步骤,可以参考我的上一篇文章。
简单叙述一下这个爬虫,这个小爬虫是我想对这几天学习Python做一个小小的练习和总结,其中涉及到了文件操作、Python的数据类型、基本语法、控制流程以及一些库的使用。对于初学Python的同学还是有一些参考意义的,掌握了这个程序,相信去爬百度贴吧之类的文字信息完全不在话下了。对这个程序的设想是,能够根据某榴社区的网址将其图片区的帖子中的图片抽取出来,按照标题组织文件夹下载到本地。有两个主要的步骤,一是把图片版块的页面上的帖子的标题和路径抓下来。二是根据取得的路径再把每个帖子中的有效图片抽取出来,存在本地。第一版程序比较粗糙,爬虫的性能不是很好,功能也较为单一,有时间再改一下。
先把完整代码发上来:
在Python3中,urllib、urllib2等库合并成为urllib。我们需要用到其中的request模块。详细的信息可以参考相关文档。
urllib.request.urlopen(url_str)这个函数返回一个句柄,我们调用它的read()方法,返回的是HTML代码的bytes对象。我们要对其进行解析的话先转换成str类型,可以调用bytes对象的decode()方法,因为网页使用gbk编码,我们就使用gbk来解码为str。
我们的自定义函数get_urldict()返回一个字典,key是帖子标题,value是url相对路径,这样我们就可以方便的进行遍历去逐个处理。
这个爬虫主要还是对BeautifulSoup的运用,大家可以看到,如果用正则去处理这些是个什么工作量,现在用插件轻松就搞定了。聪明人不会重复造轮子的。详细的用法请访问官网看它的中文文档。
在下载图片的时候,我们使用了模拟用户浏览器访问的方式,在Header里面添加用户信息,用这个带有特殊头文件的request去请求数据。否则对于某榴社区是无法打开的,应该是网站做了相关屏蔽,不允许这样访问。
在写到本地时,要使用‘wb’模式,因为写的是二进制文件,如果直接使用w模式是不行的。
其他的部分没什么好说的,有兴趣的绅♂士欢迎跟我交流。
简单叙述一下这个爬虫,这个小爬虫是我想对这几天学习Python做一个小小的练习和总结,其中涉及到了文件操作、Python的数据类型、基本语法、控制流程以及一些库的使用。对于初学Python的同学还是有一些参考意义的,掌握了这个程序,相信去爬百度贴吧之类的文字信息完全不在话下了。对这个程序的设想是,能够根据某榴社区的网址将其图片区的帖子中的图片抽取出来,按照标题组织文件夹下载到本地。有两个主要的步骤,一是把图片版块的页面上的帖子的标题和路径抓下来。二是根据取得的路径再把每个帖子中的有效图片抽取出来,存在本地。第一版程序比较粗糙,爬虫的性能不是很好,功能也较为单一,有时间再改一下。
先把完整代码发上来:
#author='ACE_J' #version=0.1 '我的爬虫,自动下载图片到本地' import os import re import urllib.request import socket from bs4 import BeautifulSoup #设置超时时间,单位秒 timeout = 3 socket.setdefaulttimeout(timeout) #从主题列表页面提取标题和URL,返回一个字典 def get_urldict(url_str): html_str=urllib.request.urlopen(url_str).read().decode('gbk')#urlopen这个方法返回的是bytes对象,需要解码为str soup=BeautifulSoup(html_str,from_encoding='gbk')#传入一个字符串或者文件句柄初始化靓汤 url_dict={} for tr in soup.find_all('tr'):#find_all方法返回一个迭代器 if tr.h3!=None: url_dict[tr.h3.a.string]=tr.h3.a['href'] return url_dict #下载指定URL中的图片到指定路径,以帖子标题为文件夹名组织结构 def download_img(url_str,path_str): if not os.path.isdir(path_str): os.mkdir(path_str) html_str=urllib.request.urlopen(url_str).read().decode("gbk") soup=BeautifulSoup(html_str) div=soup.select('.tpc_content')#div是一个列表 count=0 for img in div[0].descendants:#取出列表中第一个div,也就是我们要的。descendants会返回这个div的所有子孙节点。 if img.name=='input':#根据Tag的名称定位 count+=1 print('正在下载第%d张图片'%count) img_file=open(path_str+'/'+'%s.jpg'%count,'wb') headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'} req = urllib.request.Request(url=img['src'], headers=headers)#对于含有属性的Tag,采用字典方式访问属性 img_bytes=urllib.request.urlopen(req).read() img_file.write(img_bytes) img_file.close() print('该主题下载完成') url_str=r'http://*********' path_str=r'E:/2/' url_dict=get_urldict(url_str) count=0 for title in url_dict.keys(): count+=1 print('开始下载第%d个主题'%count) download_img(r'http://**********/'+url_dict[title],path_str+title)
在Python3中,urllib、urllib2等库合并成为urllib。我们需要用到其中的request模块。详细的信息可以参考相关文档。
urllib.request.urlopen(url_str)这个函数返回一个句柄,我们调用它的read()方法,返回的是HTML代码的bytes对象。我们要对其进行解析的话先转换成str类型,可以调用bytes对象的decode()方法,因为网页使用gbk编码,我们就使用gbk来解码为str。
我们的自定义函数get_urldict()返回一个字典,key是帖子标题,value是url相对路径,这样我们就可以方便的进行遍历去逐个处理。
这个爬虫主要还是对BeautifulSoup的运用,大家可以看到,如果用正则去处理这些是个什么工作量,现在用插件轻松就搞定了。聪明人不会重复造轮子的。详细的用法请访问官网看它的中文文档。
在下载图片的时候,我们使用了模拟用户浏览器访问的方式,在Header里面添加用户信息,用这个带有特殊头文件的request去请求数据。否则对于某榴社区是无法打开的,应该是网站做了相关屏蔽,不允许这样访问。
在写到本地时,要使用‘wb’模式,因为写的是二进制文件,如果直接使用w模式是不行的。
其他的部分没什么好说的,有兴趣的绅♂士欢迎跟我交流。
相关文章推荐
- python多线程图片爬虫
- 写个图片爬虫,scrapy,python第一次接触(停止更新)
- python抓取网页图片 python爬虫实例
- python 百度贴吧爬虫(下载图片)
- python第一弹 爬虫淘女郎图片
- 用python做爬虫爬图片。
- python shell 爬虫 妹子图片
- python多线程图片爬虫
- python实现虎扑网站图片爬虫
- 简单的Python抓taobao图片爬虫
- python 网页爬虫+保存图片+多线程+网络代理
- python中使用网络爬虫下载图片
- python简易爬虫来实现自动图片下载
- python 3.x网络爬虫 下载图片
- Python爬虫抓取网页图片
- python爬虫抓取图片
- python 网页爬虫+保存图片+多线程+网络代理
- python 3.3 爬虫之爬取图片
- python爬虫入门教程之糗百图片爬虫代码分享
- 简单的Python抓taobao图片爬虫