摘要:,引言最近一直在看爬蟲(chóng)框架,并嘗試使用框架寫(xiě)一個(gè)可以實(shí)現(xiàn)網(wǎng)頁(yè)信息采集的簡(jiǎn)單的小程序。本文主要介紹如何使用結(jié)合采集天貓商品內(nèi)容,文中自定義了一個(gè),用來(lái)采集需要加載的動(dòng)態(tài)網(wǎng)頁(yè)內(nèi)容。
1,引言
最近一直在看Scrapy 爬蟲(chóng)框架,并嘗試使用Scrapy框架寫(xiě)一個(gè)可以實(shí)現(xiàn)網(wǎng)頁(yè)信息采集的簡(jiǎn)單的小程序。嘗試過(guò)程中遇到了很多小問(wèn)題,希望大家多多指教。
本文主要介紹如何使用Scrapy結(jié)合PhantomJS采集天貓商品內(nèi)容,文中自定義了一個(gè)DOWNLOADER_MIDDLEWARES,用來(lái)采集需要加載js的動(dòng)態(tài)網(wǎng)頁(yè)內(nèi)容。看了很多介紹DOWNLOADER_MIDDLEWARES資料,總結(jié)來(lái)說(shuō)就是使用簡(jiǎn)單,但會(huì)阻塞框架,所以性能方面不佳。一些資料中提到了自定義DOWNLOADER_HANDLER或使用scrapyjs可以解決阻塞框架的問(wèn)題,有興趣的小伙伴可以去研究一下,這里就不多說(shuō)了。
2,具體實(shí)現(xiàn)需要執(zhí)行以下步驟,準(zhǔn)備Python開(kāi)發(fā)和運(yùn)行環(huán)境:
Python--官網(wǎng)下載安裝并部署好環(huán)境變量 (本文使用Python版本為3.5.1)
lxml-- 官網(wǎng)庫(kù)下載對(duì)應(yīng)版本的.whl文件,然后命令行界面執(zhí)行 "pip install .whl文件路徑"
Scrapy--命令行界面執(zhí)行 "pip install Scrapy",詳細(xì)請(qǐng)參考《Scrapy的第一次運(yùn)行測(cè)試》
selenium--命令行界面執(zhí)行 "pip install selenium"
PhantomJS -- 官網(wǎng)下載
上述步驟展示了兩種安裝:1,安裝下載到本地的wheel包;2,用Python安裝管理器執(zhí)行遠(yuǎn)程下載和安裝。注:包的版本需要和python版本配套
首先找到需要采集的網(wǎng)頁(yè),這里簡(jiǎn)單找了一個(gè)天貓商品,網(wǎng)址https://world.tmall.com/item/526449276263.htm,頁(yè)面如下:
然后開(kāi)始編寫(xiě)代碼,以下代碼默認(rèn)都是在命令行界面執(zhí)行
1),創(chuàng)建scrapy爬蟲(chóng)項(xiàng)目tmSpider
E:python-3.5.1>scrapy startproject tmSpider
2),修改settings.py配置
更改ROBOTSTXT_OBEY的值為False;
關(guān)閉scrapy默認(rèn)的下載器中間件;
加入自定義DOWNLOADER_MIDDLEWARES。
配置如下:
DOWNLOADER_MIDDLEWARES = { "tmSpider.middlewares.middleware.CustomMiddlewares": 543, "scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware": None }
3),在項(xiàng)目目錄下創(chuàng)建middlewares文件夾,然后在文件夾下創(chuàng)建middleware.py文件,代碼如下:
# -*- coding: utf-8 -*- from scrapy.exceptions import IgnoreRequest from scrapy.http import HtmlResponse, Response import tmSpider.middlewares.downloader as downloader class CustomMiddlewares(object): def process_request(self, request, spider): url = str(request.url) dl = downloader.CustomDownloader() content = dl.VisitPersonPage(url) return HtmlResponse(url, status = 200, body = content) def process_response(self, request, response, spider): if len(response.body) == 100: return IgnoreRequest("body length == 100") else: return response
4),使用selenium和PhantomJS寫(xiě)一個(gè)網(wǎng)頁(yè)內(nèi)容下載器,同樣在上一步創(chuàng)建好的middlewares文件夾中創(chuàng)建downloader.py文件,代碼如下:
# -*- coding: utf-8 -*- import time from scrapy.exceptions import IgnoreRequest from scrapy.http import HtmlResponse, Response from selenium import webdriver import selenium.webdriver.support.ui as ui class CustomDownloader(object): def __init__(self): # use any browser you wish cap = webdriver.DesiredCapabilities.PHANTOMJS cap["phantomjs.page.settings.resourceTimeout"] = 1000 cap["phantomjs.page.settings.loadImages"] = True cap["phantomjs.page.settings.disk-cache"] = True cap["phantomjs.page.customHeaders.Cookie"] = "SINAGLOBAL=3955422793326.2764.1451802953297; " self.driver = webdriver.PhantomJS(executable_path="F:/phantomjs/bin/phantomjs.exe", desired_capabilities=cap) wait = ui.WebDriverWait(self.driver,10) def VisitPersonPage(self, url): print("正在加載網(wǎng)站.....") self.driver.get(url) time.sleep(1) # 翻到底,詳情加載 js="var q=document.documentElement.scrollTop=10000" self.driver.execute_script(js) time.sleep(5) content = self.driver.page_source.encode("gbk", "ignore") print("網(wǎng)頁(yè)加載完畢.....") return content def __del__(self): self.driver.quit()
5) 創(chuàng)建爬蟲(chóng)模塊
在項(xiàng)目目錄E:python-3.5.1tmSpider,執(zhí)行如下代碼:
E:python-3.5.1 mSpider>scrapy genspider tmall "tmall.com"
執(zhí)行后,項(xiàng)目目錄E:python-3.5.1tmSpidertmSpiderspiders下會(huì)自動(dòng)生成tmall.py程序文件。該程序中parse函數(shù)處理scrapy下載器返回的網(wǎng)頁(yè)內(nèi)容,采集網(wǎng)頁(yè)信息的方法可以是:
使用xpath或正則方式從response.body中采集所需字段,
通過(guò)gooseeker api獲取的內(nèi)容提取器實(shí)現(xiàn)一站轉(zhuǎn)換所有字段,而且不用手工編寫(xiě)轉(zhuǎn)換用的xpath(如何獲取內(nèi)容提取器請(qǐng)參考python使用xslt提取網(wǎng)頁(yè)數(shù)據(jù)),代碼如下:
# -*- coding: utf-8 -*- import time import scrapy import tmSpider.gooseeker.gsextractor as gsextractor class TmallSpider(scrapy.Spider): name = "tmall" allowed_domains = ["tmall.com"] start_urls = ( "https://world.tmall.com/item/526449276263.htm", ) # 獲得當(dāng)前時(shí)間戳 def getTime(self): current_time = str(time.time()) m = current_time.find(".") current_time = current_time[0:m] return current_time def parse(self, response): html = response.body print("----------------------------------------------------------------------------") extra=gsextractor.GsExtractor() extra.setXsltFromAPI("31d24931e043e2d5364d03b8ff9cc77e", "淘寶天貓_商品詳情30474","tmall","list") result = extra.extract(html) print(str(result).encode("gbk", "ignore").decode("gbk")) #file_name = "F:/temp/淘寶天貓_商品詳情30474_" + self.getTime() + ".xml" #open(file_name,"wb").write(result)
6),啟動(dòng)爬蟲(chóng)
在E:python-3.5.1tmSpider項(xiàng)目目錄下執(zhí)行命令
E:python-3.5.1simpleSpider>scrapy crawl tmall
輸出結(jié)果:
提一下,上述命令只能一次啟動(dòng)一個(gè)爬蟲(chóng),如果想同時(shí)啟動(dòng)多個(gè)呢?那就需要自定義一個(gè)爬蟲(chóng)啟動(dòng)模塊了,在spiders下創(chuàng)建模塊文件runcrawl.py,代碼如下
# -*- coding: utf-8 -*- import scrapy from twisted.internet import reactor from scrapy.crawler import CrawlerRunner from tmall import TmallSpider ... spider = TmallSpider(domain="tmall.com") runner = CrawlerRunner() runner.crawl(spider) ... d = runner.join() d.addBoth(lambda _: reactor.stop()) reactor.run()
執(zhí)行runcrawl.py文件,輸出結(jié)果:
以自定義DOWNLOADER_MIDDLEWARES調(diào)用PhantomJs的方式實(shí)現(xiàn)爬蟲(chóng)后,在阻塞框架的問(wèn)題上糾結(jié)了很長(zhǎng)的時(shí)間,一直在想解決的方式。后續(xù)會(huì)研究一下scrapyjs,splash等其他調(diào)用瀏覽器的方式看是否能有效的解決這個(gè)問(wèn)題。
4,相關(guān)文檔1, Python即時(shí)網(wǎng)絡(luò)爬蟲(chóng):API說(shuō)明
5,集搜客GooSeeker開(kāi)源代碼下載源1, GooSeeker開(kāi)源Python網(wǎng)絡(luò)爬蟲(chóng)GitHub源
6,文檔修改歷史1,2016-07-04:V1.0
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/38042.html
摘要:開(kāi)源即時(shí)網(wǎng)絡(luò)爬蟲(chóng)項(xiàng)目將與基于的異步網(wǎng)絡(luò)框架集成,所以本例將使用采集淘寶這種含有大量代碼的網(wǎng)頁(yè)數(shù)據(jù),但是要注意本例一個(gè)嚴(yán)重缺陷用加載網(wǎng)頁(yè)的過(guò)程發(fā)生在中,破壞了的架構(gòu)原則。 showImg(https://segmentfault.com/img/bVyzAX); 1,引言 本文講解怎樣用Python驅(qū)動(dòng)Firefox瀏覽器寫(xiě)一個(gè)簡(jiǎn)易的網(wǎng)頁(yè)數(shù)據(jù)采集器。開(kāi)源Python即時(shí)網(wǎng)絡(luò)爬蟲(chóng)項(xiàng)目將與S...
摘要:,引言注釋上一篇爬蟲(chóng)實(shí)戰(zhàn)安居客房產(chǎn)經(jīng)紀(jì)人信息采集,訪(fǎng)問(wèn)的網(wǎng)頁(yè)是靜態(tài)網(wǎng)頁(yè),有朋友模仿那個(gè)實(shí)戰(zhàn)來(lái)采集動(dòng)態(tài)加載豆瓣小組的網(wǎng)頁(yè),結(jié)果不成功。 showImg(https://segmentfault.com/img/bVzdNZ); 1, 引言 注釋?zhuān)荷弦黄禤ython爬蟲(chóng)實(shí)戰(zhàn)(3):安居客房產(chǎn)經(jīng)紀(jì)人信息采集》,訪(fǎng)問(wèn)的網(wǎng)頁(yè)是靜態(tài)網(wǎng)頁(yè),有朋友模仿那個(gè)實(shí)戰(zhàn)來(lái)采集動(dòng)態(tài)加載豆瓣小組的網(wǎng)頁(yè),結(jié)果不成功...
摘要:嘮叨最近頻繁的給客戶(hù)做采集功能既然代碼無(wú)法公布所以一直想寫(xiě)個(gè)思路類(lèi)的文章既然是簡(jiǎn)單的爬蟲(chóng)那么一切自然以簡(jiǎn)單為原則能少用的都少用比如和這兩個(gè)神兵利器就被我省略了打造這只蟲(chóng)子就像是樵夫砍柴一般該磨刀還是要磨刀遠(yuǎn)觀拜拜山頭對(duì)象站點(diǎn)國(guó)內(nèi)知名電商平臺(tái) 嘮叨: 最近頻繁的給客戶(hù)做采集功能,既然代碼無(wú)法公布,所以一直想寫(xiě)個(gè)思路類(lèi)的文章.既然是簡(jiǎn)單的爬蟲(chóng),那么一切自然以簡(jiǎn)單為原則,能少用的都少用,比如...
摘要:可以看到在元的月餅銷(xiāo)量是反常的,說(shuō)明這個(gè)價(jià)格比較受人們歡迎。高檔的月餅在臨近中秋節(jié)會(huì)買(mǎi)的越來(lái)越好,這符合人們的消費(fèi)習(xí)慣。下一步重點(diǎn)研究買(mǎi)的好的店鋪,天貓超市與稻香村食品旗艦店,票券票務(wù)十年老店主要是賣(mài)月餅劵,后面會(huì)說(shuō)到。 造數(shù)帶你選月餅,點(diǎn)擊這里,過(guò)節(jié)再也不擔(dān)憂(yōu) showImg(https://segmentfault.com/img/remote/1460000011412184);...
摘要:項(xiàng)目簡(jiǎn)介本實(shí)驗(yàn)通過(guò)使用實(shí)現(xiàn)一個(gè)淘寶女郎圖片收集爬蟲(chóng),學(xué)習(xí)并實(shí)踐及正則表達(dá)式等知識(shí)。本教程由阿發(fā)布在實(shí)驗(yàn)樓,完整教程及在線(xiàn)練習(xí)地址實(shí)現(xiàn)淘女郎照片爬蟲(chóng),可以直接在教程中下載代碼使用。 showImg(https://segmentfault.com/img/bVBgrF); 項(xiàng)目簡(jiǎn)介:本實(shí)驗(yàn)通過(guò)使用 Python 實(shí)現(xiàn)一個(gè)淘寶女郎圖片收集爬蟲(chóng),學(xué)習(xí)并實(shí)踐 BeautifulSoup、Sel...
閱讀 3674·2021-11-16 11:41
閱讀 2879·2021-09-23 11:45
閱讀 686·2019-08-30 15:44
閱讀 538·2019-08-30 13:10
閱讀 1960·2019-08-30 12:49
閱讀 3525·2019-08-28 17:51
閱讀 1470·2019-08-26 12:20
閱讀 697·2019-08-23 17:56