Python_網路爬蟲——京東商城商品列表


最近在拓展自己知識面,想學習一下其他的程式語言,處於多方的考慮最終選擇了Python,Python從釋出之初就以龐大的使用者叢集佔據了程式設計的一席之地,python用最少的語言完成最多的工作量,豐富的程式碼庫供學習使用。現行的python涉及了:大資料、機器學習、web開發、人工智慧等眾多方面

什麼是網路爬蟲

網路爬蟲是一個從web資源獲取所需要資料的過程,即直接從web資源獲取所需的資訊,而不是使用網站提供的執行緒的API訪問介面。

網路爬蟲也稱為網頁資料資源獲取,是一種資料獲取技術,通過該技術我們可以直接從網站的HTML獲取所需的資料其中包含與web資源進行通訊、剖解檔案獲取所需資料整理成資訊,及轉換成所需的資料格式。

簡單一點:就是通過網站的web介面獲取我們想要的資料,並以一定的格式儲存。每一次獲取就是請求一次網頁資源的過程,根據返回網頁的資訊,通過解析工具找到我們想要的資料資訊,並加以儲存便於後續使用。

網路爬蟲一般分為下面幾步:

  1. 確定訪問站點地址
  2. 分析HTML找到目標標籤
  3. 傳送請求獲取資源
  4. 使用工具剖析HTML頁面
  5. 獲取所需資源
  6. 儲存獲取資源

網路爬蟲可以用來做什麼

網路爬蟲用的方面很多,比如做大資料分析網路資料來源的獲取,收集一些文章,為了滿足內心獵奇現在一些美女寫真等。

網路爬蟲有一定的版權糾紛問題,所以開發者要有一定的判斷意識把握住心中的底線,如果出現越界行為只有法律來規定你的底線了。

網路爬蟲實戰案例——獲取京東商城列表

  1. 確定請求網址

    本次實戰案例為京東商城查詢列表

分析網站地址 url:https://search.jd.com/Search?keyword=手機&page=1

可以從網站地址中分析要傳入的引數:

keyword:搜尋關鍵字

page:頁碼

每頁的產品數:30

這裡在京東商城頁碼上有一個迷惑行為:在瀏覽器上切換頁碼是page的數為page*2-1的數字,實則每頁顯示使用者瀏覽到底部時又載入了一頁,故在瀏覽器上網頁資源上顯得有 60 條商品,每頁的實際大小為30

  1. 分析網站HTML找到目標標籤

    利用谷歌瀏覽器的F12或滑鼠右鍵檢查標籤,找到之際想要的標籤

程式需要引入的包

import requests as rq
from bs4 import BeautifulSoup as bfs
import json
import time
  1. 傳送請求獲取資源

    根據引數編寫生成產品列表方法
def get_urls(num):
URL = "https://search.jd.com/Search"
Param="?keyword=手機&page={}"
return [URL+Param.format(index) for index in range(1,num+1)]

傳送請求,為請求方法新增請求頭

#訪問網址
def get_requests(url):
header={
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
}
return rq.get(url,headers=header)
  1. 使用工具剖析HTML頁面

    將請求資訊轉義需要格式
def get_soup(r):
if r.status_code ==rq.codes.ok:
soup=bfs(r.text,"lxml")
else:
print("網路請求失敗...")
soup=None
return soup
  1. 獲取所需資源

    該頁面中查詢需要資訊,商品列表中的名稱、價格、店鋪名稱、店鋪連結、評論數

#獲取商品資訊
def get_goods(soup):
goods=[]
if soup !=None:
tab_div=soup.find('div',id="J_goodsList")
tab_goods=tab_div.find_all('div',class_="gl-i-wrap") for good in tab_goods:
name=good.find('div',class_="p-name").text price=good.find('div',class_="p-price").text
comment=good.find('div',class_="p-commit").find('strong').select_one("a").text
shop=good.find('div',class_="p-shop").find('span').find('a').text
shop_url=good.find('div',class_="p-shop").find('span').find('a')['href']
goods.append({"name":name,"price":price,"comment":comment,"shop":shop,"shop_url":shop_url}) return goods
  1. 儲存獲取資源

    儲存檔案格式為json格式,這裡可以替換成儲存其他格式,或儲存到業務庫中
def save_to_json(goods,file):
with open(file,"w",encoding="utf-8") as fp:
json.dump(goods,fp,indent=2,sort_keys=True,ensure_ascii=False)

程式主方法,將上面各功能組合在一起。實現解析全站

if __name__=="__main__":
goods=[]
a=0
for url in get_urls(30):
a+=1
print("當前訪問頁碼{},網址為:{}".format(a,url))
response=get_requests(url)
soup=get_soup(response)
page_goods= get_goods(soup)
goods+=page_goods
print("等待10秒進入下一頁...")
time.sleep(10) for good in goods:
print(good)
save_to_json(goods,"jd_phone2.json")

執行程式,檢視儲存檔案是否符合格式