爬蟲一:爬取信息


-------------------------------------------
--------------爬蟲的思路-------------------
-------------------------------------------
先判斷網頁是否允許爬蟲
(1)get_html()獲取源碼
  1、不允許就加上headers頭部信息,模擬用戶訪問
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36'}
  2、請求進入網頁
    request = urllib2.Rwquest(url,headers = headers)
  3、打開網頁
    response = urllib2.urlopen(request)
  4、獲取源碼
    text = response.read()

(2)get_Url()獲取標題或者內容
  1、進入網頁尋找網頁中我們尋找的內容部分
  2、找到標題或者內容那一部分,通過正則表達式匹配該部分
    pattern = re.compile('<a href="/story/(.*?)"',re.S)# re.S匹配換行符
  3、在整個網頁中匹配這個內容
    items = re.findall(pattern,html)
  4、打印出來
    urls = []#多個頁面,把每個頁面的編碼放到list中
    for item in items:
    urls.append('http://daily.zhihu.com/story/'+item)
    #print urls[-1] #切片
    return urls
  5、調用顯示

(3)多頁的顯示
  1、看每頁的網址的區別,一般是在后面加上+str(page)
  2、然后分別調用每頁的內容

(4)把獲取的內容寫到文件中保存
  items = pattern.compile(patten,html)
  with open('test.txt','w') as test:
  for item in items:
  test.write(item)#往文件中寫內容
  test.write("\n")#換行

 

我們如果想爬取一個網頁,那么就需要打開網頁獲取網頁的源碼,一般使用谷歌和火狐稍微好點,現在教你們怎樣獲取網頁源碼:

1、打開網頁,在網頁空白處右擊選擇查看網頁源代碼;

2、進入源代碼查找你需要用到的信息,復制下來,然后用正則匹配下來,我們有個懶惰匹配(.*?)就是代表你要獲取的內容,不需要可以用.*?代替,很長的數字可以用\d+代替等等,具體的正則表達式看我之前的帖子http://www.cnblogs.com/zhangjiansheng/p/6853729.html,里面有詳細描述。

比如下面這個例子:

    <tr><td>1</td><td>989584027708</td><td>(香港地區)National_Bank_Abu_Dhabi</td><td>00852-341343660</td><td>18/F_Nine_Queens_Road_Central</td></tr>

 <tr><td>\d+</td><td>\d+</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td></tr>

以上只是爬取沒有反爬機制的網頁。

下面是用正則與urllib編寫的一個爬蟲,用來爬取http://furhr.com/,把所有的銀行名稱,聯系電話,銀行地址爬取下來,並把爬取到的內容放到Excel表格內,具體程序如下所示:

# -*- coding:utf-8 -*-
__author__ = 'Demon'

import xlwt#excel表格函數
import urllib,re

def getdata():
    url_list = []
    for i in range(1,100):
        url = 'http://furhr.com/?page={}'.format(i)#多頁調用
        #print url
        try:#錯誤處理
            html = urllib.urlopen(url).read()#打開網頁獲取源碼
            #print html
        except Exception as e:
            print e
            continue
        #正則表達式 獲取想要獲取的內容
        page_list = re.findall(r"<tr><td>\d+</td><td>\d+</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td></tr>",html)
        #print page_list
        url_list.append(page_list)#把匹配到的內容放到list里面
    return url_list

def excel_write():
    newTable = 'test.xls'#新建一個excel表格並命名
    wb = xlwt.Workbook(encoding='utf-8')#申明表格編碼格式
    ws = wb.add_sheet('test1')#增加表格單元
    headData = ['公司名稱','電話','地址']#寫表頭
    for colnum in range(0,3):
        ws.write(0,colnum,headData[colnum],xlwt.easyxf('font: bold on'))
        #把表頭寫在第0行,0,1,2這三列,並把字體設置為加粗
    index = 1
    for item in items:#把數據寫到表格里面
        for j in range(0,len(item)):
           for i in range(0,3):
#               print item[j]
               print item[j][i]
               ws.write(index,i,item[j][i])
           index +=1
    wb.save(newTable)

if __name__ == "__main__":#判斷函數入口
    items = getdata()#調用網頁源碼獲取函數
    excel_write()#調取Excel函數,把數據放在Excel中

爬取的結果如下圖所示:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM