scrapy模拟知乎登录(无验证码机制)
---恢复内容开始---
spiders 文件夹下新建zhihu.py文件(从dos窗口中进入虚拟环境,再进入工程目录之后输入命令 scrapy genspider zhihu www.zhihu.com)
#zhihu.py
import scrapy
import re
import json
from Item import ZhihuQuestionItem,ZhihuAnswerItem
import datatime
from scrapy.loader import ItemLoader
try:
import urlparse as parse
except:
from urllib import parse
class ZhuhuSpider(scrapy.Spider):
name='zhihu'
allow_domains=["www.zhihu.com"]
start_urls=["http://www.zhihu.com/"]
headers={
"HOST":"www.zhihu.com",
"Referer":"https://www.zhihu.com",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36"
}
start_answer_url="https://www.zhihu.com/api/v4/questions/{0}/answers? sort_by=default&include=data%5B%2A%5D.is_normal%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccollapsed_counts%2Creviewing_comments_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Cmark_infos%2Ccreated_time%2Cupdated_time%2Crelationship.is_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cupvoted_followees%3Bdata%5B%2A%5D.author.is_blocking%2Cis_blocked%2Cis_followed%2Cvoteup_count%2Cmessage_thread_token%2Cbadge%5B%3F%28type%3Dbest_answerer%29%5D.topics&limit={1}&offset={2}" #question 第一页answer请求的url
def parse(self,response):
"""
提取出html页面中的所有url,并跟踪这些url进行进一步爬取
如果提取出的url中格式为/requestion/xxx,就下载之后直接进入解析函数
"""
all_urls=response.css("a::attr(href)").extract()
all_urls=[parse.urljoin(response.url,url) for url in all_urls]
all_urls=fliter(lambda x:True if x.startswith("https") else False,all_urls)
for url in all_urls:
match_obj=re.match("(.*zhihu.com/requestion/(\d))(/|$).*",url)
if match_obj:
#如果提取到requestion相关页面,交由parse_question进行解析
request_url=match_obj.group(1)
yield scrapy.Request(request_url,headers=self.headers,callback=self.parse_question)
else:
#如果未提取到相关页面,则直接进一步跟踪
yield scrapy.Request(url,headers=self.headers,callback=self.parse)
def parse_question(self,response):
#处理question页面,从页面中提取出具体的question item
match_obj=re.match("(.*zhuhu.com/question/(\d))(/|$).*",response.url)
if match_obj:
question_id=int(match_obj.group(2))
item_loader=ItemLoader(item=zhuhuQuestionItem(),response=response)
if "QuestionHeader-title" in response.text: #处理新版本
item_loader.add_css("title","h1.QuestionHeader-title::text")
item_loader.add_css("content",".QuestionHeader-detail")
item_loader.add_value("url",response.url)
item_loader.add_value("zhuhu_id",question_id)
item_loader.add_css("answer_num",".List-headerText span::text")
item_loader.add_css("comment_num",".QuestionHeader-actions button::text")
item_loader.add_css("watch_user_num",".NumberBoard-value::text")
item_loader.add_css("topic",".QuestionHeader-topics .Popover div::text")
else: #处理旧版本页面item的提取
item_loader.add_xpath("title","//*[@id='zh-question-title']/h2/a/text()|//*[@id='zh-question-title']/h2/span/text()")
item_loader.add_css("content","#zh-question-detail")
item_loader.add_value("url",response.url)
item_loader.add_value("zhuhu_id",question_id)
item_loader.add_css("answer_num", "#zh-question-answer-num::text")
item_loader.add_css("comment_num","#zh-question-meta-wrap a[name='addcomment']::text")
item_loader.add_xpath("watch_user_num","//*[@id='zh-question-side-header-wrap']/text()|//*[@class='zh-question-followers-sidebar']/div/a/strong/text()")
item_loader.add_css("topic",".zm-tag-editor-labels a::text")
question_item=item_loader.load_item()
yield scrapy.Request(self.start_answer_url,format(question_id,20,0),headers=self.headers,callback=self.parse_answer)
yield question_item
def parse_answer(self,response):
#处理question中的answer
ans_json=json.load(response.text)
is_end=ans_json["paging"]["is_end"]
next_url=ans_json["paging"]["next"]
#提取answer的具体字段
for answer in ans_json["data"]:
answer_item=ZhihuAnswerItem()
answer_item["zhihu_id"]=answer["id"]
answer_item["url"]=answer["url"]
answer_item["question_id"]=answer["question"]["id"]
answer_item["author_id"] = answer["author"]["id"] if "id" in answer["author"] else None
answer_item["content"] = answer["content"] if "content" in answer else None
answer_item["praise_num"]=answer["voteup_count"]
answer_item["comment_num"]=answer["comment_count"]
answer_item["creat_time"]=answer["created_time"]
answer_item["update_time"]=answer["update_time"]
answer_item["crawl_time"]=datatime.datatime.now()
yield answer_item
if not is_end:
yield scrapy.Request(next_url,headers=self.headers,callback=self.answer.parse_answer)
#重写start_Request方法
def start_requests(self):
return [scrapy.Request("https://www.zhihu.com/#signin",headers=self.headers,callback=self.login)] #使用scrapy.Request一定要使用回调函数,否则会默认回调parse(self,response)
def login(self,response):
response_text=response.text
match_obj=re,match(' .*name="_xsrf" value="(.*?)" ',response_text,re.DOTALL) #注意使用单双引号
xsrf=""
if match_obj:
xsrf=(match_obj.group(1))
if xsrf:
post_url="https://www.zhihu.com/login/phone_num"
post_data={
"_xsrf" : xsrf,
"phone_num" : "18282902586",
"password" : "admin123"
}
return [scrapy.FormRequest(
url=post_url,
formdata=post_data,
headers=self.headers,
callback=self.check_login
)]
def check_login(self,response):
text_json=json.loads(response.text)
if "msg" in text_json and text_json["msg"]=="登陆成功":
for url in self.start_urls:
yield scrapy.Request(url,dont.fliter=True,headers=self.headers)
---恢复内容结束---
scrapy模拟知乎登录(无验证码机制)的更多相关文章
- (转)request模拟知乎登录(无验证码机制
原文:http://www.itnose.net/detail/6755805.html import request try: import cookielib #python2版本 except: ...
- request模拟知乎登录(无验证码机制)
import request try: import cookielib #python2版本 except: import http.cookiejar as cookielib #python3版 ...
- htmlunit 模拟登录 无验证码
1.模拟登录csdn,最开始的时候使用的是httpclient,网上的所有模拟登录csdn的版本都是找到lt/execution/event_id.连同用户名及密码 一起发送即可,但是目前的csdn的 ...
- 使用selenium模拟知网登录
之前都是用phantomjs和selenium模拟浏览器动作的,后来phantomjs不再更新,就转用chrome了 本次模拟登录的网站是中国知网http://login.cnki.net/login ...
- Python模拟知乎登录
# -*- coding:utf-8 -*- import urllib import urllib2 import cookielib import time from PIL import Ima ...
- 8-python模拟登入(无验证码)
方式: 1.手动登入,获取cookie 2.使用cookielib库 和 HTTPCookieProcessor处理器 #_*_ coding: utf-8 _*_ ''' Created on 20 ...
- 新版知乎登录之post请求
前言 在上一篇文章中给大家讲解了requests发送post请求的几种方式,并分析了一些使用陷阱. 疑惑 在文章发表之后,有朋友给我留言说,知乎登录就没有使用提交Form表单(application/ ...
- python爬虫scrapy框架——人工识别知乎登录知乎倒立文字验证码和数字英文验证码
目前知乎使用了点击图中倒立文字的验证码: 用户需要点击图中倒立的文字才能登录. 这个给爬虫带来了一定难度,但并非无法解决,经过一天的耐心查询,终于可以人工识别验证码并达到登录成功状态,下文将和大家一一 ...
- 利用scrapy模拟登录知乎
闲来无事,写一个模拟登录知乎的小demo. 分析网页发现:登录需要的手机号,密码,_xsrf参数,验证码 实现思路: 1.获取验证码 2.获取_xsrf 参数 3.携带参数,请求登录 验证码url : ...
随机推荐
- wangEditor编辑器中解析html图文信息问题
在JS中,有一种方法:innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML. 也就是说,我们可以利用这个属性,把字符串转换为html代码,这样就可以被解析了. 其次,我们是需要在页 ...
- BZOJ 4004 JLOI2015 装备购买 高斯消元+线性基
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4004 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装 ...
- Codeforces Round #345 Div.1 D.Zip-line 动态最长上升子序列
题意概述: 给出一个长度为N的序列和M组询问,问假设把某个位置的值改成另一个给出的值之后,序列的最长上升子序列的长度. N,M<=400000. 分析: 考虑某个位置的值改动后这个位置和最长上升 ...
- Daily Scrum02 11.29
今天大家都已经开始了进行第二轮迭代的工作!相比第一轮迭代,每个人都已经有了一定开发经验,这次做起来顺手很多.薛神和肖犇的挑战最大,他们需要实现好友功能,手机间的通信.服务器的搭建都是难点,但他们的热情 ...
- powerdesigner 外键生成sql语句设置在创建表里面
根据情况需要将创建外键表的sql语句生成在创建表的sql语句中,如下设置:
- [剑指Offer] 28.数组中出现次数超过一半的数字
[思路]将每个数字都存入map中作为key值,将它们出现的次数作为value值,当value超过一半时则返回其key值. class Solution { public: int MoreThanHa ...
- 使用POI操作Excel
首先要下载所需jar包, 官网:http://poi.apache.org ,POI支持office的所有版本 下载完后,打开“poi-bin-3.10.1-20140818”获取操作excel需要的 ...
- P1419 寻找段落
题目描述 给定一个长度为n的序列a_i,定义a[i]为第i个元素的价值.现在需要找出序列中最有价值的“段落”.段落的定义是长度在[S,T]之间的连续序列.最有价值段落是指平均值最大的段落, 段落的平均 ...
- P2127 序列排序
题目描述 小C有一个N个数的整数序列,这个序列的中的数两两不同.小C每次可以交换序列中的任意两个数,代价为这两个数之和.小C希望将整个序列升序排序,问小C需要的最小代价是多少? 输入输出格式 输入格式 ...
- [CF1065A]Vasya and Chocolate
题目大意:有$s$元,一个物品$c$元,每买$a$个就送$b$个,问一共可以买多少. 题解:全部买好,最后看可以送多少(其实是因为我这道题交错了,无聊才做的) 卡点:无 C++ Code: #incl ...