成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

記錄一次用Python寫爬蟲的心得

james / 1273人閱讀

摘要:前前后后弄了一個星期,看書寫代碼,我寫出了一個基本能用的爬蟲小代碼,地址代碼注釋都很詳細(xì)了,其實(shí)只要直接閱讀源碼即可。然后我網(wǎng)上找了一下資料,發(fā)現(xiàn)很多人推薦這個庫,自己下來用了一下,發(fā)現(xiàn)真的很舒服,所以果斷采用了。

現(xiàn)在網(wǎng)絡(luò)爬蟲有很多方式可以寫,比如Node.js或者Go, 甚至PHP都行,我之所以選擇Python的原因是因?yàn)榻坛潭啵梢韵到y(tǒng)學(xué)習(xí),因?yàn)楣舛檬褂肏tml選擇器來爬去頁面是不夠的,我還要想學(xué)習(xí)一些爬蟲過程中常見的坑,以及一些注意事項(xiàng),比如修改瀏覽器的Header之類的小技巧。

前前后后弄了一個星期,看書+寫代碼,我寫出了一個基本能用的python爬蟲小代碼,github地址:https://github.com/qiujumper/...

代碼注釋都很詳細(xì)了,其實(shí)只要直接閱讀源碼即可。

這個爬蟲的目的很簡單,爬去某個房產(chǎn)網(wǎng)站的樓盤名字+價格+1張圖片的下載(單純測試文件下載功能),以備之后分析房價走勢而用,為了不給對方服務(wù)器增加太多壓力,我只選擇了爬取3個頁面。

我這里說說幾個需要注意的知識點(diǎn)吧:

#記得修改發(fā)送的Headers
聽說默認(rèn)發(fā)送過去的都是帶有python信息的頭,很容易被對方網(wǎng)站檢查出是一個爬蟲機(jī)器人,導(dǎo)致IP被封,所以最好讓自己的爬蟲程序像人類一點(diǎn),但是這個代碼只能起到一般的隱瞞,真的有網(wǎng)站想防止爬蟲,你也是騙不過的,上代碼:

headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit 537.36 (KHTML, like Gecko) Chrome",
                "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"},

#html的選擇器,我采用pyquery而不是beautifulsoup
很多書都推薦beautifulsoup,但是作為一個習(xí)慣了jquery的人來說,beautifulsoup的語法實(shí)在是有點(diǎn)拗口,而且貌似還不支持:first-child等高級復(fù)雜的css選擇器模式,或者支持,但是我沒找到,也不是很仔細(xì)看文檔。

然后我網(wǎng)上找了一下資料,發(fā)現(xiàn)很多人推薦pyquery這個庫,自己下來用了一下,發(fā)現(xiàn)真的很舒服,所以果斷采用了。

#爬蟲思路
思路其實(shí)很簡單:
1.找到某個房產(chǎn)的列表頁,分析第二第三頁的URL結(jié)構(gòu);
2.獲取每一個列表頁的所有列表?xiàng)l目信息的URL,存入python的set()集合中,之所以用set,是為了去掉重復(fù)的URL信息。
3.通過獲取的房子的URL,進(jìn)入詳情頁,再爬去有價值的字段信息,比如圖片文字之類的。
4.目前我只進(jìn)行簡單的print數(shù)據(jù)而已,沒有把獲取的數(shù)據(jù)存為本地的json或者CSV格式,這個之后做吧,to be done.

下面是全部代碼代碼:

#獲取頁面對象
from urllib.request import urlopen
from urllib.request import urlretrieve
from pyquery import PyQuery as pq
#修改請求頭模塊,模擬真人訪問
import requests
import time
#引入系統(tǒng)對象
import os

#你自己的配置文件,請將config-sample.py重命名為config.py,然后填寫對應(yīng)的值即可
import config

#定義鏈接集合,以免鏈接重復(fù)
pages = set()
session = requests.Session()
baseUrl = "http://pic1.ajkimg.com"
downLoadDir = "images"

#獲取所有列表頁連接
def getAllPages():
    pageList = []
    i = 1
    while(i < 2):
        newLink = "http://sh.fang.anjuke.com/loupan/all/p" + str(i) + "/"
        pageList.append(newLink)
        i = i + 1
    return pageList

def getAbsoluteURL(baseUrl, source):
    if source.startswith("http://www."):
        url = "http://"+source[11:] 
    elif source.startswith("http://"):
        url = source
    elif source.startswith("www."):
        url = "http://"+source[4:] 
    else:
        url = baseUrl+"/"+source 
    if baseUrl not in url:
        return None 
    return url

#這個函數(shù)內(nèi)部的路徑按照自己的真實(shí)情況來寫,方便之后的數(shù)據(jù)導(dǎo)入
def getDownloadPath(baseUrl, absoluteUrl, downloadDirectory): 
    path = absoluteUrl.replace("www.", "")
    path = path.replace(baseUrl, "")
    path = downloadDirectory+path
    directory = os.path.dirname(path)
    if not os.path.exists(directory): 
        os.makedirs(directory)
    return path

#獲取當(dāng)前頁面的所有連接
def getItemLinks(url):
    global pages;
    #先判斷是否能獲取頁面
    try:
        req = session.get(url, headers = config.value["headers"])
    #這個判斷只能判定是不是404或者500的錯誤,如果DNS沒法解析,是無法判定的
    except IOError as e:
        print("can not reach the page. ")
        print(e)
    
    else: 
        h = pq(req.text)
        #獲取第一頁的所有房子模塊
        houseItems = h(".item-mod")
        #從模塊中提取我們需要的信息,比如詳情頁的URL,價格,略縮圖等
        #我傾向只獲取詳情頁的URL,然后在詳情頁中獲取更多的信息
        for houseItem in houseItems.items():
            houseUrl = houseItem.find(".items-name").attr("href")
            #print(houseUrl)
            pages.add(houseUrl)
        
#獲取詳情頁的各種字段,這里可以讓用戶自己編輯
def getItemDetails(url):
    #先判斷是否能獲取頁面
    try:
        req = session.get(url, headers = config.value["headers"])
    #這個判斷只能判定是不是404或者500的錯誤,如果DNS沒法解析,是無法判定的
    except IOError as e:
        print("can not reach the page. ")
        print(e)
    else:
        time.sleep(1)
        h = pq(req.text)

        #get title
        housePrice = h("h1").text() if h("h1") != None else "none"

        #get price
        housePrice = h(".sp-price").text() if h(".sp-price") != None else "none"

        #get image url
        houseImage = h(".con a:first-child img").attr("src")
        houseImageUrl = getAbsoluteURL(baseUrl, houseImage)
        if houseImageUrl != None:
            urlretrieve(houseImageUrl, getDownloadPath(baseUrl, houseImageUrl, downLoadDir))     
        # if bsObj.find("em",{"class","sp-price"}) == None:
        #     housePrice = "None"
        # else:
        #     housePrice = bsObj.find("em",{"class","sp-price"}).text;
        # if bsObj.select(".con a:first-child .item img")== None:
        #     houseThumbnail = "None"
        # else:
        #     houseThumbnail = bsObj.select(".con a:first-child .item img");

        


#start to run the code
allPages = getAllPages()

for i in allPages:
    getItemLinks(i)
#此時pages 應(yīng)該充滿了很多url的內(nèi)容
for i in pages:
    getItemDetails(i)
#print(pages)

有問題歡迎和我討論,這段代碼還可以繼續(xù)完善。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44283.html

相關(guān)文章

  • [新手開源] 爬取韓寒“一個”文章且自動郵件發(fā)送功能

    摘要:源碼地址準(zhǔn)備一臺云服務(wù)器寫好的腳本效果因?yàn)楝F(xiàn)在一個的客戶端啟動越來越慢,而且很多自己不感興趣的東西我只是想看看文章,所以就寫了這個小爬蟲。因?yàn)橐粋€是每天點(diǎn)會更新,所以自己的服務(wù)器要做一個定時服務(wù),下自帶了定時任務(wù)。 源碼地址:https://github.com/xcc3641/pySendOneToEmail 準(zhǔn)備 一臺云服務(wù)器 寫好的Python腳本 效果 因?yàn)楝F(xiàn)在一個的And...

    zhkai 評論0 收藏0
  • 12、web爬蟲講解2—Scrapy框架爬蟲—Scrapy模擬瀏覽器登錄—獲取Scrapy框架Coo

    摘要:百度云搜索,搜各種資料搜網(wǎng)盤,搜各種資料模擬瀏覽器登錄方法,可以返回一個請求給爬蟲的起始網(wǎng)站,這個返回的請求相當(dāng)于,返回的請求會替代里的請求請求,可以設(shè)置,回調(diào)函數(shù)表單提交,第一個必須參數(shù),上一次響應(yīng)的對象,其他參數(shù),表單內(nèi)容等可以將一個新 【百度云搜索,搜各種資料:http://www.bdyss.cn】 【搜網(wǎng)盤,搜各種資料:http://www.swpan.cn】 模擬瀏覽器登錄...

    jay_tian 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<