1. 程式人生 > >利用requests庫和pyquery庫爬取指定頁數的京東商品資訊

利用requests庫和pyquery庫爬取指定頁數的京東商品資訊

大概思路:首先利用requests庫獲取京東商品搜尋的頁面資訊,然後利用pyquery庫對爬取的資料進行分析,然後利用格式化輸出的方法輸出所爬取的資料。

要爬取的頁面截圖為

https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&wq=%E6%89%8B%E6%9C%BA&pvid=76b728d7f57f43b4bb933938d08bd38c

對前幾頁的網址進行分析可觀察出相應的規律

 第一頁:https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8& wq=%E6%89%8B%E6%9C%BA&pvid=76b728d7f57f43b4bb933938d08bd38c 第二頁:https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8& qrst=1&rt=1&stop=1&vt=2&wq=%E6%89%8B%E6%9C%BA&cid2=653&cid3=655&page=3&s=58&click=0 第三頁:https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8& qrst=1&rt=1&stop=1&vt=2&wq=%E6%89%8B%E6%9C%BA&cid2=653&cid3=655&page=5&s=114&click=0 第四頁:https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8& qrst=1&rt=1&stop=1&vt=2&wq=%E6%89%8B%E6%9C%BA&cid2=653&cid3=655&page=7&s=170&click=0

觀察前四頁的程式碼很容易發現他們之間的不同只是page=""的不同page頁數乘以2減一,所以我們可以設定URL=“https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8& qrst=1&rt=1&stop=1&vt=2&wq=%E6%89%8B%E6%9C%BA&cid2=653&cid3=655&page=”頁數可以設定為一個獨立的變數,這樣我們就可以自定義要爬取的頁數了。

原始碼如下:

import requests
from pyquery import PyQuery as pq       #因為PyQuery書寫的時候較為複雜所以用pq 代替
url='''https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&
qrst=1&rt=1&stop=1&vt=2&wq=%E6%89%8B%E6%9C%BA&cid2=653&cid3=655&page='''
num=eval(input("請輸入需要查詢結果的頁數"))           #自定義頁數
for ii in range(num):
    url=url+str(2*ii+1)
    r=requests.get(url)
    r.encoding="utf-8"           #這一行必不可少,缺少的話就會出現沒有結果的問題
    html=r.text
    print(type(html),len(html))
    text=pq(html)
    divs=text("div").filter(".p-name").items()      #items()可以讓divs 成為可以遍歷的型別
    prices=text("div").filter(".p-price").items()   #items()讓pricess 成為可以遍歷的型別
    print(type(divs))
    print(type(prices))
    name=[]
    price=[]
    t="{:^5}\t{:6}\t{:^30}"
    for div in divs:
        ems=div("a").attr("title")
        name.append(ems)
    for pricess in prices:
        price.append(pricess("i").text())
    for i in range(len(name)):
        print(t.format((30*ii)+i+1,price[i],name[i]))