scrapy 프레임 의 파충류
scrapy 프레임 워 크 는 여러분 이 잘 아 실 거 라 고 믿 습 니 다.안에 매우 많은 복잡 한 메커니즘 이 있어 본문의 범 위 를 넘 어 섰 다.
1. 파충류 거미
tips:
1. xpath 의 문법 은 비교적 구덩이 이지 만 chrome 에 xpath helper 를 설치 하여 xpath 정규 표현 식 을 쉽게 해결 할 수 있 습 니 다.
2. 동태 적 인 내용, 예 를 들 어 가격 등 은 얻 을 수 없 는 것 이다.
3. 본 코드 에서 일부 코드 를 추출 하여 xpath 대상 과 관련 된 체인 호출 을 참고 할 수 있 습 니 다.
# -*- coding: utf-8 -*-
# import scrapy # ,
from scrapy.spiders import Spider
from scrapy.selector import Selector
from scrapy import Request
from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor
from jdbook.items import JDBookItem # pyCharm ,
class JDBookSpider(Spider):
name = "jdbook"
allowed_domains = ["jd.com"] # ,
start_urls = [
# url, tid , 0
"http://item.jd.com/11678007.html"
]
# , chrome cookie ,
cookies = {}
# http , ,
headers = {
# 'Connection': 'keep - alive',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36'
}
#
meta = {
'dont_redirect': True, #
'handle_httpstatus_list': [301, 302] #
}
def get_next_url(self, old_url):
'''
description: url
:param oldUrl: url
:return: url
'''
# url :http://www.heartsong.top/forum.php?mod=viewthread&tid=34
list = old_url.split('/') #
old_item_id = int(list[3].split('.')[0])
new_item_id = old_item_id - 1
if new_item_id == 0: # tid 0 , ,
return
new_url = '/'.join([list[0], list[1], list[2], str(new_item_id)+ '.html']) # url
return str(new_url) # url
def start_requests(self):
"""
, Request
:return:
"""
# headers、cookies self.start_urls[0], response
# parse
yield Request(self.start_urls[0], callback=self.parse, headers=self.headers, cookies=self.cookies, meta=self.meta)
def parse(self, response):
"""
:param response:
:return:
"""
selector = Selector(response)
item = JDBookItem()
extractor = LxmlLinkExtractor(allow=r'http://item.jd.com/\d.*html')
link = extractor.extract_links(response)
try:
item['_id'] = response.url.split('/')[3].split('.')[0]
item['url'] = response.url
item['title'] = selector.xpath('/html/head/title/text()').extract()[0]
item['keywords'] = selector.xpath('/html/head/meta[2]/@content').extract()[0]
item['description'] = selector.xpath('/html/head/meta[3]/@content').extract()[0]
item['img'] = 'http:' + selector.xpath('//*[@id="spec-n1"]/img/@src').extract()[0]
item['channel'] = selector.xpath('//*[@id="root-nav"]/div/div/strong/a/text()').extract()[0]
item['tag'] = selector.xpath('//*[@id="root-nav"]/div/div/span[1]/a[1]/text()').extract()[0]
item['sub_tag'] = selector.xpath('//*[@id="root-nav"]/div/div/span[1]/a[2]/text()').extract()[0]
item['value'] = selector.xpath('//*[@id="root-nav"]/div/div/span[1]/a[2]/text()').extract()[0]
comments = list()
node_comments = selector.xpath('//*[@id="hidcomment"]/div')
for node_comment in node_comments:
comment = dict()
node_comment_attrs = node_comment.xpath('.//div[contains(@class, "i-item")]')
for attr in node_comment_attrs:
url = attr.xpath('.//div/strong/a/@href').extract()[0]
comment['url'] = 'http:' + url
content = attr.xpath('.//div/strong/a/text()').extract()[0]
comment['content'] = content
time = attr.xpath('.//div/span[2]/text()').extract()[0]
comment['time'] = time
comments.append(comment)
item['comments'] = comments
except Exception, ex:
print 'something wrong', str(ex)
print 'success, go for next'
yield item
next_url = self.get_next_url(response.url) # response.url url
if next_url != None: # url
yield Request(next_url, callback=self.parse, headers=self.headers, cookies=self.cookies, meta=self.meta)
2. 저장 관: pipelines
tips:
1. 본 pipelines 는 기어 오 르 는 데 이 터 를 mongo 에 저장 합 니 다. 로 컬 파일 을 쓰 는 것 보다 믿 을 수 있 습 니 다. 특히 다 중 인 스 턴 스 나 분포 식 상황 입 니 다.
# -*- coding: utf-8 -*-
import pymongo
from datetime import datetime
from scrapy.exceptions import DropItem
class JDBookPipeline(object):
def __init__(self, mongo_uri, mongo_db, mongo_coll):
self.ids = set()
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
self.mongo_coll = mongo_coll
@classmethod
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DB'),
mongo_coll=crawler.settings.get('MONGO_COLL')
)
def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
#
# self.client.admin.authenticate(settings['MINGO_USER'], settings['MONGO_PSW'])
self.db = self.client[self.mongo_db]
self.coll = self.db[self.mongo_coll]
def close_spider(self, spider):
self.client.close()
def process_item(self, item, spider):
if item['_id'] in self.ids:
raise DropItem("Duplicate item found: %s" % item)
if item['channel'] != u' ':
raise Exception('not book')
else:
#self.coll.insert(dict(item))
# collection
self.ids.add(item['_id'])
collection_name = item.__class__.__name__ + '_' + str(datetime.now().date()).replace('-', '')
self.db[collection_name].insert(dict(item))
return item
3. 데이터 구조: items
tips:
1, scrapy 의 item 보고 웃 었 다.
# -*- coding: utf-8 -*-
import scrapy
class JDBookItem(scrapy.Item):
_id = scrapy.Field()
title = scrapy.Field()
url = scrapy.Field()
keywords = scrapy.Field()
description = scrapy.Field()
img = scrapy.Field()
channel = scrapy.Field()
tag = scrapy.Field()
sub_tag = scrapy.Field()
value = scrapy.Field()
comments = scrapy.Field()
4. scrapyd 배치
많은 친구 들 이 분포 식 파충류, 예 를 들 어 셀 리 미 션 을 통 해 scarpy 파충류 미 션 을 바 꾸 려 고 한다.
하지만 불행 하 게 도 스 크 래 피 가 이런 방식 을 이 루 려 는 것 은 쉽 지 않다.비교적 좋 은 방법 은 scrapyd 로 파충류 임 무 를 관리 하 는 것 이다.
python 환경 에 세 개의 물건 이 설치 되 어 있다 는 것 을 보증 해 야 합 니 다.
source kangaroo.env/bin/activate
pip install scrapy scrapyd scrapyd-client
spider 경로 에서 scrapyd 데 몬 을 시작 합 니 다.
scrapyd
다음은 spider 를 등록 하고 프로필 scrapy. cfg 를 작성 하 십시오.
# Automatically created by: scrapy startproject
#
# For more information about the [deploy] section see:
# https://scrapyd.readthedocs.org/en/latest/deploy.html
[settings]
default = jdbook.settings
[deploy:jdbook]
url = http://localhost:6800/
project = jdbook
등록 을 시작 하 다
# spider
scrapyd-deploy -p jdbook -d jdbook
# spider
scrapyd-deploy -l
:jdbook http://localhost:6800/
이렇게 해서 이미 등록 을 다 했 습 니 다.
파충류 시작 / 정지:
curl -XPOST http://10.94.99.55:6800/schedule.json? -d project=jdbook -d spider=jdbook
:{"status": "ok", "jobid": "9d50b3dcabfc11e69aa3525400128d39", "node_name": "kvm33093.sg"}
curl -XPOST http://10.94.99.55:6800/cancel.json? -d project=jdbook -d job=9d50b3dcabfc11e69aa3525400128d39
:{"status": "ok", "prevstate": "running", "node_name": "kvm33093.sg"}
이로써 celery 퀘 스 트 에서 파충 류 를 호출 할 수 있 습 니 다. 위의 url 만 보 내 면 됩 니 다.
각 파충 류 는 서로 다른 기계 에 보관 하여 분포 식 기어 오 르 기 를 실현 할 수 있다.
다음으로 전송:https://www.cnblogs.com/kangoroo/p/6071501.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.