前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【python爬虫】爬取知乎收藏夹内所有问题名称地址保存至Mysql

【python爬虫】爬取知乎收藏夹内所有问题名称地址保存至Mysql

作者头像
蛮三刀酱
发布2019-03-26 17:34:53
9880
发布2019-03-26 17:34:53
举报

转载请注明源地址,代码在Github中(可能会更新):https://github.com/qqxx6661/python/

初学python,练手项目。该代码并没有什么太大的实际意义,毕竟收藏可以直接在网页上看,没必要这样折腾。仅作学习之用。

PS:请勿长时间爬取,以免ip被知乎屏蔽。代码中代理有一定问题,由于知乎是走https,普通http代理没法用,实际运行中就算用了代理还是走本地ip

该程序中用到(可以初步理解):

1.python连接数据库:Mysql-connector

2.re正则表达式

3.requests用法:代理,post,get,headers等

4.验证码抓取

5.文件保存和读取

运行截图:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import requests
import re
import time
from subprocess import Popen
import mysql.connector

class Spider:

    def __init__(self):
        print '爬虫初始化......'
        self.s = requests.session()

        # 代理信息
        self.proxies = {"http": "http://42.159.195.126:80", "https": "https://115.225.250.91:8998"}
        try:
            r = self.s.get('http://www.baidu.com/', proxies=self.proxies)
        except requests.exceptions.ProxyError, e:
            print e
            print '代理失效,请修改代码更换代理'
            exit()
        print '代理通过验证,可以使用'

        # 知乎headers
        self.headers = {
            'Accept': '*/*',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'X-Requested-With': 'XMLHttpRequest',
            'Referer': 'https://www.zhihu.com',
            'Accept-Language': 'zh-CN,zh;q=0.8',
            'Accept-Encoding': 'gzip, deflate',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0',
            'Host': 'www.zhihu.com'
        }

        # 登陆知乎获取验证码
        r = self.s.get('https://www.zhihu.com', headers=self.headers, proxies=self.proxies)
        cer = re.compile('name=\"_xsrf\" value=\"(.*)\"', flags=0)
        strlist = cer.findall(r.text)
        _xsrf = strlist[0]
        #print(r.request.headers)
        #print(str(int(time.time() * 1000)))
        Captcha_URL = 'https://www.zhihu.com/captcha.gif?r=' + str(int(time.time() * 1000))
        r = self.s.get(Captcha_URL, headers=self.headers)
        with open('code.gif', 'wb') as f:
            f.write(r.content)
        Popen('code.gif', shell=True)
        captcha = input('captcha: ')
        login_data = {  # 填写账号信息
            '_xsrf': _xsrf,
            'phone_num': '18769201984',
            'password': 'ybs852421',
            'remember_me': 'true',
            'captcha': captcha
        }
        # 登陆知乎
        r = self.s.post('https://www.zhihu.com/login/phone_num', data=login_data, headers=self.headers, proxies=self.proxies)
        print(r.text)

    def get_collections(self):  # 获取关注的收藏夹
        # 抓取自己创建的收藏夹
        r = self.s.get('http://www.zhihu.com/collections/mine', headers=self.headers, proxies=self.proxies)
        # 抓取关注的收藏夹
        #r = self.s.get('https://www.zhihu.com/collections', headers=self.headers, proxies=self.proxies)
        # 获取收藏夹名数组和地址名数组
        re_mine_url = re.compile(r'<a href="(/collection/\d+?)"')
        list_mine_url = re.findall(re_mine_url, r.content)
        re_mine_name = re.compile(r'\d"\s>(.*?)</a>')
        list_mine_name = re.findall(re_mine_name, r.content)
        #print '收藏夹名称:', list_mine_name
        # for循环遍历数组
        for i in range(len(list_mine_url)):
            list_mine_url[i] = 'https://www.zhihu.com' + list_mine_url[i]
        #print '收藏夹地址:', list_mine_url
        conn = mysql.connector.connect(user='root', password='123456', database='test')
        cursor = conn.cursor()
        for i in range(len(list_mine_url)):
            page = 0
            sql = 'create table %s (id integer(10) primary key auto_increment, name varchar(100), address varchar(100))' % list_mine_name[i].decode("UTF-8")
            print sql
            cursor.execute(sql)
            conn.commit()
            while 1:
                page += 1
                col_url = list_mine_url[i]
                col_url = col_url + '?page=' + str(page)
                print '正在抓取:', col_url
                r = self.s.get(col_url, headers=self.headers, proxies=self.proxies)
                re_col_url = re.compile(r'href="(/question/\d*?)">.+?</a></h2>')
                list_col_url = re.findall(re_col_url, r.content)
                re_col_name = re.compile(r'\d">(.+?)</a></h2>')
                list_col_name = re.findall(re_col_name, r.content)
                if list_col_name:
                    #print '问题名称', list_col_name
                    # for循环遍历数组
                    for j in range(len(list_col_url)):
                        list_col_url[j] = 'https://www.zhihu.com' + list_col_url[j]
                    #print '问题地址:', list_col_url
                    for j in range(len(list_col_url)):
                        sql = 'insert into %s (name, address) values ("%s", "%s")' % (list_mine_name[i].decode("UTF-8"), list_col_name[j].decode("UTF-8"), list_col_url[j])
                        cursor.execute(sql)
                        conn.commit()
                else:
                    print '该收藏夹已无更多问题'
                    break
        cursor.close()

spider = Spider()
spider.get_collections()
print '爬虫执行完毕,请检查数据库'
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年08月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档