本文介紹了Python數據抓取分析,分享給大家,具體如下:
編程模塊:requests,lxml,pymongo,time,BeautifulSoup
首先獲取所有產品的分類網址:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
def step(): try : headers = { 。。。。。 } r = requests.get(url,headers,timeout = 30 ) html = r.content soup = BeautifulSoup(html, "lxml" ) url = soup.find_all(正則表達式) for i in url: url2 = i.find_all( 'a' ) for j in url2: step1url = url + j[ 'href' ] print step1url step2(step1url) except Exception,e: print e |
我們在產品分類的同時需要確定我們所訪問的地址是產品還是又一個分類的產品地址(所以需要判斷我們訪問的地址是否含有if判斷標志):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
def step2(step1url): try : headers = { 。。。。 } r = requests.get(step1url,headers,timeout = 30 ) html = r.content soup = BeautifulSoup(html, "lxml" ) a = soup.find( 'div' , id = 'divTbl' ) if a: url = soup.find_all( 'td' , class_ = 'S-ITabs' ) for i in url: classifyurl = i.find_all( 'a' ) for j in classifyurl: step2url = url + j[ 'href' ] #print step2url step3(step2url) else : postdata(step1url) |
當我們if判斷后為真則將第二頁的分類網址獲取到(第一個步驟),否則執行postdata函數,將網頁產品地址抓取!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
def producturl(url): try : p1url = doc.xpath(正則表達式) for i in xrange ( 1 , len (p1url) + 1 ): p2url = doc.xpath(正則表達式) if len (p2url) > 0 : producturl = url + p2url[ 0 ].get( 'href' ) count = db[table].find({ 'url' :producturl}).count() if count < = 0 : sn = getNewsn() db[table].insert({ "sn" :sn, "url" :producturl}) print str (sn) + 'inserted successfully' else : 'url exist' except Exception,e: print e |
其中為我們所獲取到的產品地址并存入mongodb中,sn作為地址的新id。
下面我們需要在mongodb中通過新id索引來獲取我們的網址并進行訪問,對產品進行數據分析并抓取,將數據更新進數據庫內!
其中用到最多的BeautifulSoup這個模塊,但是對于存在于js的價值數據使用BeautifulSoup就用起來很吃力,所以對于js中的數據我推薦使用xpath,但是解析網頁就需要用到HTML.document_fromstring(url)方法來解析網頁。
對于xpath抓取價值數據的同時一定要細心!如果想了解xpath就在下面留言,我會盡快回答!
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
def parser(sn,url): try : headers = { 。。。。。。 } r = requests.get(url, headers = headers,timeout = 30 ) html = r.content soup = BeautifulSoup(html, "lxml" ) dt = {} #partno a = soup.find( "meta" ,itemprop = "mpn" ) if a: dt[ 'partno' ] = a[ 'content' ] #manufacturer b = soup.find( "meta" ,itemprop = "manufacturer" ) if b: dt[ 'manufacturer' ] = b[ 'content' ] #description c = soup.find( "span" ,itemprop = "description" ) if c: dt[ 'description' ] = c.get_text().strip() #price price = soup.find( "table" , class_ = "table table-condensed occalc_pa_table" ) if price: cost = {} for i in price.find_all( 'tr' ): if len (i) > 1 : td = i.find_all( 'td' ) key = td[ 0 ].get_text().strip().replace( ',' ,'') val = td[ 1 ].get_text().replace(u '\u20ac' ,'').strip() if key and val: cost[key] = val if cost: dt[ 'cost' ] = cost dt[ 'currency' ] = 'EUR' #quantity d = soup.find( "input" , id = "ItemQuantity" ) if d: dt[ 'quantity' ] = d[ 'value' ] #specs e = soup.find( "div" , class_ = "row parameter-container" ) if e: key1 = [] val1 = [] for k in e.find_all( 'dt' ): key = k.get_text().strip().strip( '.' ) if key: key1.append(key) for i in e.find_all( 'dd' ): val = i.get_text().strip() if val: val1.append(val) specs = dict ( zip (key1,val1)) if specs: dt[ 'specs' ] = specs print dt if dt: db[table].update({ 'sn' :sn},{ '$set' :dt}) print str (sn) + ' insert successfully' time.sleep( 3 ) else : error( str (sn) + '\t' + url) except Exception,e: error( str (sn) + '\t' + url) print "Don't data!" |
最后全部程序運行,將價值數據分析處理并存入數據庫中!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://www.cnblogs.com/zhuPython/p/7724242.html