zoukankan      html  css  js  c++  java
  • python模拟登录博客园并爬取用户粉丝数

    1.模拟登录博客园

    我们用chrome监控登录界面,选到network那一栏。 点击登录后发现信息里面并没有我们想要的登录时post的信息。 但是可以发现在点击的一瞬间是有一个signin这个文件的,
    但是切换页面之后就没有了, 手快一点按ctrl+e可以捕获到....用一些抓包工具应该也可以, 但是我还不太会。
    然后点击signin那个文件, 可以看到input1, input2, remember的信息 这样我们想要的登录信息就有了。

    data = {
        'input1':'你获得的input1',
        'input2':'你获得的input2',
        'remember':'false'
        }
    

    然后登录就好

    url = 'http://passport.cnblogs.com/user/signin'
    requests.post(url, data = data, headers = headers)
    # headers里面是cookie, user-agent, accept和refer
    

    2. 爬取用户的粉丝数量

    大概思想就是bfs, 用一个队列, 从我出发,先将我自己加入队列。 找到我的关注者, 然后将我的关注者加入队列, 然后不断循环。 期间用了set来判重, 因为可能有很多人关注了同一个人的情况。

    爬一个人的关注者的时候, 如果一个人关注的人很多, 那么就是很多页来显示。 发现一页可以显示45个他关注的人, 所以页数就是他关注的人数/45然后向上取整, 用ceil函数就可以。

    #baseUrl = 'http://home.cnblogs.com/u/id/'
    def getUrls(baseUrl, page_num):
        ret = []
        for page in range(1, page_num+1):
            url = baseUrl+str(page)
            wb_data = req.get(url, headers = headers)
            soup = BeautifulSoup(wb_data.text, 'lxml')
            urls = soup.select('#main ul .avatar_name a')
            for item in urls:
                ret.append(item)
        return ret
    

    这样就可以将他的关注者的主页链接全都加入到一个列表里面。

    代码写的超级丑并且没写异常捕获..
    我在bfs的时候加了一个cnt来控制抓取的人数, 不加的话就是将所有信息抓完才停, 实在有点慢...

    from bs4 import BeautifulSoup
    import requests
    import queue
    import math
    
    req = requests.Session()
    s = set()
    data = {
        'input1': 'input1',
        'input2': 'input2',
        'remember':'false'
    }
    headers = {
        'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36',
        'Referer':'http://home.cnblogs.com/u/yohaha/followers/',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Cookie':'__gads=ID=242d857f42405107:T=1461752712:S=ALNI_MYx-fX1RCbXzt0qM78IcU2PYuuw2A; _gat=1; .CNBlogsCookie=44310FE3A99973E1AF1BF7C7D716262617D36C9AAC9BB954269053FE51E2C9A1DDE06EA53089E7F03298E1C36C2CF89FDF71A6165725AED17040D66EA2AFD6430A627C12B187CD6F23E7635F914AC15BD6D0FD2C; _ga=GA1.2.8402864.1461752940'
    }
    def getUrls(baseUrl, page_num):
        ret = []
        for page in range(1, page_num+1):
            url = baseUrl+str(page)
            wb_data = req.get(url, headers = headers)
            soup = BeautifulSoup(wb_data.text, 'lxml')
            urls = soup.select('#main ul .avatar_name a')
            for item in urls:
                ret.append(item)
        return ret
    
    def login():
        url = 'http://passport.cnblogs.com/user/signin'
        requests.post(url, data = data, headers = headers)
    
    def crawler():
        baseUrl = 'http://home.cnblogs.com'
        q = queue.Queue()
        q.put('http://home.cnblogs.com/u/yohaha/')
        s.add('http://home.cnblogs.com/u/yohaha/')
        cnt = 0
        l = []
        login()
        while not q.empty() and cnt < 100:  
            url = q.get()
            cnt = cnt + 1
            wb_data = req.get(url, headers = headers)
            soup = BeautifulSoup(wb_data.text, 'lxml')
            name = str(soup.select('#user_profile_block > table > tbody > tr > td > div > h1')[0].get_text())
            name = name.strip('
    							')
            num = int(soup.select('#follower_count')[0].get_text())     #粉丝的数量
            page_num = math.ceil(int(soup.select('#following_count')[0].get_text())/45)     #关注的人的页数
    
            data = {
                'name': name,
                'followersNum': num,
                'url': url
            }
            l.append(data)
            url = baseUrl+soup.select('.data_left #following_count ')[0].get('href')
            urls = getUrls(url, page_num)
            for url in urls:
                newUrl = baseUrl+url.get('href')
                if newUrl not in s:         #判重
                    q.put(newUrl)
                    s.add(newUrl)
        return l
    
    
    l = crawler()
    l = sorted(l, key = lambda x:x['followersNum'], reverse = True)
    for info in l:
        print(info)
    
  • 相关阅读:
    leetcode 347. Top K Frequent Elements
    581. Shortest Unsorted Continuous Subarray
    leetcode 3. Longest Substring Without Repeating Characters
    leetcode 217. Contains Duplicate、219. Contains Duplicate II、220. Contains Duplicate、287. Find the Duplicate Number 、442. Find All Duplicates in an Array 、448. Find All Numbers Disappeared in an Array
    leetcode 461. Hamming Distance
    leetcode 19. Remove Nth Node From End of List
    leetcode 100. Same Tree、101. Symmetric Tree
    leetcode 171. Excel Sheet Column Number
    leetcode 242. Valid Anagram
    leetcode 326. Power of Three
  • 原文地址:https://www.cnblogs.com/yohaha/p/5441333.html
Copyright © 2011-2022 走看看