>  기사  >  백엔드 개발  >  매우 상세한 Python 공통 인터뷰 질문

매우 상세한 Python 공통 인터뷰 질문

不言
不言앞으로
2019-02-23 10:18:4115892검색

매우 상세한 Python 공통 인터뷰 질문

이 기사의 내용은 매우 상세한 Python 면접 질문에 관한 것입니다. 필요한 친구들이 참고할 수 있기를 바랍니다.

추천 기사: "2020 Python 면접 질문 요약(최신)"

1. 빅데이터 파일 읽기

① 생성기 사용

②Iterator 반복 순회 수행: 파일의 한 줄에 대해

2. Iterator와 Generator의 차이점

1) Iterator는 클래스에 next 메서드가 있고 iter 메서드가 자신을 반환하는 경우 더 추상적인 개념입니다. 문자열, 목록, 딕셔너리, 튜플 등과 같은 컨테이너 개체의 경우 for 루프를 사용하여 탐색하는 것이 매우 편리합니다. for 문 백그라운드에서 iter() 함수는 컨테이너 개체에 대해 호출됩니다. iter()는 Python의 내장 함수입니다. iter()는 컨테이너의 요소에 하나씩 액세스하는 next() 메서드를 정의하는 반복자 개체를 반환합니다. Next()도 Python의 내장 함수입니다. 후속 요소가 없으면 next()는 StopIteration 예외를 발생시킵니다.

2) Generator는 반복자를 생성하기 위한 간단하고 강력한 도구입니다. 데이터를 반환해야 할 때 항복 문을 사용한다는 점을 제외하면 일반 함수처럼 작성됩니다. next()가 호출될 때마다 생성기는 중단된 위치로 돌아갑니다(문이 마지막으로 실행된 위치와 모든 데이터 값을 기억합니다)

차이점: 생성기는 반복자가 할 수 있는 모든 작업을 수행할 수 있으며, __iter__() 및 next() 메서드가 자동으로 생성되므로 생성기가 특히 간결하고 효율적입니다. 목록 분석 대신 생성기 표현식을 사용하면 동시에 메모리를 절약할 수 있습니다. 프로그램 상태를 자동으로 생성하고 저장하는 방법 외에도 생성기가 종료되면 StopIteration 예외도 자동으로 발생합니다

3. 데코레이터의 역할 및 기능:

로그 소개

함수 실행 시간 통계 functions 준비 처리 기능을 실행 한 후 기능을 실행 한 후 기타 시나리오에 대해 간단히 이야기합니다. 실행은 Python 가상 머신(인프리터 메인 루프, CPython 버전이라고도 함)에 의해 제어됩니다. Python은 원래 인터프리터의 메인 루프에서 동시에 하나의 스레드, 즉 언제든지 하나의 스레드만 실행하도록 설계되었습니다. 스레드는 인터프리터에서 실행됩니다. Python 가상 머신에 대한 액세스는 한 번에 하나의 스레드만 실행되도록 보장하는 GIL(Global Interpreter Lock)에 의해 제어됩니다.

다중 스레드 환경에서 Python 가상 머신은 다음과 같이 실행됩니다.

1. GIL을 설정합니다.

2 실행하려면 스레드로 전환합니다.

a. b. 스레드가 적극적으로 제어를 포기합니다(time.sleep(0) 호출 가능)4. 스레드를 절전 상태로 설정합니다

6. 위의 작업을 모두 반복합니다. 호출하기 전에 다시 단계 외부 코드(예: C/C++ 확장 함수)를 입력하면 GIL은 이 함수가 끝날 때까지 잠깁니다(이 기간 동안 Python 바이트코드가 실행되지 않으므로 스레드 전환이 수행되지 않습니다).

5. find 및 grep

grep 명령은 강력한 텍스트 검색 도구입니다. grep 검색 콘텐츠 문자열은 텍스트 파일에 대한 패턴 검색을 허용하는 정규식일 수 있습니다. 일치하는 패턴이 발견되면 grep은 해당 패턴을 포함하는 모든 행을 인쇄합니다.

find는 일반적으로 특정 디렉터리에서 조건을 충족하는 파일을 검색하는 데 사용됩니다. 특정 사용자가 소유한 파일을 검색하는 데에도 사용할 수 있습니다.

6. 여러 가지 이유로 온라인 서비스가 중단될 경우 어떻게 해야 하나요?

Linux의 강력한 백그라운드 프로세스 관리 도구인 Supervisor

각 파일 수정 후 Linux는 서비스 관리자 재시작을 실행합니다. 키 코드용 Cython), pylnlne, pypy, pyrex), 루프 최적화 – 루프의 변수 속성에 액세스하지 마세요

8. 일반적으로 사용되는 Linux 명령:

ls, help, cd, more,clear, mkdir, pwd, rm, grep, find, mv, su, date

9. Python의 Yield 사용법

yield는 단순히 생성기이므로 함수는 마지막으로 반환되었을 때 함수 본문의 위치를 ​​기억합니다. 생성기에 대한 두 번째(또는 n) 호출은 이 함수로 점프합니다.

10. Python이 메모리 관리를 수행하는 방법

1. 가비지 컬렉션: Python은 C++, Java 및 기타 언어와 달리 변수 유형을 미리 선언하지 않고 변수에 직접 값을 할당할 수 있습니다. Python 언어의 경우 객체의 유형과 메모리는 런타임에 결정됩니다. 이것이 우리가 Python 언어를 동적으로 유형 지정한다고 부르는 이유이기도 합니다(여기서 동적 유형 지정을 변수 메모리 주소 할당으로 간단하게 요약할 수 있습니다. 이는 자동으로 변수 유형을 결정하고 런타임에 변수에 값을 할당합니다).

2. 참조 계산: Python은 Windows 커널 개체와 유사한 방법을 사용하여 메모리를 관리합니다. 각 객체는 객체를 가리키는 참조 수를 유지합니다. 변수가 객체에 바인딩되면 변수의 참조 카운트는 1입니다(변수 참조 카운트가 증가하는 다른 상황도 있습니다). 시스템은 자동으로 이러한 레이블을 유지하고 정기적으로 검색합니다. 참조 횟수가 0이 되면 쌍이 재활용됩니다.

3. 메모리 풀 메커니즘 Python의 메모리 메커니즘은 피라미드 행에 있습니다.

0번째 레이어는 malloc입니다. C, free 및 기타 메모리 할당 및 해제 기능

첫 번째 및 두 번째 레이어는 Python 인터페이스 함수 PyMem_Malloc 함수에 의해 구현되는 메모리 풀입니다. 레이어는 메모리를 직접 할당합니다 ;

세 번째 레이어는 Python 객체의 직접적인 작업인 최상위 레이어입니다.

C에서 malloc과 free를 자주 호출하면 성능이 저하됩니다. 문제가 발생합니다. 또한 작은 메모리 블록을 자주 할당하고 해제하면 메모리 조각화가 발생합니다. Python이 수행하는 주요 작업은 다음과 같습니다.

요청된 메모리 할당이 1~256바이트인 경우 그냥 사용하세요. 그렇지 않으면 malloc을 직접 사용하세요.

Malloc은 여전히 ​​메모리를 할당하기 위해 호출되지만 매번 256k 메모리의 큰 블록이 할당됩니다. 메모리 풀을 통해 등록된 메모리는 결국 메모리 풀로 재활용되며 C의 free를 호출하여 해제되지 않습니다. 값, 문자열, 튜플(튜플)과 같은 간단한 Python 개체에 사용할 수 있습니다. 변경이 허용되지 않음)은 복사 방법(딥 카피?)을 사용합니다. 즉, A와 B의 메모리 공간은 여전히 ​​동일하지만 다른 변수 B가 변수 A에 할당된 경우 A의 값이 변경하면 A에 공간을 다시 할당하고 A와 B의 주소는 더 이상 동일하지 않습니다.

11. 배열, 연결 목록, 대기열 및 대기열의 차이점을 설명하세요. 스택?

배열과 연결 목록은 데이터 저장의 개념입니다. 배열은 데이터를 연속적인 공간에 저장하는 반면 연결 목록은 비연속적인 공간에 데이터를 저장할 수 있습니다.

#🎜🎜 #Queue 스택은 데이터 액세스 방법을 설명하는 개념입니다. 큐는 먼저 들어간 것이 먼저 나오는 반면, 스택은 나중에 들어간 것이 먼저 나온 것입니다. 큐와 스택은 배열이나 연결 목록을 사용하여 구현할 수 있습니다.

12. 정렬의 여러 종류를 알고 계시나요? 가장 친숙한 정렬을 알려주세요.

web 프레임워크 부분# 🎜🎜#

1. django에서 사용자가 애플리케이션 서버 A에 로그인한 후(로그인 상태로 진입) 다음 요청이 nginx에 의해 애플리케이션 서버 B로 프록시되면 어떻게 될까요? 영향이 있을까요? 애플리케이션 서버 A에서 사용자가 로그인한 세션 데이터가 애플리케이션 서버 B에 공유되지 않으면 Nano의 이전 로그인 상태가 손실됩니다.

2. Django에서 도메인 간 요청 문제를 해결하는 방법(원칙)

미들웨어 활성화

요청 게시

인증 코드

{%csrf_token 추가 %} 태그

3 형식으로 Django의 아키텍처를 설명하거나 설명하세요.

Django 프레임워크는 MVC 디자인을 따르며 고유명사 MVT

를 갖습니다. M전 Model이라고 표기하며 MVC의 M과 같은 기능을 가지고 있으며 데이터 처리를 담당하며 ORM 프레임워크가 내장되어 있습니다. #T는 MVC의 V와 같은 기능을 가지는 Template이라고 표기합니다. 반환될 HTML을 캡슐화하고 구성하는 일을 담당하며 템플릿 엔진이 내장되어 있습니다

4. Django에서 데이터 쿼리 결과를 정렬하는 방법, 내림차순으로 수행하는 방법, 필드를 쿼리하는 방법 특정 값보다 큽니다

정렬을 위해 order_by()를 사용하세요
내림차순은 정렬 필드 이름 앞에 -
을 추가해야 합니다

5. MIDDLEWARES 미들웨어란 무엇입니까?

미들웨어는 요청과 응답 처리 사이의 처리 프로세스로, 비교적 가볍고 Django의 입력과 출력을 전역적으로 변경합니다.

6. Django에 대해 무엇을 알고 있나요?
Django는 완전 자동화된 관리 백엔드로 가장 유명합니다. ORM을 사용하고 간단한 개체 정의만 하면 자동으로 데이터베이스 구조와 모든 기능을 갖춘 관리를 생성할 수 있습니다. .

Django에 내장된 ORM은 프레임워크의 다른 모듈과 긴밀하게 결합되어 있습니다.


응용 프로그램은 Django에 내장된 ORM을 사용해야 합니다. 그렇지 않으면 이론적으로 프레임워크에서 제공되는 다양한 ORM 기반 편의를 누릴 수 없으며 ORM 모듈을 전환할 수 있습니다. 완성된 집을 허물고 다시 단장한 뒤, 처음부터 새로운 장식을 위해 거친 집에 가는 것이 낫다.

Django의 셀링 포인트는 매우 높은 개발 효율성이지만 성능 확장은 제한적입니다. Django를 사용하는 프로젝트는 성능 요구 사항을 충족하기 위해 트래픽이 일정 규모에 도달한 후에 재구성되어야 합니다.

Django는 중소 규모 웹사이트에 적합하거나 대규모 웹사이트에서 제품 프로토타입을 빠르게 구현하는 도구로 적합합니다.

Django 템플릿의 디자인 철학은 코드와 스타일을 완전히 분리하는 것입니다. Django는 템플릿에서 데이터를 코딩하고 처리할 가능성을 근본적으로 제거합니다.

7. Django 리디렉션을 어떻게 구현하나요? 어떤 상태 코드가 사용됩니까?
HttpResponseRedirect
redirect 및 reverse
상태 코드 사용: 302,301

8.ngnix의 정방향 프록시와 역방향 프록시?
순방향 프록시는 클라이언트와 원본 서버 사이의 서버로, 클라이언트는 원본 서버에서 콘텐츠를 얻기 위해 프록시에 요청을 보내고 대상(원본 서버)을 지정한 다음 프록시가 요청을 전달합니다. 그리고 획득한 콘텐츠를 클라이언트에 반환합니다. 클라이언트는 정방향 프록시를 사용하려면 몇 가지 특별한 설정을 지정해야 합니다.
역방향 프록시는 클라이언트에 대해 원래 서버처럼 작동하며 클라이언트는 특별한 설정을 할 필요가 없습니다. 클라이언트는 역방향 프록시의 네임스페이스에 있는 콘텐츠에 일반 요청을 보내고, 역방향 프록시는 요청을 전달할 위치(원래 서버)를 결정하고 획득한 콘텐츠를 마치 콘텐츠 자체인 것처럼 클라이언트에 반환합니다.

9.토네이도의 핵심은 무엇인가요?
Tornado의 핵심은 ioloop와 iostream의 두 모듈입니다. 전자는 효율적인 I/O 이벤트 루프를 제공하고 후자는 비차단 소켓을 캡슐화합니다. ioloop에 네트워크 I/O 이벤트를 추가하고, 비차단 소켓을 사용하고, 해당 콜백 함수를 일치시킴으로써 원하는 효율적인 비동기 실행을 달성할 수 있습니다.

10.Django 자체적으로 runserver를 제공하는데 왜 배포에 사용할 수 없나요?
runserver 메서드는 Django를 디버깅할 때 자주 사용하는 실행 메서드입니다. Django 자체
WSGI 서버를 사용하여 실행합니다. 주로 테스트 및 개발에 사용되며, runserver 메서드도 단일 프로세스입니다.
uWSGI는 WSGI 프로토콜, uwsgi, http 및 기타 프로토콜을 구현하는 웹 서버입니다. uwsgi는 통신 프로토콜이고 uWSGI는 uwsgi 프로토콜과 WSGI 프로토콜을 구현하는 웹 서버입니다. uWSGI는 초고속 성능, 낮은 메모리 사용량, 다중 앱 관리 등의 장점을 갖고 있으며 Nginx
와 결합하면 프로덕션 환경이 되어 애플리케이션 앱에서 사용자 액세스 요청을 격리하여 실제 배포를 달성할 수 있습니다. 이에 비해 더 많은 양의 동시성을 지원하고, 여러 프로세스의 관리를 용이하게 하며, 멀티 코어를 활용하고 성능을 향상시킵니다.

네트워크 프로그래밍 및 프론트엔드 부분

1. AJAX란 무엇이며 어떻게 사용하나요?
ajax(비동기 javascript 및 xml)는 전체 웹 페이지를 다시 로드하는 대신 부분 웹 페이지 데이터를 새로 고칠 수 있습니다.
첫 번째 단계는 xmlhttprequest 객체를 생성하는 것입니다. var xmlhttp =new XMLHttpRequest(); XMLHttpRequest 객체는 서버와 데이터를 교환하는 데 사용됩니다.
두 번째 단계는 xmlhttprequest 객체의 open() 및 send() 메서드를 사용하여 서버에 리소스 요청을 보내는 것입니다.
3단계, xmlhttprequest 객체의 responseText 또는 responseXML 속성을 사용하여 서버의 응답을 얻습니다.
4단계, onreadystatechange 함수. 서버에 요청을 보낼 때 서버가 응답하고 일부 기능을 수행하도록 하려면 onreadystatechange 함수를 사용해야 합니다. xmlhttprequest 객체의 ReadyState가 변경될 때마다 onreadystatechange 함수가 트리거됩니다.

2. 일반적인 HTTP 상태 코드는 무엇입니까?

200 확인
301 영구적으로 이동됨
302 발견
304 수정되지 않음
307 임시 리디렉션
400 잘못된 요청
401 무단
403 금지됨
404 찾을 수 없음
410 사라짐
500 내부 서버 오류
501 구현되지 않음

3.게시와 받기의 차이점은 무엇인가요?

GET 요청을 하면 요청된 데이터가 URL에 추가되어 URL을 분할하고 데이터를 전송합니다. 여러 매개변수가 &로 연결됩니다. URL 인코딩 형식은 uniclde 대신 ASCII 인코딩을 사용합니다. 이는 ASCII가 아닌 모든 문자를 전송하기 전에 인코딩해야 함을 의미합니다.
POST 요청: POST 요청은 요청된 데이터를 HTTP 요청 패키지의 본문에 배치합니다. 위 항목=밴드소는 실제 전송 데이터입니다.
따라서 GET 요청의 데이터는 주소 표시줄에 노출되지만 POST 요청은 그렇지 않습니다.

2. 전송되는 데이터의 크기

HTTP 사양에서는 URL의 길이와 전송되는 데이터의 크기에 제한이 없습니다. 그러나 실제 개발 과정에서 GET의 경우 특정 브라우저와 서버에서는 URL 길이에 제한이 있습니다. 따라서 GET 요청을 사용할 때 전송되는 데이터는 URL 길이에 따라 제한됩니다.

POST의 경우 URL 값이 아니기 때문에 이론상으로는 제한이 없습니다. 하지만 실제로 각 서버에서는 POST로 제출하는 데이터의 크기에 제한을 두며, Apache와 IIS에는 자체 구성이 있습니다.

3. 보안

POST가 GET보다 더 안전합니다. 여기서 말하는 보안은 실제 보안을 의미하며, 위에서 언급한 GET의 보안방식과는 다른 보안이다. 위에서 언급한 보안은 단순히 서버의 데이터를 수정하는 것이 아니다. 예를 들어, 로그인 작업을 수행할 때 GET 요청을 통해 사용자 이름과 비밀번호가 URL에 노출됩니다. 왜냐하면 로그인 페이지는 브라우저에 의해 캐시될 수 있고 이때 다른 사람들이 브라우저 기록, 사용자 이름과 비밀번호를 볼 수 있기 때문입니다. 다른 사람이 알아내기 쉽습니다. 또한 GET 요청으로 제출된 데이터로 인해 Cross-Site Request Frogery 공격이 발생할 수도 있습니다.

4. 쿠키와 세션의 차이점은 무엇인가요?

1. 쿠키 데이터는 고객의 브라우저에 저장되며, 세션 데이터는 서버에 저장됩니다.
2. 쿠키는 그다지 안전하지 않습니다. 보안상의 이유로 다른 사람이 로컬에 저장된 쿠키를 분석하여 쿠키를 속일 수 있습니다.
3. 세션은 일정 기간 내에 서버에 저장됩니다. 접속량이 증가하면 서버 성능을 더 많이 차지하게 되므로 서버 성능을 저하시키려면 COOKIE를 사용해야 합니다.
4. 단일 쿠키에 저장되는 데이터는 4K를 초과할 수 없습니다. 많은 브라우저는 사이트에 최대 20개의 쿠키를 저장하도록 제한합니다.
5. 제안:
로그인 정보 등 중요한 정보를 SESSION으로 저장하세요.
다른 정보를 유지해야 하는 경우 COOKIE

5에 배치하면 됩니다. 간단한 TCP 서버

1.socket을 만드는 데 필요한 프로세스입니다. 소켓 만들기 Word
2.bind는 IP와 포트를 바인딩합니다
3.listen은 소켓이 수동적으로 연결될 수 있도록 합니다
4.accept는 클라이언트의 링크를 기다립니다
5.recv/send는 데이터를 수신하고 보냅니다

크롤러 및 데이터베이스 부분

1. scrapy와 scrapy-redis의 차이점은 무엇인가요? Redis 데이터베이스를 선택하는 이유는 무엇입니까?

(1) Scrapy는 크롤링 효율성이 매우 높고 사용자 정의 수준이 높은 Python 크롤러 프레임워크이지만 배포를 지원하지 않습니다. Scrapy-redis는 redis 데이터베이스를 기반으로 하고 scrapy 프레임워크에서 실행되는 구성 요소 집합으로, scrapy가 분산 전략을 지원할 수 있도록 합니다. Slaver 측은 마스터 측 Redis 데이터베이스에 설정된 항목 대기열, 요청 대기열 및 요청 지문을 공유합니다.

(2) Redis 데이터베이스를 선택하는 이유 Redis는 마스터-슬레이브 동기화를 지원하고 데이터가 메모리에 캐시되므로 Redis 기반 분산 크롤러는 요청 및 데이터를 자주 읽는 데 매우 효율적입니다.

2. 어떤 크롤러 프레임워크나 모듈을 사용해 보셨나요? 차이점이나 장점, 단점에 대해 이야기해 보세요.
Python에는 urllib, urllib2
제3자: 요청
프레임워크: Scrapy
urllib 및 urllib2 모듈은 모두 URL 요청과 관련된 작업을 수행하지만 서로 다른 기능을 제공합니다.
urllib2.: urllib2.urlopen은 요청 개체 또는 URL을 허용할 수 있습니다(요청 개체를 허용하고 이를 사용하여 URL의 헤더를 설정하는 경우). urllib.urlopen은 하나의 url만 허용합니다
urllib에는 urlencode가 있지만 urllib2에는 허용되지 않습니다. urllib와 urllib2가 자주 함께 사용되는 이유
scrapy는 다운로더, 파서, 로그 및 예외 처리를 포함하는 캡슐화된 프레임워크입니다. 이는 고정된 단일 웹사이트의 크롤링 개발을 위한 것입니다. 장점은 있지만, 여러 웹사이트에서 100개의 웹사이트를 크롤링하기에는 동시 및 분산 처리 측면에서 유연성이 부족하고 조정 및 확장이 불편합니다.

request는 요청에만 사용됩니다. HTTP 요청의 경우 다운로드 및 구문 분석이 모두 자체적으로 처리됩니다. 이는 또한 매우 높은 유연성을 제공합니다.

Scrapy의 장점과 단점:

장점: scrapy는 비동기식입니다.

일반 대신 더 읽기 쉬운 xpath를 채택합니다.

강력한 통계 및 로그 시스템

동시에 URL에 대한 다른 크롤링

셸 모드 지원, 독립적 디버깅에 편리함

미들웨어 작성, 일부 통합 필터 작성에 편리함

파이프라인을 통해 데이터베이스에 저장됨

단점: 파이썬 기반 크롤러 프레임워크, 확장성이 좋지 않음

기반 뒤틀린 프레임워크에서는 예외를 실행해도 반응기가 종료되지 않으며 비동기식 프레임워크는 오류가 발생한 후 다른 작업을 중지하지 않습니다. 데이터 오류를 감지하기가 어렵습니다.

3. 일반적으로 사용되는 mysql 엔진은 무엇입니까? 엔진의 차이점은 무엇입니까?

MyISAM과 InnoDB의 두 가지 주요 엔진이 있습니다. 주요 차이점은 다음과 같습니다.

1. InnoDB는 트랜잭션을 지원하지만 MyISAM은 매우 중요합니다. 트랜잭션은 높은 수준의 처리 방법입니다. 예를 들어 일련의 추가, 삭제 또는 수정에서 오류가 발생하면 롤백하고 복원할 수 있지만 MyISAM은 이를 수행할 수 없습니다.

2. , InnoDB는

높은 보안과 관련된 애플리케이션에 적합합니다.

3. InnoDB는 외래 키를 지원하지만 MyISAM은 이를 지원하지 않습니다. 4.

5. InnoDB는 FULLTEXT 유형 인덱스를 지원하지 않습니다.

6. InnoDB는 테이블의 행 수를 저장하지 않습니다. 예를 들어, InnoDB는 테이블에서 count(*)를 스캔해야 합니다. 전체 테이블을 사용하여 행 수를 계산할 수 있지만 MyISAM에서는 간단히 읽어내기만 하면 됩니다. 저장된 행 수는 충분합니다. count(*) 문에 where 조건이 포함된 경우 MyISAM은 전체 테이블도 스캔해야 합니다.

7. 자체 증가 필드의 경우 InnoDB는 이 필드의 인덱스만 포함해야 하지만 MyISAM

테이블에는 있습니다. 다른 필드와 공동 인덱스를 생성할 수 있습니다.

8. 전체 테이블을 지울 때 InnoDB는 행을 하나씩 삭제하므로 매우 느립니다. MyISAM은 테이블을 재구축합니다.

9. InnoDB는 행 잠금을 지원합니다(어떤 경우에는 업데이트 테이블이 a=1로 설정되는 경우와 같이 전체 테이블이 잠깁니다. 여기서

사용자는 '%lee%'

4. scrapy 프레임워크가 작동하나요?

start_urls에서 첫 번째 URL 배치를 가져와 요청을 보냅니다. 요청은 엔진에 의해 스케줄러로 전달되고 요청 대기열에 들어갑니다. 획득이 완료된 후 스케줄러는 요청 대기열에 있는 요청을 다운로더에 전달합니다. 요청에 해당하는 응답 리소스를 얻고 응답은 추출 처리를 위해 직접 작성한 구문 분석 방법으로 전달됩니다. 1. 필요한 데이터가 추출되면 처리를 위해 파이프라인 파일로 전달됩니다. URL이 추출되면 요청 큐와 프로그램에 요청이 없을 때까지 이전 단계를 계속 수행합니다(URL 요청을 보내면 엔진이 요청을 스케줄러로 전달하여 큐에 넣습니다...). 끝납니다.

5. 관련 검색어는 무엇이고 무엇인가요?

주로 내부 조인, 왼쪽 조인, 오른쪽 조인, 전체 조인(외부 조인)을 포함하여 쿼리를 위해 여러 테이블을 조인합니다.

6 크롤러를 작성하려면 여러 프로세스를 사용하는 것이 더 낫습니까? 아니면 멀티스레딩이 더 나은가요? 왜?

IO 집약적인 코드(파일 처리, 웹 크롤러 등)의 경우 멀티스레딩을 사용하면 효율적으로 효율성을 높일 수 있습니다(단일 스레드에서 IO 작업이 있으면 IO 대기가 발생하여 불필요한 시간 낭비가 발생하지만 멀티스레딩에서는 스레드 A에서 대기할 수 있습니다. 자동으로 스레드 B로 전환하면 CPU 리소스를 낭비할 수 없으므로 프로그램 실행 효율성이 향상됩니다. 실제 데이터 수집 과정에서는 멀티 프로세스나 멀티 스레드를 설정하기 위해서는 네트워크 속도와 응답 문제뿐만 아니라 자신의 머신의 하드웨어 조건도 고려해야 합니다

7. 데이터베이스 최적화?

1. 인덱스, SQL 문을 최적화하고 느린 쿼리를 분석합니다.

2. 테이블을 설계할 때 데이터베이스 설계 패러다임에 따라 엄격하게 데이터베이스를 설계합니다.

3. 자주 액세스하려면

디스크 IO를 절약하고

4. SSD를 사용하고 디스크 대기열 기술(RAID0, RAID1, RDID5)을 사용하세요. 내부 테이블 파티션 기술, 데이터를 여러 파일로 계층화하면 자기 디스크의 읽기 효율성이 향상됩니다.

6. 자주 읽지 않는 데이터를 하나의 테이블에 넣어 디스크 I/O를 절약합니다. 읽기 및 쓰기, 마스터-슬레이브 복제를 사용하여 데이터베이스의 읽기 작업과 쓰기 작업을 분리합니다(데이터 양이 특히 많음). 원칙은 데이터 라우팅입니다.

9. 매개변수를 최적화합니다.

11. 전체 텍스트 인덱스를 사용하지 마세요. 더 빠른 저장 자주 액세스하는 데이터를 NoSQL과 같은 방식으로 저장하는 방법

8. 일반적인 크롤링 방지 프로그램 및 대응책은 무엇입니까?

1) 헤더를 통한 크롤링 방지

사용자가 요청한 헤더 크롤링 방지는 가장 일반적인 크롤링 방지 전략입니다. 많은 웹사이트는 헤더의 사용자 에이전트를 감지하고 일부 웹사이트는 리퍼러를 감지합니다(일부 리소스 웹사이트의 안티 리칭은 리퍼러를 감지하는 것입니다). 이러한 유형의 크롤러 방지 메커니즘을 발견하면 크롤러에 헤더를 직접 추가하고 브라우저의 사용자 에이전트를 크롤러의 헤더에 복사하거나 참조자 값을 대상 웹 사이트 도메인 이름으로 변경할 수 있습니다. 헤더를 감지하는 안티 크롤러의 경우 크롤러에서 헤더를 수정하거나 추가하여 쉽게 우회할 수 있습니다.

2) 사용자 행동 기반 크롤링 방지

동일 IP가 짧은 시간 내에 동일한 페이지를 여러 번 방문하거나 동일한 계정이 동일한 작업을 수행하는 등 사용자 행동을 감지하는 일부 웹사이트도 있습니다. 짧은 시간에 여러 번.

대부분의 웹사이트는 전자와 같은 상황입니다. 이 경우 IP 프록시를 사용하면 문제를 해결할 수 있습니다. 인터넷에 공개된 프록시 IP를 크롤링하고 감지 후 모두 저장하는 특수 크롤러를 작성할 수 있습니다. 이러한 프록시 IP 크롤러는 자주 사용되므로 직접 준비하는 것이 가장 좋습니다. 많은 수의 프록시 IP가 있으면 몇 번의 요청마다 하나의 IP를 변경할 수 있습니다. 이는 요청이나 urllib2에서 쉽게 수행할 수 있으므로 첫 번째 안티 크롤러를 쉽게 우회할 수 있습니다. 두 번째 경우에는 각 요청 후 다음 요청을 하기 전에 무작위로 몇 초 정도 기다릴 수 있습니다. 논리적 허점이 있는 일부 웹사이트에서는 여러 번 요청하고, 로그아웃하고, 다시 로그인하고, 계속 요청함으로써 동일한 계정이 짧은 시간 내에 동일한 요청을 여러 번 할 수 없다는 제한을 우회할 수 있습니다.

3) 동적 페이지 크롤링 방지

위의 상황은 대부분 정적 페이지에서 발생하며 일부 웹사이트에서는 크롤링해야 하는 데이터가 Ajax 요청을 통해 얻거나 JavaScript를 통해 생성됩니다. 먼저 Fiddler를 사용하여 네트워크 요청을 분석합니다. Ajax 요청을 찾고 특정 매개변수와 응답의 구체적인 의미를 분석할 수 있다면 위의 방법을 사용하여 요청 또는 urllib2를 사용하여 Ajax 요청을 직접 시뮬레이션하고 응답 json을 분석하여 필요한 데이터를 얻을 수 있습니다.

Ajax 요청을 직접 시뮬레이션하여 데이터를 얻을 수 있다는 것은 좋지만 일부 웹사이트는 Ajax 요청의 모든 매개변수를 암호화합니다. 우리는 필요한 데이터에 대한 요청을 구성할 방법이 없습니다. 이 경우 selenium+phantomJS를 사용하여 브라우저 커널을 호출하고 phantomJS를 사용하여 js를 실행하여 인간 작업을 시뮬레이션하고 페이지에서 js 스크립트를 트리거합니다. 양식 작성부터 버튼 클릭, 페이지 스크롤까지 특정 요청 및 응답 프로세스에 관계없이 모든 것을 시뮬레이션할 수 있습니다. 이는 사람들이 데이터를 얻기 위해 페이지를 탐색하는 과정을 완전히 시뮬레이션할 뿐입니다.

이 프레임워크를 사용하면 대부분의 안티 크롤러를 거의 우회할 수 있습니다. 왜냐하면 데이터를 얻기 위해 브라우저인 척하는 것이 아니라(위에서 언급한 헤더 추가는 어느 정도 브라우저인 척하는 것입니다) 브라우저 자체이기 때문입니다. phantomJS 인터페이스가 없는 브라우저일 뿐이고 브라우저는 인간이 제어하지 않습니다. Selenium+phantomJS는 터치 식별(12306) 또는 확인 코드 슬라이딩, 페이지 양식의 무차별 대입 크래킹 등과 같은 많은 작업을 수행할 수 있습니다.

9. 분산 크롤러는 주로 어떤 문제를 해결하나요?

1)ip

2)bandwidth

3)cpu

4)io

10. 크롤링 과정에서 인증코드를 어떻게 처리하나요?

1.Scrapy가 함께 제공됩니다

2. 유료 인터페이스

관련 학습 권장사항: python 비디오 튜토리얼

위 내용은 매우 상세한 Python 공통 인터뷰 질문의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제