前几天试了一下从百度贴吧爬取图片。
先贴上一段简陋的代码:
import re
import urllib.request
from urllib import request
def gethtml(url):
head={
"User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36"
}
req=request.Request(url,headers=head)
response=request.urlopen(req)
html=response.read()
html=html.decode('utf-8')
return html
def getimg(html):
imgre=re.compile('<img pic_type="0" class="BDE_Image" src="(.*?)"')
imglist=re.findall(imgre,html)
x=0
for imgurl in imglist:
try:
urllib.request.urlretrieve(imgurl,'%s.jpg'%x)
print("Success to download")
x+=1
except:
print("Fail")
return imglist
html=gethtml("http://tieba.baidu.com/p/2460150866")
getimg(html)
先看第一个函数getheml,这段代码看起来并不陌生,与之前那个爬取网页信息的爬虫代码十分类似,唯一不同的是多了个User Agent这个东西。下面来简单地讲讲它。之所以设置User Agent是因为有一些网站不喜欢被爬虫程序访问,所以会检测连接对象,如果是爬虫程序,也就是非人点击访问,它就会不让你继续访问,所以为了要让程序可以正常运行,需要隐藏自己的爬虫程序的身份。此时,我们就可以通过设置User Agent的来达到隐藏身份的目的,User Agent的中文名为用户代理,简称UA。
User Agent存放于Headers中,服务器就是通过查看Headers中的User Agent来判断是谁在访问。在Python中,如果不设置User Agent,程序将使用默认的参数,那么这个User Agent就会有Python的字样,如果服务器检查User Agent,那么没有设置User Agent的Python程序将无法正常访问网站。
贴一些网上找来的常用User Agent:
1.Android
Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
2.Firefox
Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0
Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0
3.Google Chrome
Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19
4.iOS
Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3
Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A101a Safari/419.3
再来说说UA的设置方法:
1.在创建Request对象的时候,填入headers参数(包含User Agent信息),这个headers参数要求为字典。
2.在创建Request对象的时候不添加headers参数,在创建完成之后,使用add_header()的方法,添加headers。
具体操作在这里:http://blog.csdn.net/c406495762/article/details/60137956
这时可以注意到获取网页信息就必须创建Request对象了,因为需要改变header参数。
好我们已经获取了网页的所有信息,而所需要的图片数据也隐藏其中,第二个函数getimg可以帮助我们筛选出来并保存。
正则表达式可以让我们按自己所想地去筛选需要的数据。具体讲解在这里:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143193331387014ccd1040c814dee8b2164bb4f064cff000
re.compile() 可以把正则表达式编译成一个正则表达式对象.
re.findall() 方法读取html 中包含 imgre(正则表达式)的数据。
于是我们将得到整个页面中包含图片的URL地址。
urllib.urlretrieve()方法,直接将远程数据下载到本地。
通过一个for循环对获取的图片连接进行遍历,为了使图片的文件名看上去更规范,对其进行重命名,命名规则通过x变量加1。保存的位置默认为程序的存放目录。
程序运行完成,将在目录下看到下载到本地的文件。
当然功能还是非常简陋的,可以再加入去重或下载到指定文件夹的功能:
http://blog.csdn.net/hurmishine/article/details/52749410