python 網路爬蟲(二) 爬取淘寶裏的手機報價並以價格排序

今天要寫的是以前寫過的一個程序,而後把它整理下,鞏固下知識點,並對以前的代碼進行一些改進。html

今天要爬取的是淘寶裏的關於手機的報價的信息,並按照本身想要價格來篩選。正則表達式

要是有什麼問題但願大佬能指出個人錯誤。app

先列出代碼中要用到的URL:函數

淘寶搜索手機的url:https://s.taobao.com/search?q=手機&s=0post

代碼用到的是requests - re學習

第一步:url

先分析這個url,」?「後面的都是它的關鍵字,requests中get函數的關鍵字的參數是params,post函數的關鍵字參數是data,spa

關鍵字用字典的形式傳進去,這樣咱們就能夠本身改關鍵字去搜索別的東西或者是搜索別的頁面,我對手機比較感興趣因此code

就爬取了關於手機的頁面。😁orm

第二步:

直接先給出源代碼,而後細節再慢慢的說。

# encoding:utf8
import requests
import re
def printGoodsList(list):
    list = sorted(list,key=lambda x: x[1],reverse=True)
    m = '{:16}\t{:8}'
    print(m.format("商品名稱", "商品價格"))
    for i in list:
        print(m.format(i[0],i[1]))
def main():
    phone = []
    data={
        'q':'手機',
        's':0
        }
    url = 'https://s.taobao.com/search'
    for i in range(0,48*10,48):
        data['s'] = i
        try:
            r = requests.get(url,params=data)
            r.encoding=r.apparent_encoding
            html = r.text
            reg = r'"title":"(.*?)".*?"price":"(.*?)"'
            phonelist = re.findall(reg, html)
        except:
            print("失敗")
        for a in phonelist:
            if(int(a[1])>4000):
                phone.append((a[0],int(a[1])))
    printGoodsList(phone)

main()

從main函數裏看:

先定義一個phone的列表存儲關於手機的信息。

而後定義一個data的字典,裏面是url關鍵字的信息。

用一個for循環爬取多頁的信息。

for循環裏:

 r = requests.get(url,params=data)
 r.encoding=r.apparent_encoding
 html = r.text

這些是獲取頁面信息。

reg = r'"title":"(.*?)".*?"price":"(.*?)"'
phonelist = re.findall(reg, html)

用最簡單的正則表達式 .*? 提取出咱們想要的手機的名字跟手機的價格(正則表達式尚未深刻去學習🙄),有小夥伴想

獲取其餘的信息也能夠本身去試試匹配你想要提取的信息,而後把提取出來的信息存放到phonelist裏。獲取網頁信息當中要用

try except,捕捉出現的異常。

for a in phonelist:
            if(int(a[1])>4000):
                phone.append((a[0],int(a[1])))

再用一個for循環把提取到的信息添加在phone列表裏(以元組的形式存放進去,由於方便以後的排序),固然你也能夠再篩選其中的信息,

我就是篩選了價格高於四千的手機,看下土豪用的都是些什麼手機🤣。

而後調用printGoodsList函數,接下來咱們說說這個函數:

def printGoodsList(list):
    list = sorted(list,key=lambda x: x[1],reverse=True)
    m = '{:16}\t{:8}'
    print(m.format("商品名稱", "商品價格"))
    for i in list:
        print(m.format(i[0],i[1]))

函數裏的一個行用到的是sorted函數,這個函數有幾個參數,第一個是可迭代的對象,第二個是具備兩個參數的比較的函數,第三個是進行

比較的元素,只有一個參數,最後一個參數是排序規則,默認值是False,從小到大的排序。

我用到的是lambda這個匿名函數,而後把排序後的信息賦值給list

後面就是輸出咱們排好序的信息。

總結:


寫這個代碼的時候給我最大的困難就是排序,我以前是把提取出來的信息以列表的信息存放在phone列表中,後來發現這樣沒法根據其中的一個元素

來排序,後面百度發現元組能夠這樣,因此我後來改用了元組。若是有大佬知道什麼其餘的排序的方法但願大佬們能夠指點指點熱愛學習的小菜鳥。

相關文章
相關標籤/搜索