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

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程序所在的目录下。可能之后大家用的时候发现不好使了,那是因为网站维护者变更了某些元素、标签什么的,到时候我门需要对应的修改下代码,才能更好的工作。

再再说一句,为了简化代码,我将代码中的各种判断异常的语句都去掉了,大家一定要注意啊,特别是创建目录的时候,如果目录已经存在,程序运行就会出错的,所以大家用的时候,只需要添加上相应的判断语句就好啦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息