您的位置:

知乎抓图python脚本的简单介绍

本文目录一览:

如何用python写爬虫 知乎

学习

基本的爬虫工作原理

基本的http抓取工具,scrapy

Bloom Filter: Bloom Filters by Example

如果需要大规模网页抓取,你需要学习分布式爬虫的概念。其实没那么玄乎,你只要学会怎样维护一个所有集群机器能够有效分享的分布式队列就好。最简单的实现是python-rq:

rq和Scrapy的结合:darkrho/scrapy-redis · GitHub

后续处理,网页析取(grangier/python-goose · GitHub),存储(Mongodb)

怎样用Python设计一个爬虫模拟登陆知乎

给你一个例子,可以看看:

import requests

import time

import json

import os

import re

import sys

import subprocess

from bs4 import BeautifulSoup as BS

class ZhiHuClient(object):

    """连接知乎的工具类,维护一个Session

    2015.11.11

    用法:

    client = ZhiHuClient()

    # 第一次使用时需要调用此方法登录一次,生成cookie文件

    # 以后可以跳过这一步

    client.login("username", "password")   

    # 用这个session进行其他网络操作,详见requests库

    session = client.getSession()

    """

    # 网址参数是账号类型

    TYPE_PHONE_NUM = "phone_num"

    TYPE_EMAIL = "email"

    loginURL = r"{0}"

    homeURL = r""

    captchaURL = r""

    headers = {

        "User-Agent": "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36",

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

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

        "Host": "",

        "Upgrade-Insecure-Requests": "1",

    }

    captchaFile = os.path.join(sys.path[0], "captcha.gif")

    cookieFile = os.path.join(sys.path[0], "cookie")

    def __init__(self):

        os.chdir(sys.path[0])  # 设置脚本所在目录为当前工作目录

        self.__session = requests.Session()

        self.__session.headers = self.headers  # 用self调用类变量是防止将来类改名

        # 若已经有 cookie 则直接登录

        self.__cookie = self.__loadCookie()

        if self.__cookie:

            print("检测到cookie文件,直接使用cookie登录")

            self.__session.cookies.update(self.__cookie)

            soup = BS(self.open(r"").text, "html.parser")

            print("已登陆账号: %s" % soup.find("span", class_="name").getText())

        else:

            print("没有找到cookie文件,请调用login方法登录一次!")

    # 登录

    def login(self, username, password):

        """

        验证码错误返回:

        {'errcode': 1991829, 'r': 1, 'data': {'captcha': '请提交正确的验证码 :('}, 'msg': '请提交正确的验证码 :('}

        登录成功返回:

        {'r': 0, 'msg': '登陆成功'}

        """

        self.__username = username

        self.__password = password

        self.__loginURL = self.loginURL.format(self.__getUsernameType())

        # 随便开个网页,获取登陆所需的_xsrf

        html = self.open(self.homeURL).text

        soup = BS(html, "html.parser") 

        _xsrf = soup.find("input", {"name": "_xsrf"})["value"]

        # 下载验证码图片

        while True:

            captcha = self.open(self.captchaURL).content

            with open(self.captchaFile, "wb") as output:

                output.write(captcha)

            # 人眼识别

            print("=" * 50)

            print("已打开验证码图片,请识别!")

            subprocess.call(self.captchaFile, shell=True)

            captcha = input("请输入验证码:")

            os.remove(self.captchaFile)

            # 发送POST请求

            data = {

                "_xsrf": _xsrf,

                "password": self.__password,

                "remember_me": "true",

                self.__getUsernameType(): self.__username,

                "captcha": captcha

            }

            res = self.__session.post(self.__loginURL, data=data)

            print("=" * 50)

            # print(res.text) # 输出脚本信息,调试用

            if res.json()["r"] == 0:

                print("登录成功")

                self.__saveCookie()

                break

            else:

                print("登录失败")

                print("错误信息 ---", res.json()["msg"])

    def __getUsernameType(self):

        """判断用户名类型

        经测试,网页的判断规则是纯数字为phone_num,其他为email

        """

        if self.__username.isdigit():

            return self.TYPE_PHONE_NUM

        return self.TYPE_EMAIL

    def __saveCookie(self):

        """cookies 序列化到文件

        即把dict对象转化成字符串保存

        """

        with open(self.cookieFile, "w") as output:

            cookies = self.__session.cookies.get_dict()

            json.dump(cookies, output)

            print("=" * 50)

            print("已在同目录下生成cookie文件:", self.cookieFile)

    def __loadCookie(self):

        """读取cookie文件,返回反序列化后的dict对象,没有则返回None"""

        if os.path.exists(self.cookieFile):

            print("=" * 50)

            with open(self.cookieFile, "r") as f:

                cookie = json.load(f)

                return cookie

        return None

    def open(self, url, delay=0, timeout=10):

        """打开网页,返回Response对象"""

        if delay:

            time.sleep(delay)

        return self.__session.get(url, timeout=timeout)

    def getSession(self):

        return self.__session

if __name__ == '__main__':

    client = ZhiHuClient()

    # 第一次使用时需要调用此方法登录一次,生成cookie文件

    # 以后可以跳过这一步

    # client.login("username", "password")   

    # 用这个session进行其他网络操作,详见requests库

    session = client.getSession()

python 爬虫框架哪个好 知乎

1、Scrapy:是一个为了抓取网站数据,提取数据结构性数据而编写的应用框架,可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中,用这个框架可以轻松爬下来各种信息数据。

2、Pyspider:是一个用Python实现的功能强大的网络爬虫系统,能在浏览器界面上进行脚本的编写,功能的调度和爬取结果的实时查看,后端使用常用的数据库进行抓取结构的存储,还能定时设置任务与任务优先级等。

3、Crawley:可以高速抓取对应网站内容,支持关系和非关系数据库,数据可以导出为json、xml等。

4、Portia:是一个开源可视化爬虫工具,可以让您在不需要任何编程知识的情况下抓取网站,简单地注解您感兴趣的页面,创建一个蜘蛛来从类似的页面抓取数据。

5、Newspaper:可以用来提取新闻、文章和内容分析,使用多线程,支持10多种编程语言。

6、Beautiful Soup:是一个可以从HTML或者xml文件中提取数据的Python库,它能通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式;同时帮你节省数小时甚至数天的工作时间。

7、Grab:是一个用于创建web刮板的Python框架,借助Grab,您可以创建各种复杂的网页抓取工具,从简单的五行脚本到处理数万个网页的复杂异步网站抓取工具。Grab提供一个api用于执行网络请求和处理接收到的内容。

8、Cola:是一个分布式的爬虫框架,对于用户来说,只需要编写几个特定的函数,而无需关注分布式运行的细节,任务会自动分配到多台机器上,整个过程对用户是透明的。

如何使用python爬取知乎数据并做简单分析

一、使用的技术栈:

爬虫:python27 +requests+json+bs4+time

分析工具: ELK套件

开发工具:pycharm

数据成果简单的可视化分析

1.性别分布

0 绿色代表的是男性 ^ . ^

1 代表的是女性

-1 性别不确定

可见知乎的用户男性颇多。

二、粉丝最多的top30

粉丝最多的前三十名:依次是张佳玮、李开复、黄继新等等,去知乎上查这些人,也差不多这个排名,说明爬取的数据具有一定的说服力。

三、写文章最多的top30

四、爬虫架构

爬虫架构图如下:

说明:

选择一个活跃的用户(比如李开复)的url作为入口url.并将已爬取的url存在set中。

抓取内容,并解析该用户的关注的用户的列表url,添加这些url到另一个set中,并用已爬取的url作为过滤。

解析该用户的个人信息,并存取到本地磁盘。

logstash取实时的获取本地磁盘的用户数据,并给elsticsearchkibana和elasticsearch配合,将数据转换成用户友好的可视化图形。

五、编码

爬取一个url:

解析内容:

存本地文件:

代码说明:

* 需要修改获取requests请求头的authorization。

* 需要修改你的文件存储路径。

源码下载:点击这里,记得star哦!https : // github . com/forezp/ZhihuSpiderMan六、如何获取authorization

打开chorme,打开https : // www. zhihu .com/,

登陆,首页随便找个用户,进入他的个人主页,F12(或鼠标右键,点检查)七、可改进的地方

可增加线程池,提高爬虫效率

存储url的时候我才用的set(),并且采用缓存策略,最多只存2000个url,防止内存不够,其实可以存在redis中。

存储爬取后的用户我说采取的是本地文件的方式,更好的方式应该是存在mongodb中。

对爬取的用户应该有一个信息的过滤,比如用户的粉丝数需要大与100或者参与话题数大于10等才存储。防止抓取了过多的僵尸用户。

八、关于ELK套件

关于elk的套件安装就不讨论了,具体见官网就行了。网站:https : // www . elastic . co/另外logstash的配置文件如下:

从爬取的用户数据可分析的地方很多,比如地域、学历、年龄等等,我就不一一列举了。另外,我觉得爬虫是一件非常有意思的事情,在这个内容消费升级的年代,如何在广阔的互联网的数据海洋中挖掘有价值的数据,是一件值得思考和需不断践行的事情。

Python爬取知乎与我所理解的爬虫与反爬虫

关于知乎验证码登陆的问题,用到了Python上一个重要的图片处理库PIL,如果不行,就把图片存到本地,手动输入。

通过对知乎登陆是的抓包,可以发现登陆知乎,需要post三个参数,一个是账号,一个是密码,一个是xrsf。

这个xrsf隐藏在表单里面,每次登陆的时候,应该是服务器随机产生一个字符串。所有,要模拟登陆的时候,必须要拿到xrsf。

用chrome (或者火狐 httpfox 抓包分析)的结果:

所以,必须要拿到xsrf的数值,注意这是一个动态变化的参数,每次都不一样。

拿到xsrf,下面就可以模拟登陆了。

使用requests库的session对象,建立一个会话的好处是,可以把同一个用户的不同请求联系起来,直到会话结束都会自动处理cookies。

注意:cookies 是当前目录的一个文件,这个文件保存了知乎的cookie,如果是第一个登陆,那么当然是没有这个文件的,不能通过cookie文件来登陆。必须要输入密码。

这是登陆的函数,通过login函数来登陆,post 自己的账号,密码和xrsf 到知乎登陆认证的页面上去,然后得到cookie,将cookie保存到当前目录下的文件里面。下次登陆的时候,直接读取这个cookie文件。

这是cookie文件的内容

以下是源码:

运行结果:

反爬虫最基本的策略:

爬虫策略:

这两个都是在http协议的报文段的检查,同样爬虫端可以很方便的设置这些字段的值,来欺骗服务器。

反爬虫进阶策略:

1.像知乎一样,在登录的表单里面放入一个隐藏字段,里面会有一个随机数,每次都不一样,这样除非你的爬虫脚本能够解析这个随机数,否则下次爬的时候就不行了。

2.记录访问的ip,统计访问次数,如果次数太高,可以认为这个ip有问题。

爬虫进阶策略:

1.像这篇文章提到的,爬虫也可以先解析一下隐藏字段的值,然后再进行模拟登录。

2.爬虫可以使用ip代理池的方式,来避免被发现。同时,也可以爬一会休息一会的方式来降低频率。另外,服务器根据ip访问次数来进行反爬,再ipv6没有全面普及的时代,这个策略会很容易造成误伤。(这个是我个人的理解)。

通过Cookie限制进行反爬虫:

和Headers校验的反爬虫机制类似,当用户向目标网站发送请求时,会再请求数据中携带Cookie,网站通过校验请求信息是否存在Cookie,以及校验Cookie的值来判定发起访问请求的到底是真实的用户还是爬虫,第一次打开网页会生成一个随机cookie,如果再次打开网页这个Cookie不存在,那么再次设置,第三次打开仍然不存在,这就非常有可能是爬虫在工作了。

反爬虫进进阶策略:

1.数据投毒,服务器在自己的页面上放置很多隐藏的url,这些url存在于html文件文件里面,但是通过css或者js使他们不会被显示在用户看到的页面上面。(确保用户点击不到)。那么,爬虫在爬取网页的时候,很用可能取访问这个url,服务器可以100%的认为这是爬虫干的,然后可以返回给他一些错误的数据,或者是拒绝响应。

爬虫进进阶策略:

1.各个网站虽然需要反爬虫,但是不能够把百度,谷歌这样的搜索引擎的爬虫给干了(干了的话,你的网站在百度都说搜不到!)。这样爬虫应该就可以冒充是百度的爬虫去爬。(但是ip也许可能被识破,因为你的ip并不是百度的ip)

反爬虫进进进阶策略:

给个验证码,让你输入以后才能登录,登录之后,才能访问。

爬虫进进进阶策略:

图像识别,机器学习,识别验证码。不过这个应该比较难,或者说成本比较高。

参考资料:

廖雪峰的python教程

静觅的python教程

requests库官方文档

segmentfault上面有一个人的关于知乎爬虫的博客,找不到链接了