您的位置:首页 > 编程语言 > Python开发

Python爬虫——针对某榴社区的图片爬取V0.1

2014-06-28 03:37 162 查看
相信很多同学学习Python都是被Python的爬虫所吸引,不得不说Python写爬虫是十分方便的,因为urllib库和其他的一些插件的存在,本来需要很麻烦的事Python只要几行代码就可以搞定。在这里再次推荐BeautifulSoup这个插件,对于HTML和XML的解析十分强大,基本省去了我们写正则表达式的步骤,可以参考我的上一篇文章。

简单叙述一下这个爬虫,这个小爬虫是我想对这几天学习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模式是不行的。

其他的部分没什么好说的,有兴趣的绅♂士欢迎跟我交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息