zoukankan      html  css  js  c++  java
  • Python爬虫学习

    利用Python完成简单的站点登陆

      最近学习到了爬虫,瞬时觉得很高大上,想取什么就取什么,感觉要上天。这里分享一个简单的登陆抽屉新热榜的教程(因为它不需要验证码,目前还没有学会图像识别。哈哈),供大家学习。

    需要的知识点储备

      本次爬虫脚本依赖两个模块:requests模块,BeautifulSoup模块。其中requests模块完成url的请求,而BeautifulSoup模块负责解析Html标签。

      主要的用法在上一讲已经列出,这里不再赘述。

    思路

       和爬取图片的思路是相同的,首先我们人工登陆一次,确认每次交互发送接受的数据。

    打开首页查看交互信息

      在浏览器里访问 http://dig.chouti.com/ 打开控制台,查看网络请求信息,发现在get请求的应答信息中包涵了cookies。

    点击登陆后的交互信息

       点击登陆后查看网络信息,发现只发送了用户名、密码、以及是否保存密码等参数。

        疑问:我们知道为了防止xss攻击,网站都会做一些基础的防护,比如csrf_token等,但是这里并没有看到携带什么token数据,难道是抽屉没有进行防护吗?其实不是的,目前大部分网站都采用的方式是,第一个get请求会发送未认证的cookie,当用户登陆时携带该cookies,服务端对cookies进行认证,如果登陆时没有携带cookies,服务端将会拒绝服务,所以我们要记录第一个get请求的cookies。

    点赞后提交的信息

      通过查看网络交互信息后发现,点赞后,只是向服务端发送了文章的ID。

    流程

      根据以上思路得出以下步骤:

    1. 发送get请求获取页面信息,储存cookies信息
    2. 向登陆页发送post请求,携带cookies信息
    3. 由于返回了两次cookies,保险起见,创建一个cookies字典,把多次返回的cookies,一一存储后整体提交。
    4. 登陆成功后,找到看到的所有文章标签,获取它的linksid
    5. 发送post请求携带linksid,进行点赞操作

    完成的代码

    import requests
    from bs4 import BeautifulSoup
    
    # get请求cookies
    response = requests.get('http://dig.chouti.com/')
    get_cookies = response.cookies
    
    
    # post请求cookies
    response = requests.post('http://dig.chouti.com/login',
                             data={
                                 'phone':8613526773228,
                                 'password': 'aini3845',
                                 'oneMonth': '1',
                             },
                             cookies=get_cookies
                             )
    login_cookies = response.cookies
    
    # 组件cookies
    all_cookies = {}
    all_cookies.update(get_cookies)
    all_cookies.update(login_cookies)
    
    
    # 查询文章列表
    response = requests.get('http://dig.chouti.com/',cookies=all_cookies)
    soup = BeautifulSoup(response.text,'html.parser')
    tag = soup.find(id="content-list")
    
    # 点赞的前缀url
    urls = 'http://dig.chouti.com/link/vote'
    
    # 点赞操作
    for item in tag.find_all(name='div',attrs={'class':'part2'}):
        if item.get('share-linkid'):
            link_id = item.get('share-linkid')
            response = requests.post(urls+'?linksId=%s' % link_id,cookies=all_cookies)
            print(response.text)
  • 相关阅读:
    解析url
    初学react
    移动端判断用户滑动方向
    冒泡排序、快速排序、数组去重
    Angular Material主题配置
    reset()方法的使用、jq下面reset()的正确使用方法
    conts、var 、let的区别
    NLP
    mybatis的执行流程
    PHP递归算法示例:打印无限级数组元素的值
  • 原文地址:https://www.cnblogs.com/dachenzi/p/7700578.html
Copyright © 2011-2022 走看看