Python爬蟲之爬取商品信息

需求

  • 爬取若干頁上的商品
  • 不包含推廣商品和轉(zhuǎn)轉(zhuǎn)商品
  • 獲取相應(yīng)商品的詳細信息掸读,例如:標題、發(fā)布時間、成色儿惫、價格澡罚、區(qū)域、瀏覽量等

開發(fā)環(huán)境

Win7 64bit肾请、Python3.5

代碼

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import requests
import time

agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'
cookie = 'f=n; f=n; id58=c5/ns1dl9yy83HPfDdvGAg==; ipcity=zz%7C%u90D1%u5DDE%7C0; als=0; __utma=253535702.38279276.1466300209.1466300209.1466300209.1; __utmc=253535702; __utmz=253535702.1466300209.1.1.utmcsr=zz.58.com|utmccn=(referral)|utmcmd=referral|utmcct=/; bj=201661993651; bj58_id58s="WEVVdFlpeD1VM3hkNjQ3MQ=="; sessionid=e2fa9381-317b-4e3f-9e1c-fd3705f6c894; myfeet_tooltip=end; 58home=bj; __track_id=20160619093746385471429630431203178; Hm_lvt_4d4cdf6bc3c5cb0d6306c928369fe42f=1466300268; Hm_lpvt_4d4cdf6bc3c5cb0d6306c928369fe42f=1466300268; city=bj; bdshare_firstime=1466300280136; bangbigtip2=1; f=n; final_history=26224745105338%2C25245379987755%2C26394563690054%2C26399654836521%2C26010296256313; bj58_new_session=0; bj58_init_refer=""; bj58_new_uv=3; 58tj_uuid=1b067d6e-d9f3-4b82-818b-3cdd2263501c; new_session=0; new_uv=3; utm_source=; spm=; init_refer='
referer = 'http://bj.58.com/pbdnipad/0/?PGTID=0d3065d1-0000-114f-c494-6fa3a1961632&ClickID=1'
headers = {'User-Agent':agent,'Cookie':cookie,'Referer':referer}

# 獲取頁面上除了推廣和轉(zhuǎn)轉(zhuǎn)外始苇,所有商品的鏈接,將鏈接存儲在list中返回筐喳。函數(shù)有兩個參數(shù)催式,end_page參數(shù),
# 表示要獲取商品的頁數(shù)避归,sale參數(shù)默認為0荣月,表示要獲取個人商品,若要獲取商家商品時梳毙,將sale置為1哺窄。
def get_links_from_page(end_page,sale=0):
    links= []
    for page in range(1,end_page+1):
        url = 'http://bj.58.com/pbdn/{}/pn{}/'.format(sale,page)
        r = requests.get(url, headers=headers)
        if r.status_code != 200:
            continue
        time.sleep(4)
        soup = BeautifulSoup(r.text, 'lxml')
        for tr in soup.select('#infolist > table.tbimg'):                #避開了推廣商品
            for item in tr.find_all('tr', class_=''):                         #避開了轉(zhuǎn)轉(zhuǎn)商品,注意class_的寫法
                links.append(item.select('td.t > a.t')[0].get('href'))
    # print(links)
    return links


# 獲取某一個商品的瀏覽量,瀏覽量是js控制的账锹,直接抓取標簽會返回0萌业,在headers中藥加入referer
def get_views(url):
    id = url.split('?')[0].split('/')[-1].strip('x.shtml')
    infoid = 'http://jst1.58.com/counter?infoid={}'.format(id)
    r = requests.get(infoid,headers=headers)
    views = r.text.split('=')[-1]
    return views

# 獲取商品的信息
def get_info(end_page,sale=0):
    urls = get_links_from_page(end_page,sale=0)
    for url in urls:
        r = requests.get(url, headers = headers)
        if r.status_code != 200:
            continue
        time.sleep(2)
        soup = BeautifulSoup(r.text, 'lxml')
        cate = soup.select('span > a[)
        title = soup.select('div > h1')
        date = soup.select('li.time')
        price = soup.select('span.price')
        state = soup.find_all('div', 'su_con')
        region = soup.select('.c_25d')

        data = {
            'category':cate[0].get_text(),
            'title':title[0].get_text(),
            'date':date[0].get_text(),
            'price':price[0].get_text(),
            'state':list(state[1].stripped_strings)[0],
            'region':''.join(list(region[0].stripped_strings)) if len(region)!=0 else '-',
            'seller':'個人' if sale == 0 else '商家',
            'views': get_views(r.url),   #重定向鏈接
        }
        print(data)

# 爬取前兩頁的信息
get_info(2)

運行結(jié)果

遇到的問題和解決方案

  1. 獲取瀏覽量時,Chrome一直顯示瀏覽量為0奸柬,即使刷新后也沒有變化生年,在Sources中也沒有發(fā)現(xiàn)任何URL返回瀏覽量信息。折騰了一個晚上廓奕,發(fā)現(xiàn)是chrome中的adblock plus沒關(guān)抱婉,關(guān)掉后一切正常了。

  2. 使用get_view()函數(shù)獲取瀏覽量桌粉,最初只把相應(yīng)的網(wǎng)站傳入蒸绩,結(jié)果發(fā)有一個商品的瀏覽量是0,后來發(fā)現(xiàn)該鏈接有重定向鏈接铃肯,使用r.url獲取重定向后的鏈接即可患亿。

  3. 選取網(wǎng)頁元素時,使用CSS Selector復制路徑即可押逼,但是復制的路徑不一定能用步藕,如果出現(xiàn)nth-child(),要改為nth-of-type()宴胧。路徑中的'>'兩邊要有空格漱抓,否則會報錯。

  4. <tbody>標簽導致無法正常選取標簽
    在最初編程時恕齐,為了避免選中推廣商品的標簽,曾將路徑設(shè)為#infolist > table.tbimg > tbody > tr > td.t > a.t(這樣依然會選中轉(zhuǎn)轉(zhuǎn)商品),結(jié)果竟然返回[]显歧。代碼如下:

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import requests

url = 'http://bj.58.com/pbdn/0/'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
tag = soup.select(#infolist > table.tbimg > tbody > tr > td.t > a.t)
print(tag)

#結(jié)果為[]

原因和解決方案:
雖然在Elements下存在tbody標簽仪或,但是網(wǎng)頁源代碼中并沒有該標簽,如果使用print(soup)士骤,發(fā)現(xiàn)結(jié)果中也沒有tbody標簽范删。在網(wǎng)頁中,tbody位于table中拷肌,用來提高解析速度到旦。將路徑改為#infolist > table.tbimg > tr > td.t > a.t即可。

總結(jié)

  1. 瀏覽量是JS控制的巨缘,不能通過選取標簽的方式獲取
  2. 標簽的選取需要逐步嘗試
  3. 為了避開網(wǎng)站的反爬機制添忘,需要添加headers,設(shè)置爬取的時間間隔
  4. 路徑的含義
    例如:#infolist > table.tbimg > tbody > tr a.t路徑若锁,table.tbimg指class=tbimg的table標簽搁骑,#infolist指id=infolist的標簽,> 代表直接子標簽又固,tr a.t之間的空格代表a是tr的間接子標簽仲器。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市仰冠,隨后出現(xiàn)的幾起案子乏冀,更是在濱河造成了極大的恐慌,老刑警劉巖洋只,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煤辨,死亡現(xiàn)場離奇詭異,居然都是意外死亡木张,警方通過查閱死者的電腦和手機众辨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舷礼,“玉大人鹃彻,你說我怎么就攤上這事∑尴祝” “怎么了蛛株?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長育拨。 經(jīng)常有香客問我谨履,道長,這世上最難降的妖魔是什么熬丧? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任笋粟,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘害捕。我一直安慰自己绿淋,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布尝盼。 她就那樣靜靜地躺著吞滞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盾沫。 梳的紋絲不亂的頭發(fā)上裁赠,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音赴精,去河邊找鬼佩捞。 笑死,一個胖子當著我的面吹牛祖娘,可吹牛的內(nèi)容都是我干的失尖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渐苏,長吁一口氣:“原來是場噩夢啊……” “哼掀潮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起琼富,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仪吧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鞠眉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薯鼠,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年械蹋,在試婚紗的時候發(fā)現(xiàn)自己被綠了出皇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡哗戈,死狀恐怖郊艘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情唯咬,我是刑警寧澤纱注,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站胆胰,受9級特大地震影響狞贱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜀涨,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一瞎嬉、第九天 我趴在偏房一處隱蔽的房頂上張望蝎毡。 院中可真熱鬧,春花似錦佑颇、人聲如沸顶掉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宰闰,卻和暖如春茬贵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背移袍。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工解藻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人葡盗。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓螟左,卻偏偏與公主長得像,于是被迫代替她去往敵國和親觅够。 傳聞我的和親對象是個殘疾皇子胶背,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 任務(wù)簡述 爬取58同城某頁面列表頁中,除了轉(zhuǎn)轉(zhuǎn)喘先、推廣商品之外的正常商品 要求爬取的商品信息包括:類目標題發(fā)帖時間價...
    如恒河沙閱讀 674評論 1 1
  • HTML標簽解釋大全 一钳吟、HTML標記 標簽:!DOCTYPE 說明:指定了 HTML 文檔遵循的文檔類型定義(D...
    米塔塔閱讀 3,247評論 1 41
  • HTML需要掌握標簽 標簽(空格分隔): H5+CSS [TOC] 常用標簽 img 注意點 和H系列標簽/p標簽...
    袁俊亮技術(shù)博客閱讀 2,051評論 1 8
  • 告別 告別 充滿了我們生命的 每一時每一刻 我發(fā)著牢騷 和沉默告別 我放下碗筷 和饑餓告別 我走出門外 和家庭告別...
    一了0820閱讀 402評論 2 6
  • 前幾天红且,帶仔仔小朋友去看牙醫(yī),他排在第二個涤姊,前面是一個六七歲的姐姐暇番,后面是一個六歲的哥哥。 我們進去候診室的時候思喊,...
    言靜思閱讀 435評論 0 2