最近在學習Python爬蟲,求大神給點乾貨?

分享一下自己的學習歷程,學習方法啊!


謝邀,這幾天實在太忙,沒時間寫技術答,偷懶將之前寫的一篇爬蟲入門貼過來吧。所貼代碼皆為當時運行通過的,應該是最入門的歷程了,是不是乾貨題主自行判斷
----------------------------
作者:洪宸
鏈接:Python 爬蟲進階? - 知乎用戶的回答
來源:知乎

爬蟲是在沒有(用)API獲取數據的情況下以Hack的方式獲取數據的一種有效手段;進階,就是從爬取簡單頁面逐漸過渡到複雜頁面的過程。針對特定需求,爬取的網站類型不同,可以使用不同的python庫相結合,達到快速抓取數據的目的。但是無論使用什麼庫,第一步分析目標網頁的頁面元素髮現抓取規律總是必不可少的:有些爬蟲是通過訪問固定url前綴拼接不同的後綴進行循環抓取,有些是通過一個起始url作為種子url繼而獲取更多的目標url遞歸抓取;有些網頁是靜態數據可以直接獲取,有些網頁是js渲染數據需要構造二次請求……如果統統都寫下來,一篇文章是不夠的,這裡舉幾個典型的栗子:


1. 頁面url為固定url前綴拼接不同的後綴:

以從OPENISBN網站抓取圖書分類信息為例,我有一批圖書需要入庫,但是圖書信息不全,比如缺少圖書分類,此時需要去"http://openisbn.com/"網站根據ISBN號獲取圖書的分類信息。

如《失控》這本書, ISBN: 7513300712 ,對應url為 "http://openisbn.com/isbn/7513300712/ " ,分析url規律就是以 "http://openisbn.com/isbn/" 作為固定前綴然後拼接ISBN號得到;然後分析頁面元素,Chrome右鍵 —&> 檢查:

我先直接使用urllib2 + re 來獲得「Category:」 信息:

#-*- coding:UTF-8 -*-

import re
import urllib2

isbn = "7513300712"
url = "http://openisbn.com/isbn/{0}/".format(isbn)
category_pattern = re.compile(r"Category: *.*, ")
html = urllib2.urlopen(url).read()
category_info = category_pattern.findall(html)

if len(category_info) &> 0 :
print category_info[0]
else:
print "get category failed."

輸出:

Category: 現當代小說, 小說,


2.選擇合適的定位元素:

由於頁面中只有一行「Category:」 信息,正則表達式提取就行,如果有很多行的話就需要縮小查找範圍了,BeautifulSoup庫就可以用來定位查找範圍。通過分析可知,包含所需「Category:」 最近一層的div 是 &,仔細觀察,外層還有一個 &,而 & 也是一樣,這樣如果使用它們來定位範圍的話,使用find方法返回的tag對象是最先找到的外層div,範圍不夠小;使用findAll,返回的tag對象列表還需要遍歷,綜合得出用& 作為定位元素,find方法定位返回的範圍夠小,又不需要對find結果進行遍歷。

使用urllib2 + Beautiful Soup 3 + re 再來提取一次 (Beautiful Soup最新版本為4.4,兼容python3和python2,BS4跟BS3在導包方式上有點差別):

#-*- coding:UTF-8 -*-

import re
import urllib2
from BeautifulSoup import BeautifulSoup

isbn = "7513300712"
url = "http://openisbn.com/isbn/{0}/".format(isbn)
category_pattern = re.compile(r"Category: *.*, ")
html = urllib2.urlopen(url).read()
soup = BeautifulSoup(html)
div_tag = soup.find("div",{"class":"Article"})
category_info = category_pattern.findall(str(div_tag))

if len(category_info) &> 0 :
print category_info[0]
else:
print "get category failed."

輸出:

Category: 現當代小說, 小說,


3. 抓取js渲染的內容:

用baidu搜索日曆,獲取結果頁中的節假日日期

像上次一樣直接使用urllib打開網頁,發現返回的html中並沒有期望得到的內容,原因是我通過瀏覽器所看到的頁面內容實際是等js渲染完成後最終展現的,中間還包含了多次的ajax請求,這樣使用urllib一次就不能勝任了,此時就可以讓selenium上場了(webdriver用的phantomjs,需要提前下載phantomjs放到當前的PATH路徑下),由於要查找的標識 & 包含了多個,所以這次使用的方法是findAll,然後再對返回的結果進行遍歷,解析每個tag對象的a屬性,如果包含了「休」字標識,那麼這一天就是節假日。

# -*- coding:UTF-8 -*-

import re
import urllib
from selenium import webdriver
from BeautifulSoup import BeautifulSoup

holiday_list = []
url = "http://www.baidu.com/s?" + urllib.urlencode({"wd": "日曆"})
date_pattern = re.compile(r"date="[d]+[-][d]+[-][d]+"")

driver = webdriver.PhantomJS()
driver.get(url)
html = driver.page_source
driver.quit()

soup = BeautifulSoup(html)
td_div_list = soup.findAll("div",{"class":"op-calendar-new-relative"})
for td_tag in td_div_list:
href_tag = str(td_tag.a)
if href_tag.find("休") != -1:
holiday_date_list = date_pattern.findall(href_tag)
if len(holiday_date_list) &> 0:
holiday_list.append(holiday_date_list[0].split(""")[1])

print holiday_list

輸出:

["2016-4-2", "2016-4-3", "2016-4-4", "2016-4-30", "2016-5-1』]


4. 設置代理,抓取google play排行榜(

selenium不僅可以很好的模擬瀏覽器行為,還可以將網頁內容截圖保存)

# -*- coding:UTF-8 -*-

from selenium import webdriver

url = "https://play.google.com/store/apps/top?hl=zh_CN"
proxy_setting = ["--proxy=127.0.0.1:10800", "--proxy-type=socks5"]
driver = webdriver.PhantomJS(service_args=proxy_setting)
driver.get(url)
driver.maximize_window()
# driver.implicitly_wait(10)

top_group_list = driver.find_elements_by_css_selector(".id-cluster-container.cluster-container.cards-transition-enabled")
driver.get_screenshot_as_file("top.jpg』)
for top_group in top_group_list:
group_name = top_group.find_element_by_xpath("div/div[@class="cluster-heading"]/h2/a").text
for item in top_group.find_elements_by_class_name("title"):
print u"bound: {0} app: {1}".format(group_name,item.text)

driver.quit()

5. 爬取全站

爬取一號店手機類目下的手機型號、價格。通過商品分類獲取起始url: "http://list.yhd.com/c23586-0/?tp=15.53938003.561.0.3.LFfY%607f-10-Enf8sti=1FM9" ,從起始頁中獲取每個商品的url,繼而抓取類目下的所有單品。爬取全站,網頁較多,涉及到並發問題,此時可以使用Scrapy框架了。

該類目下總共50頁,拼接上頁碼,url格式如下:

因為頁碼是用 # 拼接,會被Scrapy認為是同一個url,所以只會處理一次。

使用瀏覽器訪問url後觀察,頁面被重定向,真正的url格式卻是這樣的:

我們可以使用重定向後的url作為種子url進行爬取,Scrapy代碼如下:

# -*- coding:UTF-8 -*-

import re
import time

from scrapy import Spider, Request
# from selenium import webdriver
# from selenium.webdriver.common.action_chains import ActionChains

class YhdMobileSpider(Spider):
name = "yhd_mobile"
start_urls = ["http://list.yhd.com/c23586-0-81436/b/a-s1-v4-p1-price-d0-f0d-m1-rt0-pid-mid0-k/"]

def parse(self, response):
"""
@param response:
@return: item list
"""
page_number = self.get_page_count(response)
page_url_list = [ re.sub(r"-p[d]+-", "-p{0}-".format(page), response.url) for page in xrange(1, page_number+1) ]

return map(lambda url: Request(url, callback=self.parse_product_page), page_url_list)

def parse_product_page(self, response):
product_url_list = []
for product_address in response.xpath("//div[@id="itemSearchList"]/div/div[@class="itemBox"]/p[@class="proName clearfix"]/a[1]/@href"):
href = product_address.extract()
product_url_list.append(href)

item_list = map(lambda url: Request(url, callback=self.parse_item), product_url_list)

return item_list

def parse_item(self, response):
"""
根據單品鏈接抓取單品的屬性
@param response:
@return: item
"""
#商品詳情地址
url = response.url
#品牌
brand = response.xpath("//div[@class="crumb clearfix"]/a[@id="brand_relevance"]/text()").extract()[0]
#商品名稱
spu_name = response.xpath("//div[@class="crumb clearfix"]/span/text()").extract()[0]

print url,brand,spu_name

def get_page_count(self,response):
page_count = response.xpath("//input[@id="pageCountPage"]/@value").extract()
if page_count:
page_count = int(page_count[0])
else:
page_count = 1
return page_count

幾個例子都是之前工作的真實需求做的一些簡化,後續再做適當變換擴展就可以進行複雜的爬取了,至於爬取之後的數據如何存儲,做什麼用,那又是另外一個話題了。

(媽的,編輯好多遍知乎就是不能好好的顯示 url 原地址,真是日了狗了,算了 將就著看吧)


——————————————分割線——————————————

剛看到一篇專欄,資源挺全的,新手要學習 Python 的可以關注一下:如何學習Python爬蟲[入門篇]? - 學習編程 - 知乎專欄


這是我學習Python爬蟲時寫的一些代碼,都比較簡單,適合初學者!https://github.com/Fenghuapiao/
題主有興趣的話可以fork下來跑跑


謝邀。
知乎上關於 如何入門 Python 爬蟲? - 爬蟲(計算機網路) 討論的已經很多了,100多個答主通過不同的角度分析了這個問題。

實戰是能力提高是唯一路徑。


精簡到一句話
找一個標準瀏覽器(fireforx,chrome),然後按一下你的 f12 神奇的事情就是你爬蟲入門了。


1. 先熟悉Python的使用,urllib、urllib2等基礎庫用起來,抓一些學校的新聞啊什麼的(反正就是找比較簡單的頁面試試);
2. Cookie是瀏覽器和伺服器的暗號,在實踐中理解之,可以試試模擬登陸(比如還是找學校的選課系統登陸試試);
3. Chrome里的F12,會打開新世界的大門,什麼Elements、Console、Network等等,讓我們更便捷的去審視目標網站,看的他體無完膚吧!
4. 玩膩了上面這些,是不是想讓自己的爬蟲更快更高效!上吧,代理IP!上吧,非同步抓取框架!上吧,分散式!這時候可以用一些庫來感受一下,比較輕的有Gevent,重一些的有Scrapy。如果想體驗Golang,來來來,我來推銷我寫的一個玩具啦:GitHub - zhangxiaoyang/goDataAccess: Data access framework, including spider, agent and da, implemented in native Golang.
5. 如果遇到防爬蟲的網站,代理IP也會遇到瓶頸,甚至我們都不知道該咋抓,Cookie、加密、混淆等等無所不用其極啊。這時候,要看情況了。如果是JS混淆,NodeJS是個好東西。或者js2python可以直接把JS代碼轉成Python,讓你的爬蟲無縫調用哦。如果是驗證碼,好吧,驗證碼識別上!
6. 我們還沒有聊過抓取頁面的解析呢,正則、xpath?或許我們可以做的更加智能。
7. 有一天,我們發現了移動端的新大陸,不論是HTTP還是TCP,移動端對爬蟲來說真是友好極了。什麼,反編譯apk竟然找到了高許可權key,爽歪歪!
8. 終有一天,心會累的,折騰無涯啊。PhantomJS、Selenium,把瀏覽器捧在手心吧。
9. 與後台的小夥伴不斷博弈,姿勢見長啊,突然發現,很多人不屑的爬蟲工程師Title竟然要學辣么多東西,我特么是要是成為全粘工程師啊!可是我的出路在哪裡?
10. 總結一下,爬蟲玩大了就是數據接入啊,這是不是高大上了不少。數據接入玩大了呢,智能高效快速的數據接入啊。再玩呢?敢問路在何方,路在腳下。

玩了這麼多,變化無窮啊。有沒有不變的?
初心,用技術支撐產品提供更好的用戶體驗,一切以用戶價值為依歸。

全粘工程師?可以關注池建強老師的微信公眾號了解,哈哈。


了解python,主要是教妹子學習它時候順便自己學習了下,業餘菜鳥說一下
之前用某語言寫過爬蟲,可麻煩了,於是試著用python也來抓取一下數據,
首頁你需要一定python基礎,然後對http請求,html頁面有一定了解。
然後可以試著抓一下某些網站數據,比如段子網站某百。我練手是某條上面美女圖片(找到借口看美圖了,而且多有動力),首先分析頁面和介面,發現我需要數據一部分來自頁面,一部分直接來自介面。頁面分析一下寫出正則表達式提取,介面通過json方式提取關鍵數據。以上只是簡單,有時候抓取數還需要登錄啦各種情況,多找些網站來練練手。
有了以上基礎後,可以考慮性能問題,畢竟爬蟲東西很適合用多線程(IO密集嘛),把需要下載鏈接放入隊列 我選了這個threadpool 線程池庫來處理,速度當然提升也是杠杠的,但是也要注意頻繁請求會導致被網站封掉ip,所以我一般都會隨機去sleep一會,這個需要自己把握時間。還有爬區數據後條理化處理。當然也有一些爬蟲框架比如scrapy,熟悉後可以嘗試用一用。


1、看書,這是學習的基礎(像《Dive into Python》、《Leaning python》、《Python Doc》就不錯。)。

2、自己練習,Python還是要多實踐才能出真知(繼續看有開源項目)。

3、資料查詢,google,stackoverflow等多關注。

4、交流。各種論壇上的python group,論壇。

學習+實踐+總結,掌握Python等編程語言的法寶。

接下來,這兩個開源項目我覺得還不錯,你可以看看,記得多練習:

一、Gather Platform 數據抓取平台

(下載鏈接:https://github.com/gsh199449/spider)

它是一套基於 Webmagic 內核的,具有 Web 任務配置和任務管理界面的數據採集平台,一個輕量級的搜索引擎系統。

它在5分鐘內即可部署完畢,半分鐘即可完成一個爬蟲,開始數據採集。不需要進行任何編碼就可以完成一個功能強大的爬蟲。

二、垂直爬蟲 WebMagic (下載鏈接:http://webmagic.io/)

webmagic的是一個無須配置、便於二次開發的爬蟲框架,它提供簡單靈活的API,只需少量代碼即可實現一個爬蟲。

它採用完全模塊化的設計,功能覆蓋整個爬蟲的生命周期(鏈接提取、頁面下載、內容抽取、持久化),支持多線程抓取,分散式抓取,支持自動重試、自定義UA/cookie等功能。

包含強大的頁面抽取功能,開發者可以便捷的使用css selector、xpath和正則表達式進行鏈接和內容的提取,支持多個選擇器鏈式調用,也可以很方便的作為一個模塊,嵌入Java項目中運行。

學好python可多元發展,這些就業方向可供選擇:

Python開發工程師;自動化開發工程師;Linux運維工程師;大數據分析和數據挖掘;前端開發工程師;Python爬蟲開發工程師;Python程序設計師;Python開發測試;運維工程師;數據研發工程師;伺服器開發工程師。

如果你需要學習資料,可以看看這個:

python基礎教程:http://pan.baidu.com/s/1qYTZiNE

python課程教學高手晉級視頻總目錄:http://pan.baidu.com/s/1hrXwY8k

python課程windows知識點:http://pan.baidu.com/s/1kVcaH3x

python課程linux知識點:http://pan.baidu.com/s/1i4VZh5b

python課程web知識點:http://pan.baidu.com/s/1jIMdU2i

python課程機器學習:http://pan.baidu.com/s/1o8qNB8Q

python課程-樹莓派設備:http://pan.baidu.com/s/1slFee2T


最近剛好準備開始寫一個

從零開始寫python爬蟲的系列專欄

希望能幫助到你.

這裡先把導言部分貼過來
-------------------------------------------
從零開始寫Python爬蟲 --- 導言

https://pic4.zhimg.com/122fb1f9f_xs.jpgEhco2 天前

我是一名努力想做 coder 的小伙,目前自學Python有大半年了,期間也寫過一些小的爬蟲。說起來當時想成為程序員就是因為無意間了解到 爬蟲 這個神奇的東西。這裡會記錄自己 重新梳理 學習Python爬蟲的路線。也希望能成為一篇不錯的入門爬蟲教程,總之,希望自己能堅持把這個系列專欄寫完。

學習之前需要哪些準備?

  1. 一顆熱愛學習,不屈不撓的心
  2. 一台有鍵盤的電腦(什麼系統都行。我用的os x,所以例子會以這個為準)
  3. html相關的一些前段知識。不需要精通,能懂一點就夠!
  4. Python的基礎語法知識 。

如果我一點編程基礎都沒有怎麼辦?

現在開始學!Python是一門非常適合做入門學習的語言。如果你沒有任何其他編程語言的基礎,那麼就來學Python吧。

我自己目前同時在學java和Python,就我自己的感覺來說,Python的語法簡直太美妙了 不是有句話叫 Life is short, Use Python

有什麼推薦的入門教材么?

  1. 笨辦法學Python(Learn Python the Hard Way),我看的這本書入門的,非常有趣,網上有翻譯的版本,當然有條件的同學還是去看英文原著會更好。
  2. 廖大的Python3教程(廖雪峰的Python3教程)
  3. 自強學堂的教程(Python 學習資源 - 學習分享 - 自強學堂)
  4. 菜鳥學習資源(菜鳥教程 - 學的不僅是技術,更是夢想!)
  5. html入門學習(w3school 在線教程)
  6. 看看知乎大V們是如何回答這個問題的?(編程零基礎應當如何開始學習 Python ?)

具體的學習路線是什麼?

總體分為三個大方面:

一: 簡單的定向腳本爬蟲(request --- bs4 --- re)

二: 大型框架式爬蟲(Scrapy框架為主)

三:瀏覽器模擬爬蟲 (Mechanize模擬 和 Selenium 模擬)

具體的步驟:

一:Beautiful Soup 爬蟲

  • requests庫的安裝與使用
  • 安裝beautiful soup 爬蟲環境
  • beautiful soup 的解析器
  • re庫 正則表達式的使用
  • bs4 爬蟲實踐: 獲取百度貼吧的內容
  • bs4 爬蟲實踐: 獲取雙色球中獎信息
  • bs4 爬蟲實踐: 獲取起點小說信息
  • bs4 爬蟲實踐: 獲取電影信息
  • bs4 爬蟲實踐: 獲取悅音台榜單

二: Scrapy 爬蟲框架

  • 安裝Scrapy
  • Scrapy中的選擇器 Xpath和CSS
  • Scrapy 爬蟲實踐:今日影視
  • Scrapy 爬蟲實踐:天氣預報
  • Scrapy 爬蟲實踐:獲取代理
  • Scrapy 爬蟲實踐:糗事百科
  • Scrapy 爬蟲實踐: 爬蟲相關攻防(代理池相關)

三: 瀏覽器模擬爬蟲

  • Mechanize模塊的安裝與使用
  • 利用Mechanize獲取樂音台公告
  • Selenium模塊的安裝與使用
  • 瀏覽器的選擇 PhantomJS
  • Selenium PhantomJS 實踐: 獲取代理
  • Selenium PhantomJS 實踐: 漫畫爬蟲

最後,今天也是一時興起才想做這麼一個系列的記錄,最終能不能寫完自己心裡也沒底,

但我會盡量去寫完它。現在是學期中後期了,一大堆節課論文在等著我,(文科生太苦逼)

加上,我也是邊學邊寫,所以寫的的不會太快,我盡量做到每周都寫一兩篇的。

每天的學習記錄都會 同步更新到:
微信公眾號: findyourownway
知乎專欄 : 從零開始寫Python爬蟲 - 知乎專欄
個人博客 : Ehco的博客


平時工作需要寫的東西,都是在有真正的現實需求的,樓主可以看看,歡迎交流
https://github.com/hzlRises/


以我自己入手爬蟲的經驗,需要修鍊如下知識:
1 Python基本知識
2 http基本知識header,http,代理,post get等
3 web基本開發知識session,token,驗證碼等

當然弱網站也不需要太多知識。

最近有空在寫一個分散式定向爬蟲,你可以參考下
http://github.com/yyt030/SFspider


爬蟲知識列表:python基礎、 requests庫 、selenium 、xpath、 正則表達式、css、html、js、phantomjs

熟悉以上後再學習下爬蟲框架:scrapy或者pyspider 基本上爬蟲知識到手


看我簽名,隨我來


推薦閱讀:

一個網站用兩種或以上的後端編程語言會出現什麼情況?為什麼?
selenium爬蟲被檢測到 該如何破?
Nginx、Gunicorn在伺服器中分別起什麼作用?
Python 如何入門?
那麼,Python做爬蟲究竟比其他語言好在哪裡呢?

TAG:編程語言 | Python | 爬蟲計算機網路 |