最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python scrapy增量爬取實例及實現(xiàn)過程解析

 更新時間:2019年12月24日 08:49:11   作者:boardMan  
這篇文章主要介紹了Python scrapy增量爬取實例及實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了Python scrapy增量爬取實例及實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

開始接觸爬蟲的時候還是初學Python的那會,用的還是request、bs4、pandas,再后面接觸scrapy做個一兩個爬蟲,覺得還是框架好,可惜都沒有記錄都忘記了,現(xiàn)在做推薦系統(tǒng)需要爬取一定的文章,所以又把scrapy撿起來。趁著這次機會做一個記錄。

目錄如下:

  • 環(huán)境
  • 本地窗口調試命令
  • 工程目錄
  • xpath選擇器
  • 一個簡單的增量爬蟲示例
  • 配置介紹

環(huán)境

​自己的環(huán)境下安裝scrapy肯定用anaconda(再次強調anaconda的優(yōu)越性

本地窗口調試與運行

開發(fā)的時候可以利用scrapy自帶的調試功能進行模擬請求,這樣request、response都會與后面代碼保持一樣。

# 測試請求某網站
scrapy shell URL
# 設置請求頭
scrapy shell -s USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0" URL

# 指定爬蟲內容輸出文件格式(json、csv等
scrapy crawl SPIDER_NAME -o FILE_NAME.csv

# 創(chuàng)建爬蟲工程
scrapy startproject articles # 在當前目錄創(chuàng)建一個scrapy工程

新工程結構介紹

# spiders文件下存放所有爬蟲,item.py格式化數(shù)據輸出
# middlewares.py 設置請求細節(jié)(請求頭之類的),pipelines.py為數(shù)據輸出的管道,每一個封裝好的item都會經過這里
# settings.py 對工程進行全局設置(存放配置
├── articles
│  ├── articles
│  │  ├── __init__.py
│  │  ├── items.py
│  │  ├── middlewares.py
│  │  ├── pipelines.py
│  │  ├── settings.py
│  │  └── spiders
│  │    ├── healthy_living.py
│  │    ├── __init__.py
│  │    └── people_health.py
│  └── scrapy.cfg
├── README.en.md
└── README.md

頁面解析神器——Xpath選擇器

scrapy自帶xpath選擇器,很方便,簡單介紹一些常用的

# 全站爬取神器--LinkExtractor,可以自動獲取該標簽下的所有url跟text(因為網站結構大都一個套路
from scrapy.linkextractors import LinkExtractor
le = LinkExtractor(restrict_xpaths="http://ul[@class='nav2_UL_1 clearFix']")# 返回一個迭代器,通過循環(huán)(for i in le),可獲取url(i.url) (i.text)

# 獲取屬性class為所有aa的div標簽內容中的內容
response.xpath("http://div[@class='aa']/text()").extract()    # '//'代表獲取所有,'/'代表獲取第一個,類似的可以找屬性為ul的其它標簽

# 獲取內容包含“下一頁”的所有a標簽中包含的鏈接(提取下一頁鏈接神器
response.xpath("http://a[contains(text(),'下一頁')]/@href").extract()

一個簡單的增量爬取示例

這里增量爬取的思想很簡單:目標網站的數(shù)據都是按照時間排列的,所以在對某個連接進行request之前,先查詢數(shù)據庫中有沒有這條數(shù)據,如果有,就停止爬蟲,如果沒有發(fā)起請求

class HealthyLiving(scrapy.Spider):
  # 一定要一個全局唯一的爬蟲名稱,命令行啟動的時候需要指定該名稱
  name = "healthy_living"
  # 指定爬蟲入口,scrapy支持多入口,所以一定是lis形式
  start_urls = ['http://www.jkb.com.cn/healthyLiving/']

  '''
  抓取大類標簽入口
  '''
  def parse(self, response):
    le = LinkExtractor(restrict_xpaths="http://ul[@class='nav2_UL_1 clearFix']")
    for link in le.extract_links(response)[1:-1]:
      tag = link.text
      # 將這一級提取到的信息,通過請求頭傳遞給下一級(這里是為了給數(shù)據打標簽
      meta = {"tag": tag}
      # 依次解析每一個鏈接,并傳遞到下一級進行繼續(xù)爬取
      yield scrapy.Request(link.url, callback=self.parse_articles, meta=meta)

  '''
  抓取頁面內的文章鏈接及下一頁鏈接
  '''
  def parse_articles(self, response):
    # 接收上一級傳遞的信息
    meta = response.meta
    article_links = response.xpath("http://div[@class='txt']/h4/a/@href").extract()
    for link in article_links:
      res = self.collection.find_one({"article_url": link}, {"article_url": 1})
      full_meta = dict(meta)
      # 將文章鏈接傳入下一級
      full_meta.update({"article_url": link})
      if res is None:
        yield scrapy.Request(link, callback=self.parse_article, meta=full_meta)
      else:
        return
    next_page = response.xpath("http://div[@class='page']//a[contains(text(),'»')]/@href").extract()[0]
    if next_page:
      yield scrapy.Request(next_page, callback=self.parse_articles, meta=meta)

# 最后解析頁面,并輸出
  def parse_article(self, response):
   # 從item.py中導入數(shù)據封裝格式
    article_item = ArticlesItem()
    meta = response.meta
    # 利用xpath提取頁面信息并封裝成item
    try:
      article_item["tag"] = ""
      # ... 省略
    finally:
      yield article_item

工程配置介紹

設置請求頭、配置數(shù)據庫

# 設置請求頭,在middlewares.py中設定,在settings.py中啟用
class RandomUA(object):
  user_agents = [
      "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit"
      "/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36",
      "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
      "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit"
      "/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"
    ]

  def process_request(self, request, spider):
    request.headers["User-Agent"] = random.choice(self.user_agents)


# 設置數(shù)據入庫處理,在pipeline.py進行配置,在settings.py進行啟用
class MongoPipeline(object):
  def __init__(self, mongo_uri, mongo_db):
    self.mongo_uri = mongo_uri
    self.mongo_db = mongo_db

  @classmethod
  def from_crawler(cls, crawler):
    return cls(
      mongo_uri=crawler.settings.get('MONGO_URI'),
      mongo_db=crawler.settings.get('MONGO_DB')
    )

  def open_spider(self, spider):
    print("開始爬取", datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    self.client = pymongo.MongoClient(self.mongo_uri)
    self.db = self.client[self.mongo_db]

  def process_item(self, item, spider):
    data = self.db[item.collection].find_one({"title": item["title"], "date": item["date"]})

    if data is None:
      self.db[item.collection].insert(dict(item))
    # else:
    #   self.close_spider(self, spider)
    return item

  def close_spider(self, spider):
    print("爬取結束", datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    self.client.close()
# 在settings.py啟動:請求頭的修改,數(shù)據庫的配置
DOWNLOADER_MIDDLEWARES = {
  # 'articles.middlewares.ArticlesDownloaderMiddleware': 543,
  'articles.middlewares.RandomUA': 543,# 543代表優(yōu)先級,數(shù)字越低優(yōu)先級越高
}

ITEM_PIPELINES = {
  'articles.pipelines.MongoPipeline': 300,
}

# 一些其它配置
ROBOTSTXT_OBEY = True # 是否遵守網站的robot協(xié)議
FEED_EXPORT_ENCODING = 'utf-8' # 指定數(shù)據輸出的編碼格式
## 數(shù)據庫配置
MONGO_URI = ''
MONGO_DB = ''
MONGO_PORT = 27017
MONGO_COLLECTION = ''

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python連接達夢數(shù)據庫的實現(xiàn)示例

    Python連接達夢數(shù)據庫的實現(xiàn)示例

    本文主要介紹了Python連接達夢數(shù)據庫的實現(xiàn)示例,dmPython是DM提供的依據Python DB API version 2.0中API使用規(guī)定而開發(fā)的數(shù)據庫訪問接口,使Python應用程序能夠對DM數(shù)據庫進行訪問
    2023-12-12
  • Python獲取android設備cpu和內存占用情況

    Python獲取android設備cpu和內存占用情況

    這篇文章主要介紹了Python獲取android設備cpu和內存占用情況,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Python Django 頁面上展示固定的頁碼數(shù)實現(xiàn)代碼

    Python Django 頁面上展示固定的頁碼數(shù)實現(xiàn)代碼

    這篇文章主要介紹了Python Django 頁面上展示固定的頁碼數(shù)實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • python判斷字符串以什么結尾的實例方法

    python判斷字符串以什么結尾的實例方法

    在本篇文章里小編給大家整理了關于python判斷字符串以什么結尾的實例方法 ,需要的朋友們可以學習參考下。
    2020-09-09
  • Python OpenCV Hough直線檢測算法的原理實現(xiàn)

    Python OpenCV Hough直線檢測算法的原理實現(xiàn)

    這篇文章主要介紹了Python OpenCV Hough直線檢測算法的原理實現(xiàn),文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07
  • Python中打印詳細堆棧信息的技巧分享

    Python中打印詳細堆棧信息的技巧分享

    在 Python 開發(fā)過程中,調試是一個不可或缺的環(huán)節(jié),當代碼出現(xiàn)問題時,能夠快速準確地定位問題所在是提高開發(fā)效率的關鍵,堆棧信息作為程序執(zhí)行過程中的調用記錄,對于理解程序的運行狀態(tài)和定位錯誤至關重要,需要的朋友可以參考下
    2024-11-11
  • Python使用mmap實現(xiàn)內存映射文件操作

    Python使用mmap實現(xiàn)內存映射文件操作

    內存映射通??梢蕴岣逫/O的性能,本文主要介紹了Python使用mmap實現(xiàn)內存映射文件操作,分享給大家,感興趣的可以了解一下
    2021-06-06
  • Python使用pypinyin實現(xiàn)中文拼音轉換

    Python使用pypinyin實現(xiàn)中文拼音轉換

    pypinyin是一個Python庫,用于將中文漢字轉換為拼音,這篇文章主要為大家詳細介紹了pypinyin的基本用法并探討其應用場景,需要的可以參考下
    2024-02-02
  • Python實戰(zhàn)練習之終于對肯德基下手

    Python實戰(zhàn)練習之終于對肯德基下手

    讀萬卷書不如行萬里路,學的扎不扎實要通過實戰(zhàn)才能看出來,本篇文章手把手帶你爬下肯德基的官網,大家可以在過程中查缺補漏,看看自己掌握程度怎么樣
    2021-10-10
  • Python腳本暴力破解柵欄密碼

    Python腳本暴力破解柵欄密碼

    在滲透測試當中,免不了要進行密碼破解。本文通過好幾種方法給大家介紹python密碼破解,有通用腳本,F(xiàn)TP暴力破解腳本,SSH暴力破解,TELNET密碼暴力破解,感興趣的朋友一起學習吧
    2015-10-10

最新評論

武穴市| 永善县| 肥西县| 湘乡市| 潼南县| 沾益县| 锡林浩特市| 林口县| 加查县| 盘山县| 西昌市| 深水埗区| 扬州市| 芷江| 东安县| 潼关县| 太和县| 湖州市| 宜都市| 太康县| 沙坪坝区| 西乌| 准格尔旗| 延寿县| 永城市| 新化县| 中西区| 景宁| 青海省| 济阳县| 太和县| 绥宁县| 祁门县| 漯河市| 沈阳市| 化德县| 甘泉县| 唐山市| 亚东县| 古蔺县| 甘泉县|