python爬虫数据抓取方法汇总
概要:利用python進(jìn)行web數(shù)據(jù)抓取方法和實現(xiàn)。
1、python進(jìn)行網(wǎng)頁數(shù)據(jù)抓取有兩種方式:一種是直接依據(jù)url鏈接來拼接使用get方法得到內(nèi)容,一種是構(gòu)建post請求改變對應(yīng)參數(shù)來獲得web返回的內(nèi)容。
一、第一種方法通常用來獲取靜態(tài)頁面內(nèi)容,比如豆瓣電影內(nèi)容分類下動畫對應(yīng)的鏈接:
http://www.douban.com/tag/%E5%8A%A8%E7%94%BB/?focus=movie
紀(jì)錄片對應(yīng)的鏈接:
http://www.douban.com/tag/%E7%BA%AA%E5%BD%95%E7%89%87/?focus=movie
tag 與 /?foucus中間的代表關(guān)鍵字,每次將頁面對應(yīng)的關(guān)鍵字進(jìn)行替換就能抓取到相應(yīng)的頁面。
二、第二種方法是通過使用post請求來進(jìn)行獲取web內(nèi)容抓取,由于許多網(wǎng)站是動態(tài)網(wǎng)站,每次請求返回的對應(yīng)鏈接都是無變化,所以不能直接使用get方法來抓取網(wǎng)站內(nèi)容,基本思路是只能依據(jù)每次發(fā)送的post數(shù)據(jù)請求觀察其中的參數(shù),并模擬構(gòu)造post請求實現(xiàn)相應(yīng)的頁面獲取。
2、python簡易代碼實現(xiàn)web抓取:
1 #coding=utf-8
2
3 import urllib,urllib2
4
5 #繼續(xù)以抓取豆瓣電影分類鏈接為例
6
7 movie_list = ['%E7%BA%AA%E5%BD%95%E7%89%87','%E6%96%87%E8%89%BA','%E5%8F%B2%E8%AF%97']
8
9 for i in movie_list:
10 url = http://www.douban.com/tag/%E5%8F%B2%E8%AF%97/?focus=movie
11 url = url.replace('%E5%8F%B2%E8%AF%97',i)
12 request = urllib2.Request(url)
13 html = urllib2.open(request)
3、使用phantomJS模擬瀏覽器進(jìn)行數(shù)據(jù)抓取
http://www.cnblogs.com/chenqingyang/p/3772673.html
這是我學(xué)習(xí)爬蟲比較深入的一步了,大部分的網(wǎng)頁抓取用urllib2都可以搞定,但是涉及到JavaScript的時候,urlopen就完全傻逼了,所以不得不用模擬瀏覽器,方法也有很多,此處我采用的是selenium2+phantomjs,原因在于:
selenium2支持所有主流的瀏覽器和phantomjs這些無界面的瀏覽器,我開始打算用Chrome,但是發(fā)現(xiàn)需要安裝一個什么Chrome驅(qū)動,于是就棄用了,選擇phantomjs,而且這個名字聽起來也比較洋氣。
上網(wǎng)查了很多資料,發(fā)現(xiàn)網(wǎng)上selenium2+phantomjs的使用方法的中文資源十分欠缺,不得不閱讀晦澀的官方文檔,所以這里記下目前已經(jīng)實現(xiàn)的操作,再加上一些我個人遇到的問題以及對應(yīng)的解決方案。
背景知識:
phantomjs是一個基于webkit的沒有界面的瀏覽器,所以運(yùn)行起來比完整的瀏覽器要高效。
selenium的英文原意是Se,化學(xué)元素,這里是一個測試web應(yīng)用的工具,目前是2.42.1版本,和1版的區(qū)別在于2.0+中把WebDrive整合在了一起。
selenium2支持的Python版本:2.7, 3.2, 3.3 and 3.4
如果需要進(jìn)行遠(yuǎn)程操作的話,就需要額外安裝selenium server
安裝:
先裝selenium2,哪種方式裝都可以,我一般都是直接下載壓縮包,然后用python setup.py install命令來裝,selenium 2.42.1的下載地址:https://pypi.python.org/pypi/selenium/2.42.1
然后下載phantomjs,https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.7-windows.zip,解壓后可以看到一個phantomjs.exe的文件
范例1:
#coding=utf-8
from selenium import webdriver
driver = webdriver.PhantomJS(executable_path='C:\Users\Gentlyguitar\Desktop\phantomjs-1.9.7-windows\phantomjs.exe')
driver.get("http://duckduckgo.com/")
driver.find_element_by_id('search_form_input_homepage').send_keys("Nirvana")
driver.find_element_by_id("search_button_homepage").click()
print driver.current_url
driver.quit()
其中的executable_path就是剛才phantomjs.exe的路徑,運(yùn)行結(jié)果:
https://duckduckgo.com/?q=Nirvana
Walk through of the example:
值得一提的是:
get方法會一直等到頁面被完全加載,然后才會繼續(xù)程序
但是對于ajax:It’s worth noting that if your page uses a lot of AJAX on load then WebDriver may not know when it has completely loaded
send_keys就是填充input
范例2:
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver import ActionChains
import time
import sys
driver = webdriver.PhantomJS(executable_path='C:\Users\Gentlyguitar\Desktop\phantomjs-1.9.7-windows\phantomjs.exe')
driver.get("http://www.zhihu.com/#signin")
#driver.find_element_by_name('email').send_keys('your email')
driver.find_element_by_xpath('//input[@name="password"]').send_keys('your password')
#driver.find_element_by_xpath('//input[@name="password"]').send_keys(Keys.RETURN)
time.sleep(2)
driver.get_screenshot_as_file('show.png')
#driver.find_element_by_xpath('//button[@class="sign-button"]').click()
driver.find_element_by_xpath('//form[@class="zu-side-login-box"]').submit()
try:
dr=WebDriverWait(driver,5)
dr.until(lambda the_driver:the_driver.find_element_by_xpath('//a[@class="zu-top-nav-userinfo "]').is_displayed())
except:
print '登錄失敗'
sys.exit(0)
driver.get_screenshot_as_file('show.png')
#user=driver.find_element_by_class_name('zu-top-nav-userinfo ')
#webdriver.ActionChains(driver).move_to_element(user).perform() #移動鼠標(biāo)到我的用戶名
loadmore=driver.find_element_by_xpath('//a[@id="zh-load-more"]')
actions = ActionChains(driver)
actions.move_to_element(loadmore)
actions.click(loadmore)
actions.perform()
time.sleep(2)
driver.get_screenshot_as_file('show.png')
print driver.current_url
print driver.page_source
driver.quit()
這個程序完成的是,登陸知乎,然后能自動點擊頁面下方的“更多”,以載入更多的內(nèi)容
Walk through of the example:
from selenium.webdriver.common.keys import Keys,keys這個類就是鍵盤上的鍵,文中的send_keys(Keys.RETURN)就是按一個回車
from selenium.webdriver.support.ui import WebDriverWait是為了后面一個等待的操作
from selenium.webdriver import ActionChains是導(dǎo)入一個動作的類,這句話的寫法,我找了很久
find_element推薦使用Xpath的方法,原因在于:優(yōu)雅、通用、易學(xué)
Xpath表達(dá)式寫法教程:http://www.ruanyifeng.com/blog/2009/07/xpath_path_expressions.html
值得注意的是,避免選擇value帶有空格的屬性,譬如class = "country name"這種,不然會報錯,大概compound class之類的錯
檢查用戶密碼是否輸入正確的方法就是在填入后截屏看看
想要截屏,這么一句話就行:
driver.get_screenshot_as_file('show.png')
但是,這里的截屏是不帶滾動條的,就是給你把整個頁面全部照下來
try:
dr=WebDriverWait(driver,5)
dr.until(lambda the_driver:the_driver.find_element_by_xpath('//a[@class="zu-top-nav-userinfo "]').is_displayed())
except:
print '登錄失敗'
sys.exit(0)
是用來通過檢查某個元素是否被加載來檢查是否登錄成功,我認(rèn)為當(dāng)個黑盒子用就可以了。其中5的解釋:5秒內(nèi)每隔500毫秒掃描1次頁面變化,直到指定的元素
對于表單的提交,即可以選擇登錄按鈕然后使用click方法,也可以選擇表單然后使用submit方法,后者能應(yīng)付沒有登錄按鈕的情況,所以推薦使用submit()
對于一次點擊,既可以使用click(),也可以使用一連串的action來實現(xiàn),如文中:
loadmore=driver.find_element_by_xpath('//a[@id="zh-load-more"]')
actions = ActionChains(driver)
actions.move_to_element(loadmore)
actions.click(loadmore)
actions.perform()
這5句話其實就相當(dāng)于一句話,find element然后click,但是action的適用范圍更廣,譬如在這個例子中,要點擊的是一個a標(biāo)簽對象,我不知道為什么直接用click不行,不起作用
print driver.current_url print driver.page_source
即打印網(wǎng)頁的兩個屬性:url和source
總結(jié):除了能解決動態(tài)頁面的問題以外,用selenium用來模擬登陸也比urllib2簡單得多。
參考文獻(xiàn):
http://www.realpython.com/blog/python/headless-selenium-testing-with-python-and-phantomjs/
http://selenium-python.readthedocs.org/getting-started.html
Xpath寫法
http://www.cnblogs.com/paisen/p/3310067.html
4、使用代理防止抓取ip被封
實時動態(tài)抓取代理可用Ip,生成可用代理地址池
5、scrapy爬蟲代理——利用crawlera神器,無需再尋找代理IP
由于工作需要,利用scrpay采集某個商業(yè)網(wǎng)站的數(shù)據(jù)。但是這個網(wǎng)站反扒非常厲害。因此不得不采用代理IP來做,但是做了幾天后幾乎能用的代理IP全被禁掉了。而且這種找代理、然后再驗證的流程非常麻煩,于是博主想到了第三方平臺crawlera.
一、crawlera平臺注冊
首先申明,注冊是免費(fèi)的,使用的話除了一些特殊定制外都是free的。
1、登錄其網(wǎng)站https://dash.scrapinghub.com/account/signup/
填寫用戶名、密碼、郵箱,注冊一個crawlera賬號并激活
2、創(chuàng)建Organizations,然后添加crawlear服務(wù)
然后點擊 +Service ,在彈出的界面點擊Crawlear,輸入名字,選擇信息就創(chuàng)建成功了。
創(chuàng)建成功過后點擊你的Crawlear名字便可以看到API的詳細(xì)信息。
二、部署到srcapy項目
1、安裝scarpy-crawlera
pip install 、easy_install 隨便你采用什么安裝方式都可以
?
| 1 |
|
2、修改settings.py
如果你之前設(shè)置過代理ip,那么請注釋掉,加入crawlera的代理
?
|
1 2 3 4 5 |
|
為了是crawlera生效,需要添加你創(chuàng)建的api信息(如果填寫了API key的話,pass填空字符串便可)
?
|
1 2 3 |
|
為了達(dá)到更高的抓取效率,可以禁用Autothrottle擴(kuò)展和增加并發(fā)請求的最大數(shù)量,以及設(shè)置下載超時,代碼如下
?
|
1 2 3 4 |
|
如果在代碼中設(shè)置有 DOWNLOAD_DELAY的話,需要在setting.py中添加
?
| 1 |
|
如果你的spider中保留了cookies,那么需要在Headr中添加
?
|
1 2 3 4 5 |
|
三、運(yùn)行爬蟲
這些都設(shè)置好了過后便可以運(yùn)行你的爬蟲了。這時所有的request都是通過crawlera發(fā)出的,信息如下
更多的crawlera信息請參考官方文檔:http://doc.scrapinghub.com/index.html
總結(jié)
以上是生活随笔為你收集整理的python爬虫数据抓取方法汇总的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python爬虫爬取数据的步骤
- 下一篇: 最美莫过于在PPT里制作的风景图,这个技