說明:此文檔主要聚焦在Docker的使用上嘱巾,必須配和爬蟲教程 · 網(wǎng)絡爬蟲教程一起使用谷炸。
注意:一定要配合入門教程 · 網(wǎng)絡爬蟲教程
總結(jié)
先放干貨灶平,使用docker來運行scrapy其實只需要做到以下兩點即可:
1. 在項目的當前目錄中
2. 在scrapy命令前加上docker run --name scrapy --rm -v $(pwd):/runtime/app aciobanu/scrapy
如果你已經(jīng)會使用scrapy了惕蹄,看到這里就可以了绎狭。
下載鏡像
從Docker hub下載aciobanu/scrapy - Docker Hub并創(chuàng)建教程項目
$ mkdir ~/scrapy
$ cd ~/scrapy
$ docker run --rm -v $(pwd):/runtime/app aciobanu/scrapy startproject tutorial
以上命令中
-v
是把當前目錄映射到容器中的/runtime/app
目錄
--rm
是在停止容器后自動刪除容器
執(zhí)行以上命令后會生成tutorial
目錄关带,這些文件分別是:
scrapy.cfg: 項目的配置文件侥涵;(用于發(fā)布到服務器)
tutorial/: 該項目文件夾。之后將在此編寫Python代碼宋雏。
tutorial/items.py: 項目中的item文件;(定義結(jié)構(gòu)化數(shù)據(jù)字段field).
tutorial/pipelines.py: 項目中的pipelines文件;(用于存放執(zhí)行后期數(shù)據(jù)處理的功能芜飘,定義如何存儲結(jié)構(gòu)化數(shù)據(jù))
tutorial/settings.py: 項目的設置文件;(如何修改User-Agent磨总,設置爬取時間間隔嗦明,設置代理,配置中間件等等)
tutorial/spiders/: 放置spider代碼的目錄;(編寫爬取網(wǎng)站規(guī)則)
編寫爬蟲
編寫第一個爬蟲
接下來按入門教程 · 網(wǎng)絡爬蟲教程編寫第一個爬蟲蚪燕。(請先去看完教程再回來繼續(xù))
爬取
然后運行以下命令執(zhí)行爬蟲
docker run --rm -v $(pwd):/runtime/app aciobanu/scrapy scrapy crawl tencent
以上命令中最后的
scrapy crawl tencent
就是我們要執(zhí)行的命令
可以看到已經(jīng)生成了tengxun.txt
提取Item
接下來運行命令
docker run -it --rm -v $(pwd):/runtime/app aciobanu/scrapy scrapy shell "[http://hr.tencent.com/position.php?&start=0#a"](http://hr.tencent.com/position.php?&start=0#a")
以上命令中的
-it
意思是啟用交互式命令行
嘗試Selector選擇器
之后可以嘗試以下命令
response.xpath('//title')
response.xpath('//title').extract()
print response.xpath('//title').extract()[0]
response.xpath('//title/text()')
response.xpath('//title/text()')[0].extract()
print response.xpath('//title/text()')[0].extract()
response.xpath('//title/text()').re('(\w+):')
還可以嘗試更多的提取參數(shù)娶牌,查看輸出內(nèi)容的變化。
最后輸入quit()
關(guān)閉容器馆纳。
提取數(shù)據(jù)
按爬蟲教程中修改tencent_spider.py
文件內(nèi)容如下:
import scrapy
from tutorial.items import RecruitItem
class RecruitSpider(scrapy.spiders.Spider):
name = "tencent"
allowed_domains = ["hr.tencent.com"]
start_urls = [
"https://hr.tencent.com/position.php?&start=0#a"
]
def parse(self, response):
for sel in response.xpath('//*[@class="even"]'):
name = sel.xpath('./td[1]/a/text()').extract()[0]
detailLink = sel.xpath('./td[1]/a/@href').extract()[0]
catalog = sel.xpath('./td[2]/text()').extract()[0]
recruitNumber = sel.xpath('./td[3]/text()').extract()[0]
workLocation = sel.xpath('./td[4]/text()').extract()[0]
publishTime = sel.xpath('./td[5]/text()').extract()[0]
print(name, detailLink, catalog,recruitNumber,workLocation,publishTime)
item = RecruitItem()
item['name']=name.encode('utf-8')
item['detailLink']=detailLink.encode('utf-8')
item['catalog']=catalog.encode('utf-8')
item['recruitNumber']=recruitNumber.encode('utf-8')
item['workLocation']=workLocation.encode('utf-8')
item['publishTime']=publishTime.encode('utf-8')
yield item
注意最后的
執(zhí)行以下命令:
docker run --name scrapy --rm -v $(pwd):/runtime/app aciobanu/scrapy scrapy crawl tencent -o items.json
查看生成的items.json
文件的內(nèi)容鲁驶,可以看到爬取的結(jié)果累榜。