二期Python爬蟲作業No.1一簡書

weixin_34377065發表於2017-05-23

糗事百科之前爬過類似的:
http://www.jianshu.com/p/a191726ed66d
為了集中注意力,主要爬簡書。簡書之前雖然2組的同學爬的很熱鬧,但我一次都沒有爬過。開營式上向右老師把我拎出來表揚了一下,果然根據人品守恆定律,這麼有代表性而且參考文章無數的網站我都爬的很辛苦...(其實是技能還沒過關)

根據圖片,第一級是jianshu.com,
第二級我選了class=note-list(試過id=list-container)也可以,然後第三級就按照以前爬過其他網站做的迴圈格式,選取了author,title,column等。


3775878-2e6356b63626d7bc.png
000.png

自己寫的程式碼:

url = 'http://www.jianshu.com'
html = requests.get(url, headers=getReqHeaders()).content
selector = etree.HTML(html)
infos= selector.xpath('//*[@class="note-list"]/li')
print(infos)

for info in infos:
     title=info.xpath('//a[@class="title"]/text()')[0]
     author=info.xpath('//div[@class="name"]/text()')[0]
     collection=info.xpath('//div[2]/a[1]/text()')[0]
     print title, '      ',author, '      ',collection

出來倒是出來了,但結果就好像鬼打牆一樣的迴圈...


3775878-8dba7d2c988de55c.png
圖片.png

如果把text後面的[0]依次改為[1]/[2]/[3],每一項倒是會一行行列出了,但我以前並不是這樣做的,從網頁結構也看不出來為什麼這次需要這樣做才出來。

所以主要還是xpath選取的不對。
後來程工改的程式碼:(我把原來的程式碼註釋在下面)

import random
import requests
from lxml import etree

def getReqHeaders():  # 功能:隨機獲取HTTP_User_Agent
    user_agents = ["Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"]
    user_agent = random.choice(user_agents)
    req_headers = {'User-Agent': user_agent}
    return req_headers

url = 'http://www.jianshu.com'
html = requests.get(url, headers=getReqHeaders()).content
selector = etree.HTML(html)
infos=selector.xpath('//div[@id="list-container"]/ul[@class="note-list"]/li')
#infos= selector.xpath('//*[@class="note-list"]/li')
print(infos)

for info in infos:
    author = info.xpath('div/div[1]/div/a/text()')[0]
    #author=info.xpath('//div[@class="name"]/text()')[0]
    authorurl = 'http://www.jianshu.com' + info.xpath('div/div[1]/div/a/@href')[0]
    title = info.xpath('div/a/text()')[0] if len(info.xpath('div/a/text()')) > 0 else ""
    #title=info.xpath('//a[@class="title"]/text()')[0]
    print title, '      ',author

程工的程式碼是直接copy xpath得到的,我開始也試過,但不知道為什麼不行,自己看的又辛苦(因為不很直觀)就改回class=name。總之還是技術不過關。

程工同時又翻出向右老師的參考文:《再談Scrapy抓取結構化資料》
http://www.jianshu.com/p/3d52e6046782
雖然是講scrapy,但也提到了簡書首頁的結構,我再對比一下。(從上到下分別是向右老師,程工,小白本人)

infos = selector.xpath('//ul[@class="note-list"]/li')
infos=selector.xpath('//div[@id="list-container"]/ul[@class="note-list"]/li')
#infos= selector.xpath('//*[@class="note-list"]/li')

for info in infos:
       title = info.xpath('div/a/text()').extract()[0]
       title = info.xpath('div/a/text()')[0]#if省略先
        #title=info.xpath('//a[@class="title"]/text()')[0]

        author = info.xpath('div/div[1]/div/a/text()').extract()[0]
        author = info.xpath('div/div[1]/div/a/text()')[0]
        #author=info.xpath('//div[@class="name"]/text()')[0]

以後還是要儘量多用右鍵copy xpath法,熟悉結構寫法,把各級抓取寫全面一些。
然後beautiful也要繼續熟練,這個月的挑戰還是很大啊!

相關文章