摘要:前前后后弄了一個星期,看書寫代碼,我寫出了一個基本能用的爬蟲小代碼,地址代碼注釋都很詳細了,其實只要直接閱讀源碼即可。然后我網上找了一下資料,發現很多人推薦這個庫,自己下來用了一下,發現真的很舒服,所以果斷采用了。
現在網絡爬蟲有很多方式可以寫,比如Node.js或者Go, 甚至PHP都行,我之所以選擇Python的原因是因為教程多,可以系統學習,因為光懂得使用Html選擇器來爬去頁面是不夠的,我還要想學習一些爬蟲過程中常見的坑,以及一些注意事項,比如修改瀏覽器的Header之類的小技巧。
前前后后弄了一個星期,看書+寫代碼,我寫出了一個基本能用的python爬蟲小代碼,github地址:https://github.com/qiujumper/...
代碼注釋都很詳細了,其實只要直接閱讀源碼即可。
這個爬蟲的目的很簡單,爬去某個房產網站的樓盤名字+價格+1張圖片的下載(單純測試文件下載功能),以備之后分析房價走勢而用,為了不給對方服務器增加太多壓力,我只選擇了爬取3個頁面。
我這里說說幾個需要注意的知識點吧:
#記得修改發送的Headers
聽說默認發送過去的都是帶有python信息的頭,很容易被對方網站檢查出是一個爬蟲機器人,導致IP被封,所以最好讓自己的爬蟲程序像人類一點,但是這個代碼只能起到一般的隱瞞,真的有網站想防止爬蟲,你也是騙不過的,上代碼:
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,但是作為一個習慣了jquery的人來說,beautifulsoup的語法實在是有點拗口,而且貌似還不支持:first-child等高級復雜的css選擇器模式,或者支持,但是我沒找到,也不是很仔細看文檔。
然后我網上找了一下資料,發現很多人推薦pyquery這個庫,自己下來用了一下,發現真的很舒服,所以果斷采用了。
#爬蟲思路
思路其實很簡單:
1.找到某個房產的列表頁,分析第二第三頁的URL結構;
2.獲取每一個列表頁的所有列表條目信息的URL,存入python的set()集合中,之所以用set,是為了去掉重復的URL信息。
3.通過獲取的房子的URL,進入詳情頁,再爬去有價值的字段信息,比如圖片文字之類的。
4.目前我只進行簡單的print數據而已,沒有把獲取的數據存為本地的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 #引入系統對象 import os #你自己的配置文件,請將config-sample.py重命名為config.py,然后填寫對應的值即可 import config #定義鏈接集合,以免鏈接重復 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 #這個函數內部的路徑按照自己的真實情況來寫,方便之后的數據導入 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 #獲取當前頁面的所有連接 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 應該充滿了很多url的內容 for i in pages: getItemDetails(i) #print(pages)
有問題歡迎和我討論,這段代碼還可以繼續完善。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44283.html
摘要:源碼地址準備一臺云服務器寫好的腳本效果因為現在一個的客戶端啟動越來越慢,而且很多自己不感興趣的東西我只是想看看文章,所以就寫了這個小爬蟲。因為一個是每天點會更新,所以自己的服務器要做一個定時服務,下自帶了定時任務。 源碼地址:https://github.com/xcc3641/pySendOneToEmail 準備 一臺云服務器 寫好的Python腳本 效果 因為現在一個的And...
摘要:百度云搜索,搜各種資料搜網盤,搜各種資料模擬瀏覽器登錄方法,可以返回一個請求給爬蟲的起始網站,這個返回的請求相當于,返回的請求會替代里的請求請求,可以設置,回調函數表單提交,第一個必須參數,上一次響應的對象,其他參數,表單內容等可以將一個新 【百度云搜索,搜各種資料:http://www.bdyss.cn】 【搜網盤,搜各種資料:http://www.swpan.cn】 模擬瀏覽器登錄...
閱讀 1820·2021-11-23 09:51
閱讀 927·2021-10-08 10:05
閱讀 3421·2021-09-26 09:55
閱讀 1030·2021-09-22 15:21
閱讀 1626·2021-09-09 09:33
閱讀 1236·2019-08-30 15:56
閱讀 1275·2019-08-30 15:55
閱讀 958·2019-08-30 13:19