什么是爬蟲:
是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。
采用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)
