Python寫爬蟲爬妹子

最近學完Python,寫了幾個爬蟲練練手,網上的教程有不少,可是有的已經不能爬了,主要是網站常常改,但是爬蟲仍是有通用的思路的,即下載數據、解析數據、保存數據。下面一一來說。
 

1.下載數據

首先打開要爬的網站,分析URL,每打開一個網頁看URL有什麼變化,有可能帶上上個網頁的某個數據,例如xxID之類,那麼咱們就須要在上一個頁面分析HTML,找到對應的數據。若是網頁源碼找不到,多是ajax異步加載,去xhr裏去找。
 

有的網站作了反爬的處理,能夠添加User-Agent :判斷瀏覽器html

self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
# 初始化 headers
self.headers = {'User-Agent': self.user_agent}

若是不行,在Chrome上按F12分析請求頭、請求體,看需不須要添加別的信息,例若有的網址添加了referer:記住當前網頁的來源,那麼咱們在請求的時候就能夠帶上。按Ctrl + Shift + C,能夠定位元素在HTML上的位置git

動態網頁

有一些網頁是動態網頁,咱們獲得網頁的時候,數據還沒請求到呢,固然什麼都提取不出來,用Python 解決這個問題只有兩種途徑:直接從JavaScript 代碼裏採集內容,或者用Python 的第三方庫運行JavaScript,直接採集你在瀏覽器裏看到的頁面。
 
1.找請求,看返回的內容,網頁的內容可能就在這裏。而後能夠複製請求,複雜的網址中,有些亂七八糟的能夠刪除,有意義的部分保留。切記刪除一小部分後先嚐試能不能打開網頁,若是成功再刪減,直到不能刪減。
 
2.Selenium:是一個強大的網絡數據採集工具(可是速度慢),其最初是爲網站自動化測試而開發的。近幾年,它還被普遍用於獲取精確的網站快照,由於它們能夠直接運行在瀏覽器上。Selenium 庫是一個在WebDriver 上調用的API。WebDriver 有點兒像能夠加載網站的瀏覽器,可是它也能夠像BeautifulSoup對象同樣用來查找頁面元素,與頁面上的元素進行交互(發送文本、點擊等),以及執行其餘動做來運行網絡爬蟲。
PhantomJS:是一個「無頭」(headless)瀏覽器。它會把網站加載到內存並執行頁面上的JavaScript,可是它不會向用戶展現網頁的圖形界面。把Selenium和PhantomJS 結合在一塊兒,就能夠運行一個很是強大的網絡爬蟲了,能夠處理cookie、JavaScript、header,以及任何你須要作的事情。
 
 

下載數據的模塊有urllib、urllib2及Requests

Requests相比其餘倆個的話,支持HTTP鏈接保持和鏈接池,支持使用cookie保持會話,支持文件上傳,支持自 動肯定響應內容的編碼,支持國際化的 URL 和 POST 數據自動編碼,並且api相對來講也簡單,可是requests直接使用不能異步調用,速度慢。
 html = requests.get(url, headers=headers)   #沒錯,就是這麼簡單

  

urllib2以我爬取淘寶的妹子例子來講明:  

user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
# 注意:form data請求參數
params = 'q&viewFlag=A&sortType=default&searchStyle=&searchRegion=city%3A&searchFansNum=&currentPage=1&pageSize=100'


def getHome():
    url = 'https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8'
    req = urllib2.Request(url, headers=headers)
    # decode(’utf - 8’)解碼   把其餘編碼轉換成unicode編碼
    # encode(’gbk’) 編碼  把unicode編碼轉換成其餘編碼
    # 」gbk」.decode(’gbk’).encode(’utf - 8')
    # unicode = 中文
    # gbk = 英文
    # utf - 8 = 日文
    # 英文一 > 中文一 > 日文,unicode至關於轉化器
    html = urllib2.urlopen(req, data=params).read().decode('gbk').encode('utf-8')
    # json轉對象
    peoples = json.loads(html)
    for i in peoples['data']['searchDOList']:
        #去下一個頁面獲取數據
        getUseInfo(i['userId'], i['realName'])

  

 

2.解析數據

解析數據也有不少方式,我只看了beautifulsoup和正則,這個例子是用正則來解析的
def getUseInfo(userId, realName):
    url = 'https://mm.taobao.com/self/aiShow.htm?userId=' + str(userId)
    req = urllib2.Request(url)
    html = urllib2.urlopen(req).read().decode('gbk').encode('utf-8')

    pattern = re.compile('<img.*?src=(.*?)/>', re.S)
    items = re.findall(pattern, html)
    x = 0
    for item in items:
        if re.match(r'.*(.jpg")$', item.strip()):
            tt = 'http:' + re.split('"', item.strip())[1]
            down_image(tt, x, realName)
            x = x + 1
    print('下載完畢')

  

正則表達式說明github

match:匹配string 開頭,成功返回Match object, 失敗返回None,只匹配一個。
search:在string中進行搜索,成功返回Match object, 失敗返回None, 只匹配一個。
findall:在string中查找全部 匹配成功的組, 即用括號括起來的部分。返回list對象,每一個list item是由每一個匹配的全部組組成的list。
1).*? 是一個固定的搭配,.和*表明能夠匹配任意無限多個字符,加上?表示使用非貪婪模式進行匹配,也就是咱們會盡量短地作匹配
2)(.*?)表明一個分組,若是有5個(.*?)就說明匹配了五個分組
3) 正則表達式中,「.」的做用是匹配除「\n」之外的任何字符,也就是說,它是在一行中進行匹配。這裏的「行」是以「\n」進行區分的。HTML標籤每行的末尾有一個「\n」,不過它不可見。 若是不使用re.S參數,則只在每一行內進行匹配,若是一行沒有,就換下一行從新開始,不會跨行。而使用re.S參數之後,正則表達式會將這個字符串做爲一個總體,將「\n」當作一個普通的字符加入到這個字符串中,在總體中進行匹配。
 
 
 
 

3.保存數據

數據解析後能夠保存到文件或數據庫中,這個例子是保存到了文件中,很簡單,就不作說明了,在下篇講如何將數據保存到數據庫
 
def down_image(url, filename, realName):
    req = urllib2.Request(url=url)
    folder = 'e:\\images\\%s' % realName
    if os.path.isdir(folder):
        pass
    else:
        os.makedirs(folder)

    f = folder + '\\%s.jpg' % filename
    if not os.path.isfile(f):
        print f
        binary_data = urllib2.urlopen(req).read()
        with open(f, 'wb') as temp_file:
            temp_file.write(binary_data)

  

GitHub地址,還有其餘網站爬蟲,歡迎star:https://github.com/peiniwan/Spider2ajax

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息