scrapy docker教程

說(shuō)明:此文檔主要聚焦在Docker的使用上,必須配和爬蟲(chóng)教程 · 網(wǎng)絡(luò)爬蟲(chóng)教程一起使用。

注意:一定要配合入門(mén)教程 · 網(wǎng)絡(luò)爬蟲(chóng)教程

總結(jié)

先放干貨,使用docker來(lái)運(yùn)行scrapy其實(shí)只需要做到以下兩點(diǎn)即可:

1. 在項(xiàng)目的當(dāng)前目錄中

2. 在scrapy命令前加上docker run --name scrapy --rm -v $(pwd):/runtime/app aciobanu/scrapy

如果你已經(jīng)會(huì)使用scrapy了,看到這里就可以了。


下載鏡像

從Docker hub下載aciobanu/scrapy - Docker Hub并創(chuàng)建教程項(xiàng)目


$ mkdir ~/scrapy

$ cd ~/scrapy

$ docker run --rm -v $(pwd):/runtime/app aciobanu/scrapy startproject tutorial

以上命令中

-v是把當(dāng)前目錄映射到容器中的/runtime/app目錄

--rm是在停止容器后自動(dòng)刪除容器

執(zhí)行以上命令后會(huì)生成tutorial目錄,這些文件分別是:


scrapy.cfg: 項(xiàng)目的配置文件;(用于發(fā)布到服務(wù)器)
tutorial/: 該項(xiàng)目文件夾。之后將在此編寫(xiě)Python代碼。
tutorial/items.py: 項(xiàng)目中的item文件;(定義結(jié)構(gòu)化數(shù)據(jù)字段field).
tutorial/pipelines.py: 項(xiàng)目中的pipelines文件;(用于存放執(zhí)行后期數(shù)據(jù)處理的功能,定義如何存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù))
tutorial/settings.py: 項(xiàng)目的設(shè)置文件;(如何修改User-Agent,設(shè)置爬取時(shí)間間隔,設(shè)置代理,配置中間件等等)
tutorial/spiders/: 放置spider代碼的目錄;(編寫(xiě)爬取網(wǎng)站規(guī)則)

編寫(xiě)爬蟲(chóng)

編寫(xiě)第一個(gè)爬蟲(chóng)

接下來(lái)按入門(mén)教程 · 網(wǎng)絡(luò)爬蟲(chóng)教程編寫(xiě)第一個(gè)爬蟲(chóng)。(請(qǐng)先去看完教程再回來(lái)繼續(xù))

爬取

然后運(yùn)行以下命令執(zhí)行爬蟲(chóng)


docker run --rm -v $(pwd):/runtime/app aciobanu/scrapy scrapy crawl tencent

以上命令中最后的scrapy crawl tencent就是我們要執(zhí)行的命令

可以看到已經(jīng)生成了tengxun.txt

提取Item

接下來(lái)運(yùn)行命令


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ù)

按爬蟲(chóng)教程中修改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

注意最后的print要加括號(hào)。我運(yùn)行時(shí)不加括號(hào)會(huì)出錯(cuò)。

執(zhí)行以下命令:


docker run --name scrapy --rm -v $(pwd):/runtime/app aciobanu/scrapy scrapy crawl tencent -o items.json

查看生成的items.json文件的內(nèi)容,可以看到爬取的結(jié)果。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容