凤凰平台注册开户_凤凰彩票app下载安装_凤凰彩票投注网

热门关键词: 凤凰平台注册开户,凤凰彩票app下载安装,凤凰彩票投注网

python爬取知网,反爬虫计谋

作者: 编程知识  发布:2019-11-06

今天在演练写爬虫的时候,无独有偶同学的女对象有必要,大约是爬取知网内的几千个焦点的多寡,每叁个核心的条数记录有几条的到几千条的分化,总来的来讲也毕竟个上万数额级的爬虫了,剖判了下知网,发掘使用专门的工作检索,能够产生本身的对象,然后经过chrome的developer tools大约深入分析了下了须要数据包,开采知网的询问是分成两步的,第一步是二个总的需求(查询的口径基本上都在首先步里面了卡塔尔,会回来二个串

微博已经形成了爬虫的球场,本文利用Python中的requests库,模拟登入博客园,获取cookie,保存到地方,然后那几个cookie作为登入的证据,登陆微博的主页面,爬取新浪主页面上的标题和对应难点回答的摘要。

有关博客园验证码登入的难点,用到了Python上二个主要的图片管理库PIL,假使那几个,就把图片存到本地,手动输入。

追寻了好多材质,反爬虫计策只是为了让爬虫更复杂,更麻烦,近日日常未有能一劳永逸的方案。

图片 1

爬取腾讯网的重中之重的有的:模拟登录

由此对今日头条登入是的抓包,能够窥见登入天涯论坛,须要post多个参数,一个是账号,二个是密码,多个是xrsf。
以此xrsf掩没在表单里面,每便登入的时候,应该是服务器随机产生二个字符串。全部,要效仿登入的时候,一定要获得xrsf。

用chrome (可能火狐 httpfox 抓包剖析卡塔 尔(英语:State of Qatar)的结果:

image.png

所以,必定要获得xsrf的数值,注意那是八个动态变化的参数,每趟都不雷同。

image.png

注意findall和find_all函数的区别。

获得xsrf,上边就足以如法泡制登录了。
选取requests库的session对象,创设贰个对话的平价是,能够把同二个客户的比不上央求联系起来,直到会话截止都会活动管理cookies。

image.png

瞩目:cookies 是当前目录的叁个文书,那一个文件保留了新浪的cookie,如若是首先个登入,那么自然是未曾这么些文件的,无法因此cookie文件来登入。应当要输入密码。

def login(secret, account):
    # 通过输入的用户名判断是否是手机号
    if re.match(r"^1d{10}$", account):
        print("手机号登录 n")
        post_url = 'https://www.zhihu.com/login/phone_num'
        postdata = {
            '_xsrf': get_xsrf(),
            'password': secret,
            'remember_me': 'true',
            'phone_num': account,
        }
    else:
        if "@" in account:
            print("邮箱登录 n")
        else:
            print("你的账号输入有问题,请重新登录")
            return 0
        post_url = 'https://www.zhihu.com/login/email'
        postdata = {
            '_xsrf': get_xsrf(),
            'password': secret,
            'remember_me': 'true',
            'email': account,
        }
    try:
        # 不需要验证码直接登录成功
        login_page = session.post(post_url, data=postdata, headers=headers)
        login_code = login_page.text
        print(login_page.status_code)
        print(login_code)
    except:
        # 需要输入验证码后才能登录成功
        postdata["captcha"] = get_captcha()
        login_page = session.post(post_url, data=postdata, headers=headers)
        login_code = eval(login_page.text)
        print(login_code['msg'])
    session.cookies.save()
try:
    input = raw_input
except:
    pass

那是登入的函数,通过login函数来登入,post 本身的账号,密码和xrsf 到乐乎登录认证的页面上去,然后拿走cookie,将cookie保存到当前目录下的文书之中。后一次登入的时候,直接读取那些cookie文件。

#LWP-Cookies-2.0
Set-Cookie3: cap_id=""YWJkNTkxYzhiMGYwNDU2OGI4NDUxN2FlNzBmY2NlMTY=|1487052577|4aacd7a27b11a852e637262bb251d79c6cf4c8dc""; path="/"; domain=".zhihu.com"; path_spec; expires="2017-03-16 06:09:37Z"; version=0
Set-Cookie3: l_cap_id=""OGFmYTk3ZDA3YmJmNDQ4YThiNjFlZjU3NzQ5NjZjMTA=|1487052577|0f66a8f8d485bc85e500a121587780c7c8766faf""; path="/"; domain=".zhihu.com"; path_spec; expires="2017-03-16 06:09:37Z"; version=0
Set-Cookie3: login=""NmYxMmU0NWJmN2JlNDY2NGFhYzZiYWIxMzE5ZTZiMzU=|1487052597|a57652ef6e0bbbc9c4df0a8a0a59b559d4e20456""; path="/"; domain=".zhihu.com"; path_spec; expires="2017-03-16 06:09:57Z"; version=0
Set-Cookie3: q_c1="ee29042649aa4f87969ed193acb6cb83|1487052577000|1487052577000"; path="/"; domain=".zhihu.com"; path_spec; expires="2020-02-14 06:09:37Z"; version=0
Set-Cookie3: z_c0=""QUFCQTFCOGdBQUFYQUFBQVlRSlZUVFVzeWxoZzlNbTYtNkt0Qk1NV0JLUHZBV0N6NlNNQmZ3PT0=|1487052597|dcf272463c56dd6578d89e3ba543d46b44a22f68""; path="/"; domain=".zhihu.com"; path_spec; expires="2017-03-16 06:09:57Z"; httponly=None; version=0

那是cookie文件的开始和结果

以下是源码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
try:
    import cookielib
except:
    import http.cookiejar as cookielib
import re
import time
import os.path
try:
    from PIL import Image
except:
    pass

from bs4 import BeautifulSoup


# 构造 Request headers
agent = 'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0'
headers = {
    "Host": "www.zhihu.com",
    "Referer": "https://www.zhihu.com/",
    'User-Agent': agent
}

# 使用登录cookie信息
session = requests.session()
session.cookies = cookielib.LWPCookieJar(filename='cookies')
try:
    session.cookies.load(ignore_discard=True)
except:
    print("Cookie 未能加载")



def get_xsrf():
    '''_xsrf 是一个动态变化的参数'''
    index_url = 'https://www.zhihu.com'
    # 获取登录时需要用到的_xsrf
    index_page = session.get(index_url, headers=headers)
    html = index_page.text
    pattern = r'name="_xsrf" value="(.*?)"'
    # 这里的_xsrf 返回的是一个list
    _xsrf = re.findall(pattern, html)
    return _xsrf[0]





# 获取验证码
def get_captcha():
    t = str(int(time.time() * 1000))
    captcha_url = 'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login"
    r = session.get(captcha_url, headers=headers)
    with open('captcha.jpg', 'wb') as f:
        f.write(r.content)
        f.close()
    # 用pillow 的 Image 显示验证码
    # 如果没有安装 pillow 到源代码所在的目录去找到验证码然后手动输入
    try:
        im = Image.open('captcha.jpg')
        im.show()
        im.close()
    except:
        print(u'请到 %s 目录找到captcha.jpg 手动输入' % os.path.abspath('captcha.jpg'))
    captcha = input("please input the captchan>")
    return captcha





def isLogin():
    # 通过查看用户个人信息来判断是否已经登录
    url = "https://www.zhihu.com/settings/profile"
    login_code = session.get(url, headers=headers, allow_redirects=False).status_code
    if login_code == 200:
        return True
    else:
        return False


def login(secret, account):
    # 通过输入的用户名判断是否是手机号
    if re.match(r"^1d{10}$", account):
        print("手机号登录 n")
        post_url = 'https://www.zhihu.com/login/phone_num'
        postdata = {
            '_xsrf': get_xsrf(),
            'password': secret,
            'remember_me': 'true',
            'phone_num': account,
        }
    else:
        if "@" in account:
            print("邮箱登录 n")
        else:
            print("你的账号输入有问题,请重新登录")
            return 0
        post_url = 'https://www.zhihu.com/login/email'
        postdata = {
            '_xsrf': get_xsrf(),
            'password': secret,
            'remember_me': 'true',
            'email': account,
        }
    try:
        # 不需要验证码直接登录成功
        login_page = session.post(post_url, data=postdata, headers=headers)
        login_code = login_page.text
        print(login_page.status_code)
        print(login_code)
    except:
        # 需要输入验证码后才能登录成功
        postdata["captcha"] = get_captcha()
        login_page = session.post(post_url, data=postdata, headers=headers)
        login_code = eval(login_page.text)
        print(login_code['msg'])
    session.cookies.save()
try:
    input = raw_input
except:
    pass



## 將main的問題列表輸出在shell上面
def  getPageQuestion(url2):  
  mainpage = session.get(url2, headers=headers)
  soup=BeautifulSoup(mainpage.text,'html.parser')
  tags=soup.find_all("a",class_="question_link")
  #print tags

  for tag in tags:
    print tag.string

# 將main頁面上面的問題的回答的摘要輸出在shell上面
def getPageAnswerAbstract(url2):
    mainpage=session.get(url2,headers=headers)
    soup=BeautifulSoup(mainpage.text,'html.parser')
    tags=soup.find_all('div',class_='zh-summary summary clearfix')

    for tag in tags:
       # print tag
        print tag.get_text()
        print '詳細內容的鏈接 : ',tag.find('a').get('href')


def getPageALL(url2):
    #mainpage=session.get(url2,headers=headers)
    #soup=BeautifulSoup(mainpage.text,'html.parser')
    #tags=soup.find_all('div',class_='feed-item-inner')
    #print "def getpageall "
    mainpage=session.get(url2,headers=headers)
    soup=BeautifulSoup(mainpage.text,'html.parser')
    tags=soup.find_all('div',class_='feed-content')
    for tag in tags:
        #print tag
        print tag.find('a',class_='question_link').get_text()
        # 這裏有一點問題 bs 還是用的不是太熟練
        #print tag.find('a',class_='zh-summary summary clearfix').get_text()
        #print tag.find('div',class_='zh-summary summary clearfix').get_text()


if __name__ == '__main__':
    if isLogin():
        print('您已经登录')
        url2='https://www.zhihu.com'
        # getPageQuestion(url2)
        #getPageAnswerAbstract(url2)
        getPageALL(url2)
    else:
        account = input('请输入你的用户名n>  ')
        secret = input("请输入你的密码n>  ")
        login(secret, account)

运维结果:

image.png

以下的国策只是充实爬虫的难度,扩充爬虫花销。

下一场能力做第二步的数额伏乞(下方的截图对应网页上的例外区域的伸手报文头和再次来到数据卡塔尔

git链接:

https://github.com/zhaozhengcoder/Spider/tree/master/spider_zhihu

1.Headers限制

图片 2

检查User-Agent属性,判别是不是为浏览器采访。

自己争辨Referer属性,判别来自。

图片 3

PPS:作者所通晓的爬虫与反爬虫战略

反爬虫最大旨的战略:

  1. 反省浏览器http必要里面的user-agent字段
  2. 检查http乞求的referer(即当前的那么些页面是从哪个页面跳转过来的卡塔 尔(阿拉伯语:قطر‎

爬虫计策:
那七个都以在http左券的报文段的自己商量,相仿爬虫端能够很便利的设置这几个字段的值,来新浪搬家服务器。

反爬虫进级攻略:
1.像乐乎同样,在签到的表单里面放入一个隐藏字段,里面会有四个私行数,每一趟都不等同,那样除非您的爬虫脚本能够深入分析这几个自由数,否则下一次爬的时候就不行了。
2.记下拜见的ip,总括访谈次数,要是次数太高,能够感到这些ip有标题。

爬虫进级战术:
1.像那篇小说提到的,爬虫也能够先拆解深入分析一下掩盖字段的值,然后再开展效仿登录。
2.爬虫能够选拔ip代理池的办法,来幸免被察觉。同期,也得以爬一会休憩一会的秘技来下滑成效。其余,服务器依照ip访谈次数来举办反爬,再ipv6没有周到推广的时日,那一个政策会相当轻易产生风险。(这一个是本人个人的知晓卡塔 尔(英语:State of Qatar)。

反爬虫进进级计策:
1.数额投毒,服务器在温馨的页面上停放相当多藏身的url,那几个url存在于html文件文件之中,但是经过css可能js使他们不会被出示在顾客观察的页面上边。(确定保障顾客点击不到卡塔尔国。那么,爬虫在爬取网页的时候,很用也许取访谈这一个url,服务器能够百分之百的认为那是爬虫干的,然后能够回来给他有个别错误的数额,大概是不容响应。

爬虫进升级计谋:
1.依次网址就算需求反爬虫,但是不可见把百度,Google那样的搜寻引擎的爬虫给干了(干了的话,你的网址在百度都在说搜不到!卡塔尔。那样爬虫应该就足以杜撰是百度的爬虫去爬。(可是ip可能也许被查出,因为你的ip并非百度的ip卡塔 尔(阿拉伯语:قطر‎

反爬虫进进进级战术:
给个验证码,令你输入今后技术登陆,登入之后,工夫访谈。

爬虫进进进级攻略:
图像识别,机器学习,识别验证码。不过那个相应相比较难,也许说成本相比高。

参照他事他说加以考察资料:
廖雪峰的python教程
静觅的python教程
requests库官方文书档案
segmentfault上面有一位的有关果壳网爬虫的博客,找不到链接了

以下是英特网采撷的获得不到HTTP_REFERELacrosse值的情事:

① 在浏览器内一贯敲UCRUISERL

② windows桌面上的超链接图标

③浏览器内书签

④第三方软件(如Word,Excel等卡塔 尔(阿拉伯语:قطر‎内容中的链接

⑤SSL认证网址跳入

⑥; meta页面设置自动跳转时,在example.com将取不到REFEREWrangler U奇骏L

⑦使用JavaScript的Location.href或者是Location.replace()

那应当是最广大的,最主题的反爬虫花招,首如若起初决断你是或不是是真实的浏览器在操作。

                                                                       图朝气蓬勃.询问记录央浼报文头

2.IP限制

界定IP也是过多网址反爬虫的当初的愿景,有些人无论写一个周而复始,就从头暴力爬取 ,确实会给网站服务器带给相当的大的担当,而这种反复的拜访,鲜明也不会是实在顾客作为,索性决断把您封掉。

自然,攻击者能够透过持续换IP的样式来绕过这种限定。并且封IP会流失客户,日常景观下不会动用。

图片 4

3.动态加载

通过异步加载,一方面是为了反爬虫,一方面也能够给网页浏览带给分歧的体验,达成更加多的职能。很多动态网址都以经过ajax也许JavaScript来加载乞请的网页。

                                                                        图二. 对应分歧年份的笔录条数重临结果

4.验证码

给客商乞求次数加二个阀值,超越该阀值,弹出验证码分界面。

至于何以要分成两步,种种区域对应贰个不生龙活虎的央求,这几个都以网址本人的设计,作者也没做过web开荒,这么做有哪些亮点小编真的不明白/擦汗,作者的第豆蔻梢头正是效仿它在网页上的乞请,实现批量化的多少获得。

5.回到虚构的新闻

规定该央浼为爬虫央浼后,重临虚假混乱的数额扩张筛选复杂度。

以下是援用sexycoder的观点:

反爬虫最焦点的陈设:

1.检查浏览器http央求里面包车型地铁user-agent字段

2.检查http央求的referer(即当前的那几个页面是从哪个页面跳转过来的卡塔尔

爬虫战术:

那多个都以在http左券的报文段的检查,相像爬虫端可以十分的低价的设置这个字段的值,来哄骗服务器。

反爬虫进级计策:

1.像和讯同样,在登入的表单里面放入多个隐敝字段,里面会有二个随意数,每一回都分化样,这样除非您的爬虫脚本能够分析这些自由数,不然下次爬的时候就不行了。

2.笔录拜见的ip,总计访问次数,如若次数太高,能够以为这么些ip非凡。

爬虫进级攻略:

1.像这篇文章提到的,爬虫也足以先深入解析一下隐蔽字段的值,然后再实行效仿登入。

2.爬虫能够运用ip代理池的方法,来制止被开采。同期,也得以爬一会安息一会的主意来收缩效用。其余,服务器依据ip访谈次数来进展反爬,再ipv6未有康健推广的一代,这一个方针会相当轻巧招致损伤。

反爬虫进进级战略:

1.数额投毒,服务器在本身的页面上放置比较多掩蔽的url,那些url存在于html文件文件之中,可是透过css只怕js使她们不会被出示在客商观察的页面上边。(确认保障顾客点击不到卡塔尔国。那么,爬虫在爬取网页的时候,很用恐怕取访问那一个url,服务器能够百分之百的以为那是爬虫干的,然后能够回来给她某个错误的数码,大概是不容响应。

爬虫进进级攻略:

1.逐项网址纵然供给反爬虫,不过不可以预知把百度,Google那样的探索引擎的爬虫给干了(干了的话,你的网址在百度都在说搜不到!卡塔尔国。那样爬虫应该就足以以假乱真是百度的爬虫去爬。(不过ip可能恐怕被搜查缉获,因为你的ip而不是百度的ip卡塔尔国

反爬虫进进进级计谋:

给个验证码,令你输入未来才具登入,登陆之后,技艺访谈。

爬虫进进进级战术: 图像识别,机器学习,识别验证码。可是这些应该相比难,也许说花销相比高。  

 

下一场,差不离就摸清楚了那三个多少得到的长河,作者的笔触是先完成二个数量级的数据得到,也即是爬取一条,然后再去扩展,加线程,加ip代理,加user_agent等等。

在这里个等第,首要的思路正是基本上要和在网页上的走访保持一致,有限支撑自个儿拼的url和在网页上访问的时候是相通的,当然是在保险能访问的前提下,能略去的就略去。

深入分析它原先的伸手url的时候,使用url转码工具得以将转码现在的url还原,越来越直白地深入分析。

下一场提多少个细节呢,知网的伸手url上,有部分数码段生机勃勃开端是不知底它的意思的,然而自身去拼接待上访谈的时候开掘,缺了网站就能够报错,此时就足以多品尝多少个例外的拜访,去拿它的央浼heads,然后互绝相比较,就可以意识有些字段是定点不改变的,这种就足以一向照搬,有的吧,是变化的,这种就必要细致去深入分析到底是什么样数据,有如何意义,知网的就蕴含二个皮秒数,这一个小编意气风发开首就没懂具体意思,后来解析了下以为像时光,然后去取了下当前的微秒时间,后生可畏相比开采大致是大半,就这两天的皮秒时间拼在了url串上面。

def getMilliTim():
    t = time.time()
    nowTime = t*1000
    return int(nowTime)

假设您须求八个优秀的求学交换条件,那么你可以杜撰Python学习交换群:548377875; 如果你供给大器晚成份系统的就学材质,那么你能够思量Python学习交换群:548377875。

总来说之,便是对此有些懂web的爬虫小白,最棒就是还原网址原来的乞请,那样基本上央求数据就不会有太大主题材料了。

在达成了数量级为风姿洒脱的品级后,就起先思虑大规模地获取数据了,当时就要酌量效能甚至防守网址踢人了。

在备受了种种socket 10054 10061等悖谬,通过百度各类工夫,加上了ip代理等部分主意,最后小编或然完花销次职责,当然最后依然增进了文件读取,任务队列等模块,大致正是多个线程专责输出文件,此外多少个线程去职务池里面取职务爬数据,详细略过,见代码。有错误疏失之处,还请斧正。

本文由凤凰平台注册开户发布于编程知识,转载请注明出处:python爬取知网,反爬虫计谋

关键词:

上一篇:python功底的上学,Java语言逻辑运算
下一篇:没有了