python爬虫爬取图片代码(python爬虫获取图片)
如何入门 Python 爬虫
入门的话,我的经历:
1.先用python写一个爬取网页源代码的爬虫(最先是爬取个人博客,会遇到乱码问题当时困扰了很久)
2.后来写了爬取百度图片的程序,自动下载小说(我爱看小说-_-)(接触正则表达式)
3.然后百度图片他那种分页模式,一般一页只有20张左右的图片,分析源代码,完善爬取程序,不受到限制,一次可以下几千张(图片有的是原图,有的是缩略图)
4.后来发现程序卡顿,就添加了多线程。
5.然后模拟登陆一些不用验证码的网页(我学校的oj),cookie登陆B站(本来想写一个抢楼的脚本的,后来发现抢楼的被封号了-_-,就放弃了)
对于使用的库,python2 与 python3 有点不同,我学的是python3
先用的是urllib.request,后来用requests(第三方库),在后来接触Scrapy(也是第三方库)
现在因为事情多了,就把python放下了,准备寒假写一些脚本,毕竟python不会有期末考试...
我的个人经历,希望可以帮到你。
linux下python怎么写爬虫获取图片
跟linux有什么关系,python是跨平台的,爬取图片的代码如下:
import urllib.requestimport osimport randomdef url_open(url):
req=urllib.request.Request(url) ? ?#为请求设置user-agent,使得程序看起来更像一个人类
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0') ? ?#代理IP,使用户能以不同IP访问,从而防止被服务器发现
'''iplist=['1.193.162.123:8000','1.193.162.91:8000','1.193.163.32:8000']
proxy_support=urllib.request.ProxyHandler({'http':random.choice(iplist)})
opener=urllib.request.build_opener(proxy_support)
opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.154 Safari/537.36 LBBROWSER')]
urllib.request.install_opener(opener)'''
response=urllib.request.urlopen(req)
html=response.read() ? ?return htmldef get_page(url):
html=url_open(url).decode('utf-8')
a=html.find('current-comment-page')+23
b=html.find(']',a) ? ?#print(html[a:b])
return html[a:b]def find_imgs(url):
html=url_open(url).decode('utf-8')
img_addrs=[]
a=html.find('img src=') ? ?while a!=-1:
b=html.find('.jpg',a,a+140) ? ? ? ?if b!=-1: ? ? ? ? ? ?if html[a+9]!='h':
img_addrs.append('http:'+html[a+9:b+4]) ? ? ? ? ? ?else:
img_addrs.append(html[a+9:b+4]) ? ? ? ?else:
b=a+9
a=html.find('img src=',b) ? ?for each in img_addrs:
print(each+'我的打印') ? ?return img_addrsdef save_imgs(folder,img_addrs):
for each in img_addrs: ? ? ? ?#print('one was saved')
filename=each.split('/')[-1] ? ? ? ?with open(filename,'wb') as f:
img=url_open(each)
f.write(img)def download_mm(folder='ooxx',pages=10):
os.mkdir(folder)
os.chdir(folder)
url=""
page_num=int(get_page(url)) ? ?for i in range(pages):
page_num=page_num-1
page_url=url+'page-'+str(page_num)+'#comments'
img_addrs=find_imgs(page_url)
save_imgs(folder,img_addrs)if __name__=='__main__':
download_mm()1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
完成
运行结果
Python3.xx中写爬虫,下载图片除了urlretrieve方法,还有什么库的什么方法呢?
Part 1. urllib2
urllib2是Python标准库提供的与网络相关的库,是写爬虫最常用的一个库之一。
想要使用Python打开一个网址,最简单的操作即是:
your_url = ""html = urllib2.urlopen(your_url).read()12
这样所获得的就是对应网址(url)的html内容了。
但有的时候这么做还不够,因为目前很多的网站都有反爬虫机制,对于这么初级的代码,是很容易分辨出来的。例如本文所要下载图片的网站,上述代码会返回HTTPError: HTTP Error 403: Forbidden错误。
那么,在这种情况下,下载网络图片的爬虫(虽然只有几行代码,但一个也可以叫做爬虫了吧,笑),就需要进一步的伪装。
要让爬虫伪装成浏览器访问指定的网站的话,就需要加入消息头信息。所谓的消息头信息就是在浏览器向网络服务器发送请求时一并发送的请求头(Request Headers)信息和服务器返回的响应头(Response Headers)信息。
例如,使用FireFox打开时所发送的Request Headers的部分内容如下:
Host:"publicdomainarchive.com/"User-Agent:"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0"Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"...1234
还有一些其他属性,但其中伪装成浏览器最重要的部分已经列出来了,即User-Agent信息。
要使用Headers信息,就不能再仅仅向urlopen方法中传入一个地址了,而是需要将HTTP Request的Headers封装后传入:
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}req = urllib2.Request(url = url, headers = headers)content = urllib2.urlopen(req).read()123
这样,就获得了网站的html内容。
接下来,就需要从html去获取图片的链接。
Part 2. HTMLParser
HTMLParser是Python提供的HTML解析库之一。
但Python提供的这个类中很多方法都没有实现,因而基本上这个库只负责进行解析,但解析完了什么都不做。所以如果需要对HTML中的某些元素进行加工的话,就需要用户自己去实现其中的一些方法。本文仅实现其中的handle_starttag方法:
class MyHTMLParser(HTMLParser): #继承HTMLParser类
def __init__(self): #初始化
HTMLParser.__init__(self) def handle_starttag(self, tag, attrs):
#参数tag即由HTMLParser解析出的开始标签,attrs为该标签的属性
if tag == "img": #下载图片所需要的img标签
if len(attrs) == 0: pass
else: for (variable, value) in attrs: #在attrs中找到src属性,并确定其是我们所要下载的图片,最后将图片下载下来(这个方法当然也有其他的写法)
if variable == "src" and value[0:4] == 'http' and value.find('x') = 0:
pic_name = value.split('/')[-1] print pic_name
down_image(value, pic_name)123456789101112131415
Part 3. 下载图片
从handle_starttag方法中,我们已经获得了图片的url,那么,最后一步,我们要下载图片了。
当然,要获得网络上的图片,自然也需要向服务器发送请求,一样需要用到urllib2这个库,也需要用到上面所用到的请求头。
以下是down_image()方法的主要代码:
binary_data = urllib2.urlopen(req).read()
temp_file = open(file_name, 'wb')
temp_file.write(binary_data)
temp_file.close()1234
因为这次打开的网址是个图片,所以urllib2.urlopen(req).read()所获取的就是图片的数据,将这些数据需要以二进制的方式写入本地的图片文件,即将图片下载下来了。
因为图片的url的最后一部分是图片的名字,所以可以直接用做本地的文件名,不用担心命名冲突,也不用担心后缀不符,很是方便。
Part 4. getFreeImages.py
这个下载图片的脚本的完整代码如下:
import urllib2,osfrom HTMLParser import HTMLParser
class MyHTMLParser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self) #self.links = {}
def handle_starttag(self, tag, attrs):
#print "Encountered the beginning of a %s tag" % tag
if tag == "img": if len(attrs) == 0: pass
else: for (variable, value) in attrs: if variable == "src" and value[0:4] == 'http' and value.find('x') = 0:
pic_name = value.split('/')[-1] print pic_name
down_image(value, pic_name)def down_image(url,file_name):
global headers
req = urllib2.Request(url = url, headers = headers)
binary_data = urllib2.urlopen(req).read()
temp_file = open(file_name, 'wb')
temp_file.write(binary_data)
temp_file.close()if __name__ == "__main__":
img_dir = "D:\\Downloads\\domain images"
if not os.path.isdir(img_dir):
os.mkdir(img_dir)
os.chdir(img_dir) print os.getcwd()
url = ""
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
all_links = []
hp = MyHTMLParser() for i in range(1,30):
url = '' + str(i) + '/'
req = urllib2.Request(url = url, headers = headers)
content = urllib2.urlopen(req).read()
hp.feed(content)
hp.close()1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
如何用Python做爬虫?
在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材。
我们最常规的做法就是通过鼠标右键,选择另存为。但有些图片鼠标右键的时候并没有另存为选项,还有办法就通过就是通过截图工具截取下来,但这样就降低图片的清晰度。好吧其实你很厉害的,右键查看页面源代码。
我们可以通过python?来实现这样一个简单的爬虫功能,把我们想要的代码爬取到本地。下面就看看如何使用python来实现这样一个功能。
具体步骤
获取整个页面数据首先我们可以先获取要下载图片的整个页面信息。
getjpg.py
#coding=utf-8import urllibdef getHtml(url):
page = urllib.urlopen(url)
html = page.read() ? ?return html
html = getHtml("")print html
Urllib?模块提供了读取web页面数据的接口,我们可以像读取本地文件一样读取www和ftp上的数据。首先,我们定义了一个getHtml()函数:
urllib.urlopen()方法用于打开一个URL地址。
read()方法用于读取URL上的数据,向getHtml()函数传递一个网址,并把整个页面下载下来。执行程序就会把整个网页打印输出。
2.筛选页面中想要的数据
Python?提供了非常强大的正则表达式,我们需要先要了解一点python?正则表达式的知识才行。
假如我们百度贴吧找到了几张漂亮的壁纸,通过到前段查看工具。找到了图片的地址,如:src=””pic_ext=”jpeg”
修改代码如下:
import reimport urllibdef getHtml(url):
page = urllib.urlopen(url)
html = page.read() ? ?return htmldef getImg(html):
reg = r'src="(.+?\.jpg)" pic_ext'
imgre = re.compile(reg)
imglist = re.findall(imgre,html) ? ?return imglist ? ? ?
html = getHtml("")print getImg(html)
我们又创建了getImg()函数,用于在获取的整个页面中筛选需要的图片连接。re模块主要包含了正则表达式:
re.compile()?可以把正则表达式编译成一个正则表达式对象.
re.findall()?方法读取html?中包含?imgre(正则表达式)的数据。
运行脚本将得到整个页面中包含图片的URL地址。
3.将页面筛选的数据保存到本地
把筛选的图片地址通过for循环遍历并保存到本地,代码如下:
#coding=utf-8import urllibimport redef getHtml(url):
page = urllib.urlopen(url)
html = page.read() ? ?return htmldef getImg(html):
reg = r'src="(.+?\.jpg)" pic_ext'
imgre = re.compile(reg)
imglist = re.findall(imgre,html)
x = 0 ? ?for imgurl in imglist:
urllib.urlretrieve(imgurl,'%s.jpg' % x)
x+=1html = getHtml("")print getImg(html)
这里的核心是用到了urllib.urlretrieve()方法,直接将远程数据下载到本地。
通过一个for循环对获取的图片连接进行遍历,为了使图片的文件名看上去更规范,对其进行重命名,命名规则通过x变量加1。保存的位置默认为程序的存放目录。
程序运行完成,将在目录下看到下载到本地的文件。
Python如何爬取百度图片?
几乎所有的网站都会有反爬机制,这就需要在爬取网页时携带一些特殊参数,比如:user-agent、Cookie等等,可以在写代码的时候用工具将所有参数都带上。