Python BeautifulSoupとRequests爬虫類は中関村の携帯電話の資料を取ります

44458 ワード

**
一、事前準備
**目標:www.zolを這い取る.com.cnの収集資料、各種パラメータライブラリ:BeautifulSoupとrequests.BeautifulSoupライブラリのfindとfind_allには基本的な理解があり、requestsライブラリのgetメソッドについて基本的な理解があります.原網ページ分析:URL:(第1ページ)http://detail.zol.com.cn/cell_phone_index/subcate57_0_list_1_0_1_1_0_1.html分析ページ要素:マウスの右ボタン→審査要素→「Elements」→ページの更新→データがザラザラと表示されます.
**
二、シロウォーミングアップ
**以下の暴力はホームページの一部を抜粋して整理して、これを例にして、まずみんなに1つの直観的な感じを与えて、すぐに1段のコードが来ないようにして、どこから手をつけて、頭はすべて大きくなりました~~~まず下のこの段をコピーして、自分で実行してみます
html="""

OPPO Ace 2(8 GB/128 GB/フルネット /5 G )

  • 4G : TD-LTE
  • 6.55 2400x1080
  • CPU : 865
2698 [128GB ] 2020-05-14

1 のオファー

iQOO Neo 3(6 GB/128 GB/フルネット /5 G )

  • 4G : TD-LTE
  • 6.57 4800x1080
  • CPU : 865
5988 [128GB ] 2020-05-14

92 のオファー

"""
from bs4 import BeautifulSoup
soup=BeautifulSoup(html,"html.parser")
a=soup.find("div",class_="list-box").find_all("div",class_="price-box")
print(a)
print("find_all      :",len(a))
print("find_all      :",type(a))
#print("find_all        :",a[0])
for i in a:
    print(i.find("b",class_="price-type").string)
    print("......","  find_all         'b'   ","......")
>>>[<div class="price-box">
<span class="price price-normal"><b class="price-sign"></b>
<b class="price-type">2698</b>
</span><span class="price-attr">[128GB  ]</span>
<span class="date">2020-05-14</span>
<p class="mernum"><a href="/1319/1318500/price.shtml" target="_blank">1     </a></p>
<a class="base" href="/1319/1318500/price.shtml" target="_blank">    </a>
</div>, <div class="price-box">
<span class="price price-normal"><b class="price-sign"></b>
<b class="price-type">5988</b>
</span><span class="price-attr">[128GB     ]</span>
<span class="date">2020-05-14</span>
<p class="mernum"><a href="/1316/1315874/price.shtml" target="_blank">92     </a></p>
<a class="base" href="/1316/1315874/price.shtml" target="_blank">    </a>
</div>]

find_all      : 2
find_all      : <class 'bs4.element.ResultSet'>
2698
......   find_all         'b'    ......
5988
......   find_all         'b'    ......
>>> 
for i in soup.find("div",class_="list-box").find_all("div",class_="pro-intro"):
    print(i.find("span").string)
    print(type(i.find("span").string))
    print(i.find("span").string[1])
>>>4G  :
<class 'bs4.element.NavigableString'>
G
4G  :
<class 'bs4.element.NavigableString'>
G
from bs4 import BeautifulSoup as bs
soup=bs(html,"html.parser")
for i in soup.find("div",class_="list-box").find_all("div",class_="pro-intro"):
    print(i.find("h3").string)
    for j in i.find("ul",class_="param clearfix").find_all("li")[1:]:
        print(j)
>>>OPPO Ace2(8GB/128GB/   /5G )
<li title="6.55    2400x1080  "><span></span>6.55    2400x1080  </li>
<li title="     865"><span>CPU  :</span>     865</li>
iQOO Neo3(6GB/128GB/   /5G )
<li title="6.57    2408x1080  "><span></span>6.57    4800x1080  </li>
<li title="     865"><span>CPU  :</span>     865</li>
from bs4 import BeautifulSoup as bs
soup=bs(html,"html.parser")
for i in soup.find("div",class_="list-box").find_all("div",class_="pro-intro"):
    print(i.find("h3").string)
    for j in i.find("ul",class_="param clearfix").find_all("li")[1:]:
        print(j.find("span").string[:-1])

>>>OPPO Ace2(8GB/128GB/   /5G )
    
CPU  
iQOO Neo3(6GB/128GB/   /5G )
    
CPU  
from bs4 import BeautifulSoup as bs
soup=bs(html,"html.parser")
for i in soup.find("div",class_="list-box").find_all("div",class_="pro-intro"):
    for j in i.find("ul",class_="param clearfix").find_all("li")[1:]:
        print(j["title"])
        
>>>6.55    2400x1080  
     865
6.57    2408x1080  
     865
>>> 

一歩一歩テストし、得られた結果が予想に合っているかどうかを確認し、絶えず改善しています.
上の点ができたら,次は当たり前のようにして,動き出した.
**
三、実戦
**
実は主な内容はすべて下の2枚の図の中で、あなたはマウスをこれらの色とりどりのコードの上でホームページに置くだけで影が覆われて、このようにどのコードがホームページのどの内容に対応するかを見ることができます.このコードを確定したら、このコードの分析に専念して、それがどんな特徴があるかを見て、Pythonでそれを位置決めして、あなたが望んでいるPython BeautifulSoup和Requests爬虫爬取中关村手机资料_第1张图片 Python BeautifulSoup和Requests爬虫爬取中关村手机资料_第2张图片を取得することができます.
import time
import requests
from bs4 import BeautifulSoup as bs
import pandas as pd

def get_value(url):
    soup=bs(htmltext,"html.parser")
    Dic1={
     "NAME":[],"PRICE":[],"DATE":[]}
    Dic2={
     }
    num=0
    for z in soup.find("div",class_="list-box").find_all("div",class_="price-box"):
        try:
            price=z.find("b",class_="price-type").string
        except:
            price="n/a"
        Dic1["PRICE"].append(price)
        try:
            shelfdate=z.find("span",class_="date").string
        except:
            shelfdate="n/a"
        Dic1["DATE"].append(shelfdate)
    for i in soup.find("div",class_="list-box").find_all("div",class_="pro-intro"):
        a=i.find("h3").find("a").string
        Dic1["NAME"].append(a)
        for j in i.find("ul",class_="param clearfix").find_all("li")[1:]:
            c1=j.find("span").string[:-1]
            if c1 not in Dic1:
                Dic1[c1]=["N/A"]*num
            Dic2[c1]=j["title"]
        for key in Dic1:
            if key!="NAME" and key!="PRICE" and key!="DATE":
                try:
                    Dic1[key].append(Dic2[key])
                except:
                    Dic1[key].append("N/A")
        num+=1
    return Dic1
total=[]
for i in range(1,3):
    url="http://detail.zol.com.cn/cell_phone_index/subcate57_0_list_1_0_1_1_0_{0}.html".format(i)
    head={
     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
    response=requests.get(url,headers=head)
    response.encoding=response.apparent_encoding
    htmltext=response.text
    d=get_value(url)
    data=pd.DataFrame(d)
    data=data.loc[:,["NAME","CPU  ","    ","    ","CPU  ","     ","RAM  ","DATE","PRICE"]]
    total.append(data)
    D=pd.concat(total,ignore_index=True)
    print("---   ",i," ,   ",len(D["NAME"])," ,   ",len(D["NAME"])," ")
    time.sleep(3)
D.to_csv(r"c:\users\admin\desktop\       .csv")
print("    ,   ",len(D["NAME"])," ")
data.head()
            

---    14848  
---    2969696  
>>> 

参照先:https://blog.csdn.net/qq_40523096/article/details/88544692