導航:首頁 > 編程語言 > python語言爬蟲怎麼寫

python語言爬蟲怎麼寫

發布時間:2022-07-16 13:27:23

『壹』 如何用python寫一個分布式爬蟲

本文將會以PC端微博進行講解,因為移動端微博數據不如PC短全面,而且抓取和解析難度都會小一些。文章比較長,由於篇幅所限,文章並沒有列出所有代碼,只是講了大致流程和思路。

要抓微博數據,第一步便是模擬登陸,因為很多信息(比如用戶信息,用戶主頁微博數據翻頁等各種翻頁)都需要在登錄狀態下才能查看。關於模擬登陸進階,我寫過兩篇文章,一篇是模擬登陸微博的,是從小白的角度寫的。另外一篇是模擬登陸網路雲的,是從有一定經驗的熟手的角度寫的。讀了這兩篇文章,並且根據我寫的過程自己動手實現過的同學,應該對於模擬登陸PC端微博是沒有太大難度的。那兩篇文章沒有講如何處理驗證碼,這里我簡單說一下,做爬蟲的同學不要老想著用什麼機器學習的方法去識別復雜驗證碼,真的難度非常大,這應該也不是一個爬蟲工程師的工作重點,當然這只是我的個人建議。工程化的項目,我還是建議大家通過打碼平台來解決驗證碼的問題。我在分布式微博爬蟲中就是直接調用打碼平台的介面來做的大規模微博賬號的模擬登陸,效果還不錯,而且打碼成本很低。

說完模擬登陸(具體請參見我寫的那兩篇文章,篇幅所限,我就不過來了),我們現在正式進入微博的數據抓取。這里我會以微博用戶信息抓取為例來進行分析和講解。

關於用戶信息抓取,可能我們有兩個目的。一個是我們只想抓一些指定用戶,另外一個是我們想盡可能多的抓取更多數量的用戶的信息。我的目的假定是第二種。那麼我們該以什麼樣的策略來抓取,才能獲得盡可能多的用戶信息呢?如果我們初始用戶選擇有誤,選了一些不活躍的用戶,很可能會形成一個環,這樣就抓不了太多的數據。這里有一個很簡單的思路:我們把一些大V拿來做為種子用戶,我們先抓他們的個人信息,然後再抓大V所關注的用戶和粉絲,大V關注的用戶肯定也是類似大V的用戶,這樣的話,就不容易形成環了。

策略我們都清楚了。就該是分析和編碼了。

我們先來分析如何構造用戶信息的URL。這里我以微博名為一起神吐槽的博主為例進行分析。做爬蟲的話,一個很重要的意識就是爬蟲能抓的數據都是人能看到的數據,反過來,人能在瀏覽器上看到的數據,爬蟲幾乎都能抓。這里用的是幾乎,因為有的數據抓取難度特別。我們首先需要以正常人的流程看看怎麼獲取到用戶的信息。我們先進入該博主的主頁,如下圖

根據唯一性判斷

我們在頁面源碼中搜索,只發現一個script中有該字元串,那麼就是那段script是頁面相關信息。我們可以通過正則表達式把該script提取出來,然後把其中的html也提取出來,再保存到本地,看看信息是否全面。這里我就不截圖了。感覺還有很多要寫的,不然篇幅太長了。

另外,對於具體頁面的解析,我也不做太多的介紹了。太細的東西還是建議讀讀源碼。我只講一下,我覺得的一種處理異常的比較優雅的方式。微博爬蟲的話,主要是頁面樣式太多,如果你打算包含所有不同的用戶的模版,那麼我覺得幾乎不可能,不同用戶模版,用到的解析規則就不一樣。那麼出現解析異常如何處理?尤其是你沒有catch到的異常。很可能因為這個問題,程序就崩掉。其實對於Python這門語言來說,我們可以通過裝飾器來捕捉我們沒有考慮到的異常,比如我這個裝飾器

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

def parse_decorator(return_type):

"""

:param return_type: 用於捕捉頁面解析的異常, 0表示返回數字0, 1表示返回空字元串, 2表示返回[],3表示返回False, 4表示返回{}, 5返回None

:return: 0,'',[],False,{},None

"""

def page_parse(func):

@wraps(func)

def handle_error(*keys):

try:

return func(*keys)

except Exception as e:

parser.error(e)

if return_type == 5:

return None

elif return_type == 4:

return {}

elif return_type == 3:

return False

elif return_type == 2:

return []

elif return_type == 1:

return ''

else:

return 0

return handle_error

return page_parse

上面的代碼就是處理解析頁面發生異常的情況,我們只能在數據的准確性、全面性和程序的健壯性之間做一些取捨。用裝飾器的話,程序中不用寫太多的try語句,代碼重復率也會減少很多。

頁面的解析由於篇幅所限,我就講到這里了。沒有涉及太具體的解析,其中一個還有一個比較難的點,就是數據的全面性,讀者可以去多觀察幾個微博用戶的個人信息,就會發現有的個人信息,有的用戶有填寫,有的並沒有。解析的時候要考慮完的話,建議從自己的微博的個人信息入手,看到底有哪些可以填。這樣可以保證幾乎不會漏掉一些重要的信息。

最後,我再切合本文的標題,講如何搭建一個分布式的微博爬蟲。開發過程中,我們可以先就做單機單線程的爬蟲,然後再改成使用celery的方式。這里這樣做是為了方便開發和測試,因為你單機搭起來並且跑得通了,那麼分布式的話,就很容易改了,因為celery的API使用本來就很簡潔。

我們抓取的是用戶信息和他的關注和粉絲uid。用戶信息的話,我們一個請求大概能抓取一個用戶的信息,而粉絲和關注我們一個請求可以抓取18個左右(因為這個抓的是列表),顯然可以發現用戶信息應該多佔一些請求的資源。這時候就該介紹理論篇沒有介紹的關於celery的一個高級特性了,它叫做任務路由。直白點說,它可以規定哪個分布式節點能做哪些任務,不能做哪些任務。它的存在可以讓資源分配更加合理,分布式微博爬蟲項目初期,就沒有使用任務路由,然後抓了十多萬條關注和分析,結果發現用戶信息抓幾萬條,這就是資源分配得不合理。那麼如何進行任務路由呢?

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

# coding:utf-8

import os

from datetime import timedelta

from celery import Celery

from kombu import Exchange, Queue

from config.conf import get_broker_or_backend

from celery import platforms

# 允許celery以root身份啟動

platforms.C_FORCE_ROOT = True

worker_log_path = os.path.join(os.path.dirname(os.path.dirname(__file__))+'/logs', 'celery.log')

beat_log_path = os.path.join(os.path.dirname(os.path.dirname(__file__))+'/logs', 'beat.log')

tasks = ['tasks.login', 'tasks.user']

# include的作用就是注冊服務化函數

app = Celery('weibo_task', include=tasks, broker=get_broker_or_backend(1), backend=get_broker_or_backend(2))

app.conf.update(

CELERY_TIMEZONE='Asia/Shanghai',

CELERY_ENABLE_UTC=True,

CELERYD_LOG_FILE=worker_log_path,

CELERYBEAT_LOG_FILE=beat_log_path,

CELERY_ACCEPT_CONTENT=['json'],

CELERY_TASK_SERIALIZER='json',

CELERY_RESULT_SERIALIZER='json',

CELERY_QUEUES=(

Queue('login_queue', exchange=Exchange('login', type='direct'), routing_key='for_login'),

Queue('user_crawler', exchange=Exchange('user_info', type='direct'), routing_key='for_user_info'),

Queue('fans_followers', exchange=Exchange('fans_followers', type='direct'), routing_key='for_fans_followers'),

)

上述代碼我指定了有login_queue、user_crawler、fans_followers三個任務隊列。它們分別的作用是登錄、用戶信息抓取、粉絲和關注抓取。現在假設我有三台爬蟲伺服器A、B和C。我想讓我所有的賬號登錄任務分散到三台伺服器、讓用戶抓取在A和B上執行,讓粉絲和關注抓取在C上執行,那麼啟動A、B、C三個伺服器的celery worker的命令就分別是

Python

1

2

3

celery -A tasks.workers -Q login_queue,user_crawler worker -l info -c 1 # A伺服器和B伺服器啟動worker的命令,它們只會執行登錄和用戶信息抓取任務

celery -A tasks.workers -Q login_queue,fans_followers worker -l info -c 1 # C伺服器啟動worker的命令,它只會執行登錄、粉絲和關注抓取任務

然後我們通過命令行或者代碼(如下)就能發送所有任務給各個節點執行了

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

4

『貳』 用python寫一個爬蟲有多難

爬蟲是互聯網上最常見的一種東西了吧。
爬蟲這東西每天都在網上爬大量的信息,各大搜索引擎廠商每天都有上百萬的爬蟲在網路上活動,這些爬蟲的作用就是給搜索引擎採集互聯網上最新的內容,採集來的內容經過分類、加工之後,進入搜索引擎的索引。這是爬蟲最常見的應用。
關於搜索引擎的理論非常多,應該已經形成系統的理論和方法了。這里不再多追求搜索引擎的細節,只來看看爬蟲如何爬有效的信息。
ps. 這個博客已經很久沒有更新了。現在時間越來越少,平時鮮有時間來更新博客了。
最近某人發現,python其實是一種很適合寫爬蟲的語言,而且python越用越順手。現在若是有人問我「c++和c#學哪一個?「之類的問題的時候,我一定會說,學python吧,因為生命短暫,你應該學習python。
所謂爬蟲,就是把網頁的html下載下來,然後從裡面提取出來有用的信息,這些有用的信息一般就是正文,圖片,鏈接一類的信息。
針對特定網站的爬蟲就更好寫了,用正則表達式,把網頁里的鏈接信息找到,然後找到需要的信息,保存在本地,然後進入下一個鏈接重復上一次的過程。
下面的腳本演示如何從加菲貓的官網上把從1978年至今的所有漫畫全部下載下來

import os,urllib,urllib2,re

hosts = "http://**********"
#initpos = "/mobile/garfield/1978/06/19"
initpos ="/mobile/garfield/1979/08/08"
pname = re.compile('''<span class="authorText">.+?<em>(.*?)</em></span>''')
pcomic = re.compile('''<div id="comic".+?src="(.*?)".+?</div>''')
pnext = re.compile('''<a href="(.*?)" class="next">''')

def getpage(url):
print url
req = urllib2.Request(url)
req.add_header("User-Agent","Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0")
req.add_header("If-None-Match","")
u = urllib2.urlopen(req).read()
return u

def getnextpos(content,patten):
r = patten.findall(content)
for x in r:
print 'find next: ',x
return x

def savecomic(content,patten):
r = patten.findall(content)
print 'find commic:',r
r2 = pname.findall(content)
print 'find name:',r2
urlcomic = r[0]
u = urllib.urlopen(urlcomic).read()
name = r2[0].replace(' ','').split(',')
year = name[-1]
day = name[-2]
filename = 'test.jpg'
if not os.path.exists(year):
os.makedirs(year)
# is gif file ,the name the file as gif
if ((u[0] is 'G') and (u[1] is 'I') and (u[2] is 'F')):
filename = year+day+'.gif'
else:
filename = year+day+'.jpg'
f = file(year+"/"+filename,"wb+")
f.write(u)
f.close()

def main():
url = hosts+initpos
while(True):
c = getpage(url)
savecomic(c,pcomic)
u = getnextpos(c,pnext)
if u is None:
break
else:
url = hosts+u

if __name__ == '__main__':
main()

『叄』 Python語言的爬蟲好寫嗎

不難的,python3自帶的urllib模塊可以編寫輕量級的簡單爬蟲。至於怎麼定位一個網頁中具體元素的url可自行網路火狐瀏覽器的firebug插件或者谷歌瀏覽器的自帶方法
歡迎您關注我,遇到問題可以與我交流溝通

『肆』 如何用python寫出爬蟲

先檢查是否有API

API是網站官方提供的數據介面,如果通過調用API採集數據,則相當於在網站允許的范圍內採集,這樣既不會有道德法律風險,也沒有網站故意設置的障礙;不過調用API介面的訪問則處於網站的控制中,網站可以用來收費,可以用來限制訪問上限等。整體來看,如果數據採集的需求並不是很獨特,那麼有API則應優先採用調用API的方式。

數據結構分析和數據存儲

爬蟲需求要十分清晰,具體表現為需要哪些欄位,這些欄位可以是網頁上現有的,也可以是根據網頁上現有的欄位進一步計算的,這些欄位如何構建表,多張表如何連接等。值得一提的是,確定欄位環節,不要只看少量的網頁,因為單個網頁可以缺少別的同類網頁的欄位,這既有可能是由於網站的問題,也可能是用戶行為的差異,只有多觀察一些網頁才能綜合抽象出具有普適性的關鍵欄位——這並不是幾分鍾看幾個網頁就可以決定的簡單事情,如果遇上了那種臃腫、混亂的網站,可能坑非常多。

對於大規模爬蟲,除了本身要採集的數據外,其他重要的中間數據(比如頁面Id或者url)也建議存儲下來,這樣可以不必每次重新爬取id。

資料庫並沒有固定的選擇,本質仍是將Python里的數據寫到庫里,可以選擇關系型資料庫MySQL等,也可以選擇非關系型資料庫MongoDB等;對於普通的結構化數據一般存在關系型資料庫即可。sqlalchemy是一個成熟好用的資料庫連接框架,其引擎可與Pandas配套使用,把數據處理和數據存儲連接起來,一氣呵成。

數據流分析

對於要批量爬取的網頁,往上一層,看它的入口在哪裡;這個是根據採集范圍來確定入口,比如若只想爬一個地區的數據,那從該地區的主頁切入即可;但若想爬全國數據,則應更往上一層,從全國的入口切入。一般的網站網頁都以樹狀結構為主,找到切入點作為根節點一層層往裡進入即可。

值得注意的一點是,一般網站都不會直接把全量的數據做成列表給你一頁頁往下翻直到遍歷完數據,比如鏈家上面很清楚地寫著有24587套二手房,但是它只給100頁,每頁30個,如果直接這么切入只能訪問3000個,遠遠低於真實數據量;因此先切片,再整合的數據思維可以獲得更大的數據量。顯然100頁是系統設定,只要超過300個就只顯示100頁,因此可以通過其他的篩選條件不斷細分,只到篩選結果小於等於300頁就表示該條件下沒有缺漏;最後把各種條件下的篩選結果集合在一起,就能夠盡可能地還原真實數據量。

明確了大規模爬蟲的數據流動機制,下一步就是針對單個網頁進行解析,然後把這個模式復制到整體。對於單個網頁,採用抓包工具可以查看它的請求方式,是get還是post,有沒有提交表單,欲採集的數據是寫入源代碼里還是通過AJAX調用JSON數據。

同樣的道理,不能只看一個頁面,要觀察多個頁面,因為批量爬蟲要弄清這些大量頁面url以及參數的規律,以便可以自動構造;有的網站的url以及關鍵參數是加密的,這樣就悲劇了,不能靠著明顯的邏輯直接構造,這種情況下要批量爬蟲,要麼找到它加密的js代碼,在爬蟲代碼上加入從明文到密碼的加密過程;要麼採用下文所述的模擬瀏覽器的方式。

數據採集

之前用R做爬蟲,不要笑,R的確可以做爬蟲工作;但在爬蟲方面,Python顯然優勢更明顯,受眾更廣,這得益於其成熟的爬蟲框架,以及其他的在計算機系統上更好的性能。scrapy是一個成熟的爬蟲框架,直接往裡套用就好,比較適合新手學習;requests是一個比原生的urllib包更簡潔強大的包,適合作定製化的爬蟲功能。requests主要提供一個基本訪問功能,把網頁的源代碼給download下來。一般而言,只要加上跟瀏覽器同樣的Requests Headers參數,就可以正常訪問,status_code為200,並成功得到網頁源代碼;但是也有某些反爬蟲較為嚴格的網站,這么直接訪問會被禁止;或者說status為200也不會返回正常的網頁源碼,而是要求寫驗證碼的js腳本等。

下載到了源碼之後,如果數據就在源碼中,這種情況是最簡單的,這就表示已經成功獲取到了數據,剩下的無非就是數據提取、清洗、入庫。但若網頁上有,然而源代碼里沒有的,就表示數據寫在其他地方,一般而言是通過AJAX非同步載入JSON數據,從XHR中找即可找到;如果這樣還找不到,那就需要去解析js腳本了。

解析工具

源碼下載後,就是解析數據了,常用的有兩種方法,一種是用BeautifulSoup對樹狀HTML進行解析,另一種是通過正則表達式從文本中抽取數據。

BeautifulSoup比較簡單,支持Xpath和CSSSelector兩種途徑,而且像Chrome這類瀏覽器一般都已經把各個結點的Xpath或者CSSSelector標記好了,直接復制即可。以CSSSelector為例,可以選擇tag、id、class等多種方式進行定位選擇,如果有id建議選id,因為根據HTML語法,一個id只能綁定一個標簽。

正則表達式很強大,但構造起來有點復雜,需要專門去學習。因為下載下來的源碼格式就是字元串,所以正則表達式可以大顯身手,而且處理速度很快。

對於HTML結構固定,即同樣的欄位處tag、id和class名稱都相同,採用BeautifulSoup解析是一種簡單高效的方案,但有的網站混亂,同樣的數據在不同頁面間HTML結構不同,這種情況下BeautifulSoup就不太好使;如果數據本身格式固定,則用正則表達式更方便。比如以下的例子,這兩個都是深圳地區某個地方的經度,但一個頁面的class是long,一個頁面的class是longitude,根據class來選擇就沒辦法同時滿足2個,但只要注意到深圳地區的經度都是介於113到114之間的浮點數,就可以通過正則表達式"11[3-4].\d+"來使兩個都滿足。

數據整理

一般而言,爬下來的原始數據都不是清潔的,所以在入庫前要先整理;由於大部分都是字元串,所以主要也就是字元串的處理方式了。

字元串自帶的方法可以滿足大部分簡單的處理需求,比如strip可以去掉首尾不需要的字元或者換行符等,replace可以將指定部分替換成需要的部分,split可以在指定部分分割然後截取一部分。

如果字元串處理的需求太復雜以致常規的字元串處理方法不好解決,那就要請出正則表達式這個大殺器。

Pandas是Python中常用的數據處理模塊,雖然作為一個從R轉過來的人一直覺得這個模仿R的包實在是太難用了。Pandas不僅可以進行向量化處理、篩選、分組、計算,還能夠整合成DataFrame,將採集的數據整合成一張表,呈現最終的存儲效果。

寫入資料庫

如果只是中小規模的爬蟲,可以把最後的爬蟲結果匯合成一張表,最後導出成一張表格以便後續使用;但對於表數量多、單張表容量大的大規模爬蟲,再導出成一堆零散的表就不合適了,肯定還是要放在資料庫中,既方便存儲,也方便進一步整理。

寫入資料庫有兩種方法,一種是通過Pandas的DataFrame自帶的to_sql方法,好處是自動建表,對於對表結構沒有嚴格要求的情況下可以採用這種方式,不過值得一提的是,如果是多行的DataFrame可以直接插入不加索引,但若只有一行就要加索引否則報錯,雖然這個認為不太合理;另一種是利用資料庫引擎來執行SQL語句,這種情況下要先自己建表,雖然多了一步,但是表結構完全是自己控制之下。Pandas與SQL都可以用來建表、整理數據,結合起來使用效率更高。

『伍』 Python爬蟲好寫嗎

python爬蟲不簡單的,基礎爬蟲:
(1)基礎庫:urllib模塊/requests第三方模塊
首先爬蟲就是要從網頁上把我們需要的信息抓取下來的,那麼我們就要學習urllib/requests模塊,這兩種模塊是負責爬取網頁的。這里大家覺得哪一種用的習慣就用哪一種,選擇一種精通就好了。我推薦讀者使用使用requests模塊,因為這一種簡便很多,容易操作、容易理解,所以requests被稱為「人性化模塊」。
(2)多進程、多線程、協程和分布式進程:
為什麼要學著四個知識呢?假如你要爬取200萬條的數據,使用一般的單進程或者單線程的話,你爬取下載這些數據,也許要一個星期或是更久。試問這是你想要看到的結果嗎?顯然單進程和單線程不要滿足我們追求的高效率,太浪費時間了。只要設置好多進程和多線程,爬取數據的速度可以提高10倍甚至更高的效率。
(3)網頁解析提取庫:xpath/BeautifulSoup4/正則表達式
通過前面的(1)和(2)爬取下來的是網頁源代碼,這里有很多並不是我們想要的信息,所以需要將沒用的信息過濾掉,留下對我們有價值的信息。這里有三種解析器,三種在不同的場景各有特色也各有不足,總的來說,學會這三種靈活運用會很方便的。推薦理解能力不是很強的朋友或是剛入門爬蟲的朋友,學習BeautifulSoup4是很容易掌握並能夠快速應用實戰的,功能也非常強大。
(4)反屏蔽:請求頭/代理伺服器/cookie
在爬取網頁的時候有時會失敗,因為別人網站設置了反爬蟲措施了,這個時候就需要我們去偽裝自己的行為,讓對方網站察覺不到我們就是爬蟲方。請求頭設置,主要是模擬成瀏覽器的行為;IP被屏蔽了,就需要使用代理伺服器來破解;而cookie是模擬成登錄的行為進入網站。
(5)異常:超時處理/異常處理,這里不做介紹了,自己去了解一下。
(6)數據儲存庫:文件系統儲存/MySQL/MongoDB
數據的儲存大概就這三種方式了,文件系統儲存是運用了python文件操作來執行的;而MySQL要使用到資料庫創建表格來儲存數據;MongoDB在爬蟲里是非常好的儲存方式,分布式爬蟲就是運用了MongoDB來儲存的。各有特色,看自己需要哪種,在靈活運用。
(7)動態網頁抓取:Ajax/PhantomJS/Selenium這三個知識點
(8)抓包:APP抓包/API爬蟲
(9)模擬登陸的 爬蟲

『陸』 Python爬蟲如何寫

先檢查是否有API

API是網站官方提供的數據介面,如果通過調用API採集數據,則相當於在網站允許的范圍內採集,這樣既不會有道德法律風險,也沒有網站故意設置的障礙;不過調用API介面的訪問則處於網站的控制中,網站可以用來收費,可以用來限制訪問上限等。整體來看,如果數據採集的需求並不是很獨特,那麼有API則應優先採用調用API的方式。

數據結構分析和數據存儲

爬蟲需求要十分清晰,具體表現為需要哪些欄位,這些欄位可以是網頁上現有的,也可以是根據網頁上現有的欄位進一步計算的,這些欄位如何構建表,多張表如何連接等。值得一提的是,確定欄位環節,不要只看少量的網頁,因為單個網頁可以缺少別的同類網頁的欄位,這既有可能是由於網站的問題,也可能是用戶行為的差異,只有多觀察一些網頁才能綜合抽象出具有普適性的關鍵欄位——這並不是幾分鍾看幾個網頁就可以決定的簡單事情,如果遇上了那種臃腫、混亂的網站,可能坑非常多。

對於大規模爬蟲,除了本身要採集的數據外,其他重要的中間數據(比如頁面Id或者url)也建議存儲下來,這樣可以不必每次重新爬取id。

資料庫並沒有固定的選擇,本質仍是將Python里的數據寫到庫里,可以選擇關系型資料庫MySQL等,也可以選擇非關系型資料庫MongoDB等;對於普通的結構化數據一般存在關系型資料庫即可。sqlalchemy是一個成熟好用的資料庫連接框架,其引擎可與Pandas配套使用,把數據處理和數據存儲連接起來,一氣呵成。

數據流分析

對於要批量爬取的網頁,往上一層,看它的入口在哪裡;這個是根據採集范圍來確定入口,比如若只想爬一個地區的數據,那從該地區的主頁切入即可;但若想爬全國數據,則應更往上一層,從全國的入口切入。一般的網站網頁都以樹狀結構為主,找到切入點作為根節點一層層往裡進入即可。

值得注意的一點是,一般網站都不會直接把全量的數據做成列表給你一頁頁往下翻直到遍歷完數據,比如鏈家上面很清楚地寫著有24587套二手房,但是它只給100頁,每頁30個,如果直接這么切入只能訪問3000個,遠遠低於真實數據量;因此先切片,再整合的數據思維可以獲得更大的數據量。顯然100頁是系統設定,只要超過300個就只顯示100頁,因此可以通過其他的篩選條件不斷細分,只到篩選結果小於等於300頁就表示該條件下沒有缺漏;最後把各種條件下的篩選結果集合在一起,就能夠盡可能地還原真實數據量。

明確了大規模爬蟲的數據流動機制,下一步就是針對單個網頁進行解析,然後把這個模式復制到整體。對於單個網頁,採用抓包工具可以查看它的請求方式,是get還是post,有沒有提交表單,欲採集的數據是寫入源代碼里還是通過AJAX調用JSON數據。

同樣的道理,不能只看一個頁面,要觀察多個頁面,因為批量爬蟲要弄清這些大量頁面url以及參數的規律,以便可以自動構造;有的網站的url以及關鍵參數是加密的,這樣就悲劇了,不能靠著明顯的邏輯直接構造,這種情況下要批量爬蟲,要麼找到它加密的js代碼,在爬蟲代碼上加入從明文到密碼的加密過程;要麼採用下文所述的模擬瀏覽器的方式。

數據採集

之前用R做爬蟲,不要笑,R的確可以做爬蟲工作;但在爬蟲方面,Python顯然優勢更明顯,受眾更廣,這得益於其成熟的爬蟲框架,以及其他的在計算機系統上更好的性能。scrapy是一個成熟的爬蟲框架,直接往裡套用就好,比較適合新手學習;requests是一個比原生的urllib包更簡潔強大的包,適合作定製化的爬蟲功能。requests主要提供一個基本訪問功能,把網頁的源代碼給download下來。一般而言,只要加上跟瀏覽器同樣的Requests Headers參數,就可以正常訪問,status_code為200,並成功得到網頁源代碼;但是也有某些反爬蟲較為嚴格的網站,這么直接訪問會被禁止;或者說status為200也不會返回正常的網頁源碼,而是要求寫驗證碼的js腳本等。

下載到了源碼之後,如果數據就在源碼中,這種情況是最簡單的,這就表示已經成功獲取到了數據,剩下的無非就是數據提取、清洗、入庫。但若網頁上有,然而源代碼里沒有的,就表示數據寫在其他地方,一般而言是通過AJAX非同步載入JSON數據,從XHR中找即可找到;如果這樣還找不到,那就需要去解析js腳本了。

解析工具

源碼下載後,就是解析數據了,常用的有兩種方法,一種是用BeautifulSoup對樹狀HTML進行解析,另一種是通過正則表達式從文本中抽取數據。

BeautifulSoup比較簡單,支持Xpath和CSSSelector兩種途徑,而且像Chrome這類瀏覽器一般都已經把各個結點的Xpath或者CSSSelector標記好了,直接復制即可。以CSSSelector為例,可以選擇tag、id、class等多種方式進行定位選擇,如果有id建議選id,因為根據HTML語法,一個id只能綁定一個標簽。

正則表達式很強大,但構造起來有點復雜,需要專門去學習。因為下載下來的源碼格式就是字元串,所以正則表達式可以大顯身手,而且處理速度很快。

對於HTML結構固定,即同樣的欄位處tag、id和class名稱都相同,採用BeautifulSoup解析是一種簡單高效的方案,但有的網站混亂,同樣的數據在不同頁面間HTML結構不同,這種情況下BeautifulSoup就不太好使;如果數據本身格式固定,則用正則表達式更方便。比如以下的例子,這兩個都是深圳地區某個地方的經度,但一個頁面的class是long,一個頁面的class是longitude,根據class來選擇就沒辦法同時滿足2個,但只要注意到深圳地區的經度都是介於113到114之間的浮點數,就可以通過正則表達式"11[3-4].\d+"來使兩個都滿足。

數據整理

一般而言,爬下來的原始數據都不是清潔的,所以在入庫前要先整理;由於大部分都是字元串,所以主要也就是字元串的處理方式了。

字元串自帶的方法可以滿足大部分簡單的處理需求,比如strip可以去掉首尾不需要的字元或者換行符等,replace可以將指定部分替換成需要的部分,split可以在指定部分分割然後截取一部分。

如果字元串處理的需求太復雜以致常規的字元串處理方法不好解決,那就要請出正則表達式這個大殺器。

Pandas是Python中常用的數據處理模塊,雖然作為一個從R轉過來的人一直覺得這個模仿R的包實在是太難用了。Pandas不僅可以進行向量化處理、篩選、分組、計算,還能夠整合成DataFrame,將採集的數據整合成一張表,呈現最終的存儲效果。

寫入資料庫

如果只是中小規模的爬蟲,可以把最後的爬蟲結果匯合成一張表,最後導出成一張表格以便後續使用;但對於表數量多、單張表容量大的大規模爬蟲,再導出成一堆零散的表就不合適了,肯定還是要放在資料庫中,既方便存儲,也方便進一步整理。

寫入資料庫有兩種方法,一種是通過Pandas的DataFrame自帶的to_sql方法,好處是自動建表,對於對表結構沒有嚴格要求的情況下可以採用這種方式,不過值得一提的是,如果是多行的DataFrame可以直接插入不加索引,但若只有一行就要加索引否則報錯,雖然這個認為不太合理;另一種是利用資料庫引擎來執行SQL語句,這種情況下要先自己建表,雖然多了一步,但是表結構完全是自己控制之下。Pandas與SQL都可以用來建表、整理數據,結合起來使用效率更高。

『柒』 如何入門 Python 爬蟲

Python入門程度的基礎很簡單:
1、簡單的python語法,不需要什麼很深的東西
2、請求庫用法(requests、aiohttp等)
3、簡單的抓包/摳URL
4、xpath、正則表達式的使用,且能在不用生成工具的情況下自己寫出語句提取數據
以上四點已經足夠讓你爬一些簡單的網站了,但僅僅是這個程度而已的話,就還沒那些傻瓜式爬蟲工具強呢。你還需要JavaScript/Android/iOS逆向知識(核心,雜七雜八的那些這里不一一列舉,太多了),用於破加密請求參數、反爬等各種阻止你獲取到數據的東西。

『捌』 python爬蟲入門需要哪些基礎

現在之所以有這么多的小夥伴熱衷於爬蟲技術,無外乎是因為爬蟲可以幫我們做很多事情,比如搜索引擎、採集數據、廣告過濾等,以Python為例,Python爬蟲可以用於數據分析,在數據抓取方面發揮巨大的作用。
但是這並不意味著單純掌握一門Python語言,就對爬蟲技術觸類旁通,要學習的知識和規范還有喜很多,包括但不僅限於HTML 知識、HTTP/HTTPS 協議的基本知識、正則表達式、資料庫知識,常用抓包工具的使用、爬蟲框架的使用等。而且涉及到大規模爬蟲,還需要了解分布式的概念、消息隊列、常用的數據結構和演算法、緩存,甚至還包括機器學習的應用,大規模的系統背後都是靠很多技術來支撐的。
零基礎如何學爬蟲技術?對於迷茫的初學者來說,爬蟲技術起步學習階段,最重要的就是明確學習路徑,找准學習方法,唯有如此,在良好的學習習慣督促下,後期的系統學習才會事半功倍,游刃有餘。
用Python寫爬蟲,首先需要會Python,把基礎語法搞懂,知道怎麼使用函數、類和常用的數據結構如list、dict中的常用方法就算基本入門。作為入門爬蟲來說,需要了解 HTTP協議的基本原理,雖然 HTTP 規范用一本書都寫不完,但深入的內容可以放以後慢慢去看,理論與實踐相結合後期學習才會越來越輕松。關於爬蟲學習的具體步驟,我大概羅列了以下幾大部分,大家可以參考:
網路爬蟲基礎知識:
爬蟲的定義
爬蟲的作用
Http協議
基本抓包工具(Fiddler)使用
Python模塊實現爬蟲:
urllib3、requests、lxml、bs4 模塊大體作用講解
使用requests模塊 get 方式獲取靜態頁面數據
使用requests模塊 post 方式獲取靜態頁面數據
使用requests模塊獲取 ajax 動態頁面數據
使用requests模塊模擬登錄網站
使用Tesseract進行驗證碼識別
Scrapy框架與Scrapy-Redis:
Scrapy 爬蟲框架大體說明
Scrapy spider 類
Scrapy item 及 pipeline
Scrapy CrawlSpider 類
通過Scrapy-Redis 實現分布式爬蟲
藉助自動化測試工具和瀏覽器爬取數據:
Selenium + PhantomJS 說明及簡單實例
Selenium + PhantomJS 實現網站登錄
Selenium + PhantomJS 實現動態頁面數據爬取
爬蟲項目實戰:
分布式爬蟲+ Elasticsearch 打造搜索引擎

『玖』 python爬蟲的工作步驟

當前處於一個大數據的時代,一般網站數據來源有二:網站用戶自身產生的數據和網站從其他來源獲取的數據,今天要分享的是如何從其他網站獲取你想要的數據。

目前最適合用於寫爬蟲的語言是python,python中最受歡迎的爬蟲框架是scrapy,本文圍繞scrapy來展開講解爬蟲是怎麼工作的。

1.如下圖所示,爬蟲從編寫的spider文件中的start_urls開始,這個列表中的url就是爬蟲抓取的第一個網頁,它的返回值是該url對應網頁的源代碼,我們可以用默認的parse(self,response)函數去列印或解析這個源代碼

2.我們獲取到源代碼之後,就可以從網頁源代碼中找到我們想要的信息或需要進一步訪問的url,提取信息這一步,scrapy中集成了xpath,正則(re),功能十分強大,提取到信息之後會通過yield進入到中間件當中。

中間件包括爬蟲中間件和下載中間件,爬蟲中間件主要用於設置處理爬蟲文件中的代碼塊,下載中間件主要用於判斷爬蟲進入網頁前後的爬取狀態,在此中間件中,你可以根據爬蟲的返回狀態去做進一步判斷。

最後我們將yield過來的item,即就是我們想要的數據會在pipeline.py文件中進行處理,存入資料庫,寫入本地文件,都可以在這里進行,另外,為了減少代碼冗餘,建議所有與設置參數有關的參數,都寫在settings.py中去

閱讀全文

與python語言爬蟲怎麼寫相關的資料

熱點內容
解壓歌曲什麼歌最好 瀏覽:151
諾貝爾pdf 瀏覽:967
雲伺服器快速安裝系統原理 瀏覽:788
蘋果騰訊管家如何恢復加密相冊 瀏覽:115
手機軟體反編譯教程 瀏覽:858
sqlserver編程語言 瀏覽:650
gpa國際標准演算法 瀏覽:238
伺服器編程語言排行 瀏覽:947
怎麼下載快跑app 瀏覽:966
小紅書app如何保存視頻 瀏覽:170
如何解開系統加密文件 瀏覽:809
linux切換root命令 瀏覽:283
c編譯之後界面一閃而過怎麼辦 瀏覽:880
怎麼看ic卡是否加密 瀏覽:725
lgplc編程講座 瀏覽:809
cnc手動編程銑圓 瀏覽:723
cad中幾種命令的意思 瀏覽:327
oraclelinux安裝目錄 瀏覽:136
安卓系統可以安裝編譯器嗎 瀏覽:572
javajson實體類 瀏覽:693