이 글에서는 python 크롤러를 시작하고 요청을 사용하여 ZhihuAPI를 구축하는 방법에 대한 관련 정보를 주로 소개합니다. 모든 사람에게 큰 도움이 됩니다. 필요한 참고 자료와 학습 가치가 있는 친구는 아래를 살펴보세요.
Preface
크롤러 시리즈 기사 우아한 HTTP 라이브러리 요청에서 요청 사용을 소개했습니다. 이번에는 요청을 사용하여 라이브러리를 구축합니다. Hu API의 기능에는 비공개 메시지 보내기, 기사 좋아요, 사용자 팔로우 등이 포함됩니다. 사용자 작업과 관련된 모든 기능에는 로그인이 필요하므로 이 기사를 읽기 전에 Python을 이해하여 Zhihu 로그인을 시뮬레이션하는 것이 좋습니다. 이제 요청을 사용하여 Zhihu 로그인을 시뮬레이션하는 방법을 이미 알고 있다고 가정합니다.
Thinking Analysis
개인 메시지를 보내는 과정은 브라우저가 서버에 HTTP 요청을 보내는 것입니다. 요청 URL, 요청 헤더Header 및 요청 본문이 명확하다면 요청을 사용하여 비공개 메시지를 보내는 브라우저를 쉽게 시뮬레이션할 수 있습니다.
Chrome 브라우저를 열고 임의의 사용자를 찾은 다음 클릭하여 비공개 메시지를 보내고 비공개 메시지의 네트워크 요청 프로세스를 추적하세요.
요청 헤더 정보를 먼저 살펴보세요
@요청 헤더 헤더에는 cookies의 로그인 정보가 포함되어 있으며, 또한, 사용자 인증에 사용되는 인증 필드도 있습니다. 동시에 이 필드도 쿠키에 저장됩니다(쿠키 정보가 유출되는 것을 방지하기 위해 이 정보를 모자이크로 처리해야 합니다). 요청이 요청될 때.
요청 URL을 살펴보고 요청 body
@요청 URL은 www.zhihu.com/api/입니다. v4/messages , 요청 방법은 POST, 요청 body
{"type":"common","content":"你好,我是pythoner","receiver_hash":"1da75b85900e00adb072e91c56fd9149"}
요청 본문은 json 문자열이고 유형과 내용은 이해하기 쉽지만 Receiver_hash가 무엇인지, 무엇이 필요한지 모르겠습니다. 더 자세히 결정되지만 이것이 사용자 ID와 유사한 필드라고 추측해야 합니다.
이제 문제는 사용자 홈페이지의 URL을 통해 사용자 ID를 어떻게 찾는가 하는 것입니다. 개인 메시지의 전체 과정을 완벽하게 시뮬레이션하기 위해 특별히 Zhihu 계정을 등록했습니다.
여분의 휴대전화 번호가 없으면 Google을 사용하여 '온라인으로 SMS 수신'을 검색할 수 있습니다. 인터넷에는 무료 온라인 문자 메시지 수신을 제공하는 휴대전화 번호가 많이 있습니다. 내 등록 계정 홈페이지: https://www.zhihu .com/people/xiaoxiaodouzi
먼저 트럼펫 계정을 팔로우한 다음 마우스를 움직이면 내가 팔로우하는 목록에서 트럼펫 계정을 찾습니다. 트럼펫 계정의 아바타에 HTTP 네트워크 요청이 있음을 발견했습니다.
요청 URL은 www.zhihu.com/api/v4/members/xiaoxiaodouzi입니다. 이 URL "xiaoxiaodouzi"의 뒷부분은 Xiaoxiao의 뒷부분에 해당합니다. 홈페이지 URL입니다. 이 부분을 url_token이라고 합니다.
인터페이스의 반환 데이터는 사용자의 개인 공개 정보입니다.
{ ... "id":"1da75b85900e00adb072e91c56fd9149", "favorite_count":0, "voteup_count":0, "commercial_question_count":0, "url_token":"xiaoxiaodouzi", "type":"people", "avatar_url":"https://pic1.zhimg.com/v2-ca13758626bd7367febde704c66249ec_is.jpg", "is_active":1492224390, "name":"\u6211\u662f\u5c0f\u53f7", "url":"http://www.zhihu.com/api/v4/people/1da75b85900e00adb072e91c56fd9149", "gender":-1 ... }
앞서 짐작했듯이 비공개 메시지의 receive_hash 필드는 사용자의 ID 필드가 있음을 분명히 알 수 있습니다.
코드 구현
이제 비공개 메시지 기능에 대한 아이디어를 명확히 했으며 코드 구현은 당연한 문제입니다.
사용자 정보
개인 메시지 인터페이스에 필요한 receive_hash 사전을 얻으려면 먼저 사용자 정보를 얻어야 합니다. 값에 대한 ID를 포함합니다.
@need_login def user(self, url_token): """ 获取用户信息, :param url_token: url_token 是用户主页url中后面部分 例如: https://www.zhihu.com/people/xiaoxiaodouzi url_token 是 xiaoxiaodouzi :return:dict """ response = self._session.get(URL.profile(url_token)) return response.json()
비공개 메시지 보내기
@need_login def send_message(self, user_id, content): """ 给指定的用户发私信 :param user_id: 用户ID :param content: 私信内容 """ data = {"type": "common", "content": content, "receiver_hash": user_id} response = self._session.post(URL.message(), json=data) data = response.json() if data.get("error"): self.logger.info("私信发送失败, %s" % data.get("error").get("message")) else: self.logger.info("发送成功") return data
위의 두 가지 메소드는 Zhihu라는 클래스에 배치됩니다. 관련된 @need_login은 사용자 인증 데코레이터로, 이 방법이 작동하려면 로그인이 필요함을 나타냅니다. 주의 깊게 살펴보면 init.py 메서드에서 헤더 필드를 초기화했기 때문에 각 요청에서 헤더 필드를 명시적으로 지정하지 않았다는 것을 알 수 있습니다.
def init(self): self._session = requests.session() self._session.verify = False self._session.headers = {"Host": "www.zhihu.com", "Referer": "https://www.zhihu.com/", 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36' ' (KHTML, like Gecko) Chrome/56.0.2924.87', } self._session.cookies = cookiejar.LWPCookieJar(filename=cookie_filename) try: self._session.cookies.load(ignore_discard=True) except: pass
전화해서 실행하세요
from zhihu import Zhihu if name == 'main': zhihu = Zhihu() profile = zhihu.user("xiaoxiaodouzi") _id = profile.get("id") zhihu.send_message(_id, "你好,这是来自Python之禅的问候")
실행이 완료된 후 트럼펫은 제가 보낸 비공개 메시지를 성공적으로 받았습니다.
@마지막으로 유사한 아이디어를 따라 사용자 팔로우 및 좋아요 제공과 같은 기능을 구현할 수 있습니다.
【관련 권장 사항】
1. Python 크롤러 소개(5)--정규 표현식 예제 tutorial
2. Python 크롤러 소개(4)--HTML 텍스트 파싱 라이브러리 BeautifulSoup
3 Python 크롤러 소개(2)-HTTP 라이브러리 요청
4. Python 크롤러 소개(1)--HTTP 프로토콜을 빠르게 이해합니다
5. Python 크롤러를 사용하여 Zhihu를 시뮬레이션하는 예를 공유합니다. 로그인
위 내용은 Python 크롤러 시작하기(3)--요청을 사용하여 Zhihu API 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!