Python 基础爬虫简介(测试环境为 Python 2.7)
2017-02-11 21:56
579 查看
1、什么是爬虫?
爬虫是一种自动访问互联网,并提取数据的一个程序。归根结底,所谓爬虫,不过是我们用Python语言编写的一个小程序而已。 针对的问题:有些网页需要我们登陆后才能访问,而有些网页则不需要。动态登陆页面由Ajax异步加载实现,往往针对此类页面的抓取较为复杂。本例只是针对于一些不需要登录的静态网页的抓取。
2、实现一个简单的爬虫,需要以下几个方面:
(1)、 爬虫的调度端:用来启动爬虫、终止爬虫或监视爬虫的运行情况。(2)、 URL管理器:来对将要爬取的URL和已经爬取过的URL进行管理。从URL管理器中我们可以取得一个待爬取的URL将其传送给网页下载器。
(3)、 网页下载器:将指定的URL下载下来,存储为一个本地文件或字符串。这个字符串或本地文件(其实还是一个字符串)将会被传送给网页解析器进行解析。
(4)、 网页解析器:网页解析器能解析出网页中有价值的数据信息,并且每一个网页中又包含了许多指向其他网页的URL,这些URL被解析出后,可以补充到我们的URL管理器中。
URL管理器、网页下载器和网页解析器形成一个循环,只有有相关联的URL存在,便可以一直运行下去。
这个简单的爬虫程序的运行过程是怎样的呢,我们可以简单的看一下。
这里用的是慕课网上一个老师的演示文档。
Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间。
Soup.find(参数1,参数2,参数3)方法。
Soup.findAll(参数1,参数2,参数3)方法。
两者的参数是一样的,find方法,只会搜索出满足第一个要求的节点,findAll方法会搜索出所有满足要求的节点。搜索到节点之后,我们就可以访问节点的名称、属性和文字。
我们在搜索时,我们可以通过节点的名称进行搜索,也可以通过节点的属性和文字进行搜索。
================================================================
urllib和urllib2。
urllib可以用来提供了urllib.urlretrieve(url,path,callBackFunc)方法,可以将远程服务器上的资源下载到本地。
urllib2可以用来接受Request对象作为参数,从而可以控制HTTP Request的header部。但是有些功能模块却是只有urllib独有,所有我们经常可以看到urllib与urllib2共存在一个项目中。
本例中,所有的代码均为个人纯手打,如有雷同,纯属巧合。先附上一张程序运行的效果图。(不能超过2M,真恼人!)
详细代码如下:
# -*- coding: cp936 -*- from bs4 import BeautifulSoup # 网页解析 import urllib # 资源下载 import urllib2 # 网页读取 import re # 正则匹配所需要 import os # 系统库 import time # 时间库 i = 0 # 表示下载的时第几张图片 def getHtml(url): # headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0)Gecko/20100101 Firefox/23.0'} #伪造HTTP报头 # 针对很多网站,为了防止爬虫,会拒绝爬虫请求,这时候就需要我们去伪造http中的Header项了 # Header不会写的可以上网上找一个,一般是可以用的 send_headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.2; rv:16.0) Gecko/20100101 Firefox/16.0', 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Connection':'keep-alive' } urls = urllib2.Request(url,headers=send_headers) html = urllib2.urlopen(urls) # urllib.urlopen实际上返回一个类似文件的对象 if html.getcode() == 200: print ("已捕获"),url,"目标站数据..." return html else: print ("访问出现错误...错误代码:"),html.getcode() return None def callBackFunc(block_Num,block_Size,total_Size): """ 回调函数 @block_Num: 已经下载的数据块 @block_Size: 数据块的大小 @total_Size: 远程文件的大小 """ download_Percent = 100.0 * block_Num * block_Size / total_Size if download_Percent > 100: download_Percent = 100 print "正在下载第",i,"张图片,已下载 %",download_Percent if __name__ == '__main__': # 主函数 # 先将所有的目录创建,与此同时保存她们的URL指向 # 入口URL:https://www.mmonly.cc/gqbz/fjbz/ #唯一图库之风景壁纸 # 目录URL格式:(https://www.mmonly.cc/gqbz/fjbz/129331.html) # https://www.mmonly.cc/gqbz/fjbz/129268.html """<a target="_blank" href="https://www.mmonly.cc/gqbz/fjbz/129331.html"> <img width="234" alt="风景桌面壁纸高清电脑图片" src="https://t1.mmonly.cc/uploads/tu/201612/23/25.png" original="https://t1.mmonly.cc/uploads/tu/201612/23/25.png"> </a> """ gate_URL = "https://www.mmonly.cc/gqbz/fjbz/" # 入口URL html = getHtml(gate_URL) # 获得目标网页 html_Doc = html.read() if html != None: """https://www.zhihu.com/question/19696249 ----知乎 如何解决用 Beautiful Soup 抓取网页却得到乱码的问题? """ soupHtml = BeautifulSoup(html_Doc,"lxml",from_encoding = "gb18030") #解析html,返回html的解析对象,编码问题,卧槽!!! # <div class="item_list infinite be72 _scroll masonry" id="infinite_scroll"> # <img width="234" alt="电脑桌面壁纸高清风景图片" src="https://t1.mmonly.cc/uploads/tu/201612/47/47.png" # original="https://t1.mmonly.cc/uploads/tu/201612/47/47.png"> divs = soupHtml.findAll('div', class_="ABox") flag = 1 for div in divs: #找到所有的div标签后 div_Doc = str(div) soupDiv = BeautifulSoup(div_Doc,"lxml",from_encoding = "gb18030") if soupDiv.find('img') != None: # 从中筛选出我们需要的数据信息 tag_img = soupDiv.find('img') #filename = tag_img['alt'] # 指定文件夹名称,乱码问题,真心难倒我啦,,,,换个名字吧 filename = "Background"+str(time.time()) tag_a = soupDiv.find('a') img_direction_url = tag_a['href'] os.mkdir(filename) # 创建目录 print "已创建目录" print filename print "开始下载资源..." img_Html = getHtml(img_direction_url) # 进入图片目录下 img_Doc = img_Html.read() #<li id="nl"><a href="130130_3.html">下一页</a></li> while True: i = i + 1 soup_Img_Doc = BeautifulSoup(img_Doc,"lxml",from_encoding = "gb18030") #<li class="pic-down h-pic-down"><a target="_blank" class="down-btn" #href="https://t1.mmonly.cc/uploads/tu/201612/47/1-160320194503.jpg">查看原图</a></li> download_btn = soup_Img_Doc.find('a',class_="down-btn") img_url = download_btn['href'] print "需要下载的图片URL",img_url _path_ = os.path.abspath(filename) # 指定创建的文件夹路径 path = os.path.join(_path_,img_url[-6:]) # 图片的完整路径 urllib.urlretrieve(img_url,path,callBackFunc) if i == 3: # 如过下载完毕,就返回 break else: #https://www.mmonly.cc/gqbz/fjbz/130130.html img_Tag_a = soup_Img_Doc.find('a',href=re.compile(r"\d_?.html")) #print "img_Tag_a的内容:",img_Tag_a #print "img_Tag_a的href属性值为: ",img_Tag_a['href'] img_direction_url = "https://www.mmonly.cc/gqbz/fjbz/"+img_Tag_a['href'] img_Html = getHtml(img_direction_url) img_Doc = img_Html.read() i = 0 else: print ("获取失败...")
我指出这里的几个问题:
首先,我爬取的这个网页是唯1图库-风景壁纸 大家在使用时一定要注意网页的编码格式,python 2.7对中文的支持实在让我很难受,可能时这个例子不是很好的原因就在于这个网址是用gb2312编码的。
其次就是我只是爬取了部分资源,因为全部下载的话,时间太久了,这个项目只是给大家入个门,了解一下python爬虫的基本概念久很成功啦。
最后就是我附上的源码只要运行后,就可以将网页上的图片下载到该python程序所在的目录下。可能之后大家用的时候发现不好使了,那是因为网站维护者变更了某些元素、标签什么的,到时候我门需要对应的修改下代码,才能更好的工作。
再再说一句,为了简化代码,我将代码中的各种判断异常的语句都去掉了,大家一定要注意啊,特别是创建目录的时候,如果目录已经存在,程序运行就会出错的,所以大家用的时候,只需要添加上相应的判断语句就好啦。
相关文章推荐
- Python 基础爬虫简介(测试环境为 Python 2.7)
- Anaconda还可以在python3.5的基础上创建一个新的独立的python2.7的环境
- Wiki——Windows下python2.7 爬虫框架Scrapy环境配置
- Python2.7环境Flask框架安装简明教程【已测试】
- 安装python2.7做django基础环境时遇到的问题
- Python [4] Django的安装和基础运行环境简介
- Python学习 第一天任务 (三:Python不止基础学习 继续安装爬虫环境的配置)
- python2.7+selenium测试环境搭建
- 零基础自学用Python 3开发网络爬虫(二): 用到的数据结构简介以及爬虫Ver1.0 alpha
- python2.7 环境 爬虫第一次体验
- 零基础自学用Python 3开发网络爬虫(二): 用到的数据结构简介以及爬虫Ver1.0 alpha
- 【修正版】Python基础学习(一)——安装与配置python2.7.x环境(linux)
- Python基础爬虫实战实例----爬取1000个Python百度百科词条及相关词条的标题和简介
- 基于WIN7(64位)的PyCharm + OpenCV3 + Python2.7 环境构建及测试
- python2.7入门---简介&基础语法
- Python基础教程(一):简介、环境搭建、中文编码
- windows 搭建 selenium + python2.7 自动化测试环境
- 搭建基于virtualenv的python 2.7开发环境 - python
- Python窗口开发环境boa-constructor安装简介与简单入门
- Selenium Webdriver Python 测试环境搭建