Scrapy 1.4 + Python 3.6模拟登陆知乎

最近学习Python爬虫,用到了Scrapy这个爬虫框架。目前Scrapy的最新版本已经达到了Scrapy 1.4,并且支持Python 3,但是网上找到的中文资料基本都是老版本的Scrapy,并且只支持到Python 2.7。于是笔者决定将Scrapy 1.4的学习过程记录下来,供各位童鞋参考。

这篇文章讲解了如何模拟登陆知乎,参考另一篇简书文章Scrapy模拟登陆知乎,不过这篇文章是基于Python 2.7的版本,细节方面没弄清楚的童鞋可以去看看原文章。

模拟登陆过程都是在Spider类中完成的,这里用最基本的Spider实现。

1.在spiders目录下创建一个py文件:zhihu_spider.py,继承自Spider,先把基本的一些东西写进去:

class ZhihuQuestionSpider(Spider):

    url_base = 'https://www.zhihu.com'  # 供后面获取链接使用

    name = 'login'  # Spider的名字

    start_url_base = 'https://www.zhihu.com/collection/27915947?page='  # 爬取页面

    start_urls = ['https://www.zhihu.com/collection/27915947']  # 这里没用到这个

    headers = {

        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",

        "Accept-Encoding": "gzip,deflate",

        "Accept-Language": "en-US,en;q=0.8,zh-TW;q=0.6,zh;q=0.4",

        "Connection": "keep-alive",

        "Content-Type": " application/x-www-form-urlencoded; charset=UTF-8",

        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36",

        "Referer": "http://www.zhihu.com"

    }

里面都是一些之后会用到的量,注释讲的很清楚了。

2.重写Spider的start_requests方法。

这里是整个爬虫的开始,从知乎首页开始,模拟登陆环境,这里的cookiejar是Scrapy的Cookie中间件的关键字,1表示这里只需要保存一个Cookie。这个方法将获取到的页面交给post_login方法模拟登陆。

# 从这里开始↓

def start_requests(self):

    return [Request("https://www.zhihu.com/", headers=self.headers, meta={"cookiejar": 1}, callback=self.post_login)]

3.post_login模拟登陆方法。注意修改一下登陆邮箱和密码。

# 进入知乎主页模仿登陆

def post_login(self, response):

    self.log('preparing login...')

    xsrf = Selector(response).xpath('//div[@data-za-module="SignInForm"]//form//input[@name="_xsrf"]/@value').extract()[0]

    self.log(xsrf)

    return FormRequest("https://www.zhihu.com/login/email", meta={'cookiejar': response.meta['cookiejar']},

        headers=self.headers,

        formdata={

        '_xsrf': xsrf,

        'password': '不能把密码告诉你们',

        'email': '邮箱也不行',

        'remember_me': 'true',

        },

        callback=self.after_login,

    )

4.登陆成功后的爬虫操作。这里先介绍以下这个案例的爬虫行为:

首先是最开始爬取的页面:这是一个名为生活文体艺术见闻的收藏,共有九百多篇收藏。

从这个页面获取每个提问的页面,在从提问页面里获取问题、链接、阅读量、关注量等信息,如下图中红圈圈出来的信息。

这里有个问题,收藏页面只显示10个提问,剩下的提问在分页里面,怎么处理呢?

可以通过这个链接搞定:

start_url_base = 'https://www.zhihu.com/collection/27915947?page='  # 爬取页面

page=后面填入相应的数字就代表相应的分页,当我们将第一个分页的提问爬取完成之后,将这个url后面加入其他的数字就可以爬取下一页的提问了。

5.登陆成功后进入相应的分页(即每页显示十个提问的那个页面),这个收藏一共91页,所以循环(1~91)次。

# 登陆成功后从start_urls里读出初始url,注入cookie

def after_login(self,response):

    # 创建csv文件

    with open('items.csv', 'w', newline='') as csvfile:

    writer = csv.writer(csvfile, dialect=('excel'))

    writer.writerow(['标题', '链接', '关注量', '浏览量'])

    for page in range(1, 92):

        url = self.start_url_base + str(page)

        yield Request(url, meta={'cookiejar': 1}, headers=self.headers, callback=self.request_question)

6.分析该分页,得到提问的链接,并进入提问页面爬取有用的信息。笔者还是更喜欢用BeautifulSoup,将xpath转为BeautifulSoup可以这样:

soup = BeautifulSoup(request.body, 'lxml')

# 分析得到urls

def request_question(self,request):

    soup = BeautifulSoup(request.body, 'lxml')

    for urlDiv in soup.find_all('div', class_='zm-item'):

        url = self.url_base + urlDiv.find('a').get('href')

        yield Request(url,meta={'cookiejar':1},headers = self.headers,callback=self.parse_question)

7.最后一步了,进入提问页面,提取有用信息保存到csv中。

# 获取有用的信息

def parse_question(self,response):

    soup = BeautifulSoup(response.body, 'lxml')

    item = ZhihuItem()

    item['questionTitle'] = soup.find('h1').string

    item['url'] = response.url

    followDiv = soup.find('div', class_='NumberBoard QuestionFollowStatus-counts')

    item['follow'] = followDiv.find_all('div', class_='NumberBoard-value')[0].string

    item['page_view'] = followDiv.find_all('div', class_='NumberBoard-value')[1].string

    # 将问题标题写入csv

    with open('items.csv', 'a', newline='') as csvfile:

        writer = csv.writer(csvfile, dialect=('excel'))

        writer.writerow([item['questionTitle'], item['url'], item['follow'], item['page_view']])

    return item

8.在命令行里输入:scrapy crawl login运行爬虫,爬取结果如下:

不过没能解决知乎安全验证的问题,当爬取过多、过快时就要输入验证码了。

(PS.谁能告诉简书怎么插入代码啊,```完全没用呀!!!)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容