python爬⾍实验——爬取⽹页图⽚+⽹页源代码
爬⾍图⽚
本实验将利⽤python程序抓取⽹络图⽚,完成可以批量下载⼀个⽹站的照⽚。所谓⽹页抓取,就是把URL地址中指定的⽹络资源从⽹络流中读取出来,保存到本地。
原理
1、⽹络爬⾍
即Web Spider,⽹络蜘蛛是通过⽹页的链接地址来寻⽹页的。从⽹站某⼀个页⾯(通常是⾸页)开始,读取⽹页的内容,到在⽹页中的其它链接地址,然后通过这些链接地址寻下⼀个⽹页,这样⼀直循环下去,直到把这个⽹站所有的⽹页都抓取完为⽌。
⽹络爬⾍的基本操作是抓取⽹页。
2、浏览⽹页过程
抓取⽹页的过程其实和读者平时使⽤浏览器浏览⽹页的道理是⼀样的。打开⽹页的过程其实就是浏览器作为⼀个浏览的“客户端”,向服务器端发送了
⼀次请求,把服务器端的⽂件“抓”到本地,再进⾏解释、展现。浏览器的功能是将获取到的HTML代码进⾏解析,然后将原始的代码转变成我们直接看到的⽹站页⾯。
URL的格式由三部分组成:
①
第⼀部分是协议(或称为服务⽅式)。
②
第⼆部分是存有该资源的主机IP地址(有时也包括端⼝号)。
③
第三部分是主机资源的具体地址,如⽬录和⽂件名等。
第⼀部分和第⼆部分⽤“ /”符号隔开,
第⼆部分和第三部分⽤“/”符号隔开。
第⼀部分和第⼆部分是不可缺少的,第三部分有时可以省略。
爬⾍最主要的处理对象就是URL,它根据URL地址取得所需要的⽂件内容,然后对它
进⾏进⼀步的处理。
因此,准确地理解URL对理解⽹络爬⾍⾄关重要。
3、利⽤urllib2通过指定的URL抓取⽹页内容
在Python中,我们使⽤urllib2这个组件来抓取⽹页。
urllib2是Python的⼀个获取URLs(Uniform Resource Locators)的组件。
它以urlopen函数的形式提供了⼀个⾮常简单的接⼝。
4、HTTP的异常处理问题
当urlopen不能够处理⼀个response时,产⽣urlError。
不过通常的Python APIs异常如ValueError,TypeError等也会同时产⽣。
HTTPError是urlError的⼦类,通常在特定HTTP URLs中产⽣。
5、Timeout 设置(超时设置)
在Python2.6前,urllib2 的API 并没有暴露 Timeout 的设置,要设置
Timeout 值,只能更改 Socket 的全局Timeout 值。在 Python 2.6 以后,超时可以通过 urllib2.urlopen() 的 timeout 参数直接设置。项⽬架构
项⽬包含两个⽂件,pet_spider.py和main_file.py。其中pet_spider.py⽂件定义了类PetSpider,包含3个⽅法分别是get_html_content 下载⽹页源代码、get_urls获得⽹页图⽚urls、
download_images下载图⽚。main_file.py⽂件定义了主函数main,⽤于调⽤PetSpider类。
代码
根据给定的⽹址来获取⽹页详细信息,得到的html就是⽹页的源代码。
get_html_content函数主要功能是递归下载⽹页源代码。注意将byte类型转换成string类型,其中re.findall的含义是返回string中所有与pattern(正则表达式)相匹配的全部字串,返回形式为数组。
新建pet_spider.py。
⾸先实现获取⽹页源代码的函数:
#import libraries
import requests文科女生学什么专业就业前景好
import re
import os
#define class
class PetSpider():
def __init__(self, image_path, html_path, url_path):
self.image_path = image_path
self.html_path = html_path
self.url_path = url_path
#get webpages
def get_html_content(self, url, url_prefix):
r = (url, timeout=60)
page_content = r.content.decode('utf-8')
page_div = repile(r'<div class="page">(.*?)</div>', re.I|re.S|re.M).findall(page_content)
if page_div:
current_page = repile(r'<a class ="current" href="javascript:void\(0\);">(.*?)</a>',re.I|re.S|re.M).findall(page_div[0]) if current_page:
html_file_name ='%s/web_page_%s.txt'%(self.html_path, current_page[0])
print('downloading %s'%(html_file_name))
f =open(html_file_name,"wb")
f.t)
f.close()
else:
邮政储蓄银行个人网上银行print('current_page not fount')
next_url = repile(r'<a class="next" href="(.*?)">»</a>',re.I|re.S|re.M).findall(page_div[0])
if next_url:
next_url = url_prefix + next_url[0]
<_html_content(next_url, url_prefix)
else:
投资理财专业if current_page:
print('download over')
else:
print('next_url not found')
else:
print('page_div not found')
获取⽹页源代码后,从⽹页源代码中匹配过滤图⽚的urls,制作进度条,从⽂件中读出⽹页图⽚内容,最后将所有urls写⼊⽂件。继续向pet_spider.py⽂件中添加如下代码:
#get urls from webpages
def get_urls(self):
url_content =''
for _, _, file_list in os.walk(self.html_path):
pass
file_count =len(file_list)
counter =1
for i in file_list:
file_name ='%s/%s'%(self.html_path, i)
print('extracting urls from %s. %d/%d'%(file_name, counter, file_count))
f =open(file_name,"rb")
page_content = f.read().decode('utf-8')有品位的男人名字
f.close()
urls = repile(r'<img src="(.*?)" />',re.I|re.S|re.M).findall(page_content)
if urls:
for i in urls:
if i.find('alt')>=0:
continue
url_content += i
url_content +='\n'
else:
print('url not found')
counter +=1
#write urls into file
f =open('%'%(self.url_path),"wb")
f.write(bytes(url_content, encoding='utf8'))
f.close()
现将所有图⽚url过滤出来
将图⽚下载到本地,⾸先将urls字符串保存到列表中,遍历列表中的urls,将下载的图⽚保存在⽂件中。
继续向pet_spider.py⽂件中添加如下代码:
#download images
def download_images(self):
rows =open('%'%(self.url_path)).read().split("\n")
current_image_number =1
urls_count =len(rows)
for url in rows:
try:
#try to download the image
r = (url, timeout=60)
#save the image to disk
image_file ='%s/img_%d.jpg'%(self.image_path, current_image_number)
f =open(image_file,"wb")
f.t)
f.close()
print('download %s. %d/%d'%(image_file, current_image_number, urls_count)) current_image_number +=1
except:
print('%s has an exception. skip.'%(url))
主函数
新建main_file.py⽂件。代码如下:
import os
from pet_spider import PetSpider
if __name__ =='__main__':
url ='pet.lelezone/mao/'
url_prefix ='pet.lelezone'
image_path ='cats'
html_path ='html'
url_path ='url'
if not os.path.isdir(image_path):
os.makedirs(image_path)
if not os.path.isdir(url_path):
os.makedirs(html_path)
if not os.path.isdir(url_path):
os.makedirs(url_path)
pet_spider =PetSpider(image_path, html_path, url_path)
我的偶像作文print('Download webpages.')
_html_content(url,url_prefix)
print('Extract urls.')
_urls()
print('Download images')
pet_spider.download_images()
最后运⾏主函数爬取图⽚。
(可以直接运⾏。如果⽆法爬取,请检查缩进,如果出现链接时间过长,可以更换以下⽹络,或者尝试更换源。如果还有问题,可以考虑更换⼀台电脑运⾏)
>形容春天的句子唯美
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论