什么是爬虫:
是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
采用python作为爬虫的优点:
大量第三方库,开发效率高,代码少,应用性广泛
网络爬虫的基本工作流程如下:
1.首先选取一部分精心挑选的种子URL;
2.将这些URL放入待抓取URL队列;
3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。
4.分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环。
urllib模块
介绍:
urllib模块提供的上层接口,使我们可以像读取本地文件一样读取www和ftp上的数据
实战例子
项目原理:打开网址-获取源码-找到图片-匹配下载
#coding=utf-8
'''
Created on 2017年1月28日
@author: gaojs
'''
import urllib,re,os
def getHtml():
page=urllib.urlopen('http://www.wmpic.me/meinv/').read()#打开网址并且读取
return page
x=0
def getimg(page):
imgre=re.compile(r' src="(.*?)" class=')
imglist=re.findall(imgre,page)
for imgurl in imglist:
# print imgurl
global x
if not os.path.exists('/Users/gaojs/Desktop/pic'):
print os.mkdir('/Users/gaojs/Desktop/pic/')
else:
urllib.urlretrieve(imgurl,'/Users/gaojs/Desktop/pic/'+'%s.jpg'%x)#下载图片到指定位置
x+=1
print u'正在下载第%s张'%x
l=getHtml()
getimg(l)
urllib2模块
urllib与urllib2区别
1.在python中,urllib和urllib2不可相互替代的。
2.整体来说,urllib2是urllib的增强,但是urllib中有urllib2中所没有的函数。
3.urllib2可以用urllib2.openurl中设置Request参数,来修改Header头。如果你访问一个网站,想更改User Agent(可以伪装你的浏览器),你就要用urllib2.
4.urllib支持设置编码的函数,urllib.urlencode,在模拟登陆的时候,经常要post编码之后的参数,所以要想不使用第三方库完成模拟登录,你就需要使用urllib。
5.urllib一般和urllib2一起搭配使用。
6.urllib2解决禁止爬虫,模拟浏览器,加上头部信息headers
实战例子
#coding=utf-8
'''
Created on 2017年1月19日
@author: gaojunsong
爬取百度小说
'''
import re,urllib2
class BDTB:
baseurl="http://tieba.baidu.com/p/4896490947?pn="
def getpage(self,pageNo):
url=self.baseurl+str(pageNo)
request=urllib2.Request(url)#构造对象
response=urllib2.urlopen(request).read()
return response
def gettitle(self,pageNo):
html=self.getpage(pageNo)
reg=re.compile(r'title="【原创】(.*?)"')
items=re.findall(reg,html)
for item in items:
with open('a.txt','w')as tp:
tp.write('标题'+'\t'+'<<'+item+'>>')
return items
def getcontent(self,pageNo):
html=self.getpage(pageNo)
reg=re.compile(r'class="d_post_content j_d_post_content "> (.*?)</div><br>',re.S)
rq=re.findall(reg,html)
for i in rq:
removea=re.compile('<a.*?>|</a>')
removeb=re.compile('<img.*?>')
removec=re.compile('http.*?.html')
i=re.sub(removea,'',i)
i=re.sub(removeb,'',i)
i=re.sub(removec,'',i)
i=i.replace('<br>','')
i=i.replace('嗯,这是第二次开小说贴,肯定有人看过,看过的可以再看一次','')
i=i.replace('随意镇','')
with open('a.txt','a')as tp:
tp.write('\n\n'+i)
return rq
l=BDTB()
for i in range(1,6):
print '正在读取第%s页小说'%i
l.getpage(i)
l.gettitle(i)
l.getcontent(i)
request模块
实战例子
对网址发送一个请求post/get,获取源码text和content
bsp模块
bsp全称:BeautifulSoup(优势:不需要写正则表达式)
介绍:
Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
实战例子
#例子:如何获取标签内容
#encoding=utf-8
from bs4 import BeautifulSoup
html='<title>welcome to gloryroad</title><div>join gloryroad soon<\div>'
soup=BeautifulSoup(html,'html.parser')#解析方式
print soup.div
print soup.title
#如何打开文件获取内容
新建html文件,写入内容‘欢迎同学加入光荣之路测试开发班级,跟吴老一起学习’
#encoding=utf-8
from bs4 import BeautifulSoup
soup=BeautifulSoup(open('a.html'),'html.parser')#解析方式
print soup.prettify()#打印本地文件内容,格式化打印内容
urllib urllib2 bsp综合案例
实战例子
#encoding=utf-8
'''
爬取豆瓣网,美臀图片,并且存在指定目录下
用到的知识点,urllib,urllib2,bsp,shutil,os
'''
import urllib,urllib2,os
from bs4 import BeautifulSoup
import sys
from pip.index import Link
import shutil
reload(sys)
sys.setdefaultencoding('utf-8')#输出的内容为utf-8格式
x=0
'''
判断目录是否存在,如果不存在则创建
如果存在,删除目录以及下面所有文件,避免重复下载
'''
if not os.path.exists('/Users/gaojs/Desktop/pigu'):
os.mkdir('/Users/gaojs/Desktop/pigu/')
else:
shutil.rmtree('/Users/gaojs/Desktop/pigu/')#shutil比os好在于可以删除不为空的目录
os.mkdir('/Users/gaojs/Desktop/pigu/')
def spider(url):
headers={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
req=urllib2.Request(url,headers=headers)
page=urllib2.urlopen(req,timeout=20).read()
soup=BeautifulSoup(page,'html.parser')#解析方式parser
my_girl=soup.find_all('img')
for girl in my_girl:
link=girl.get('src')
# print link
global x
urllib.urlretrieve(link,'/Users/gaojs/Desktop/pigu/'+'%s.jpg'%x)#下载图片到指定位置
x+=1
print u'正在下载第%s张'%x
for page in xrange(1,3):
page+=0
url='http://www.dbmeinv.com/dbgroup/show.htm?cid=6&pager_offset=%s'%page
print '第'+str(page)+'页'
spider(url)
spider(url)