python网络爬虫(14)博客园用户信息爬取

说明

这里只放代码,方案技术没有更变

代码说明

需要cookies绕过登录,使用selenium在Firefox下模拟。需要安装geck...?插件,另外,数据存储在sqlite,需要安装。

Spider.py

import HtmlDownloader
import HtmlParser
import DataOutput
import UrlManager
import re
from selenium import webdriver
class Spider(object):
    def __init__(self):
        self.downloader=HtmlDownloader.HtmlDownloader()
        self.parser=HtmlParser.HtmlParser()
        self.output=DataOutput.DataOutput()
        self.urlManager=UrlManager.UrlManager()
        self.driver=webdriver.Firefox()

    def crawl(self,root_url):
        content=self.downloader.download_root(root_url,self.driver)
        urls=self.parser.parser_url(content)
        self.urlManager.add_urls(urls)
        i=0
        while self.urlManager.new_urls_size()>0 and self.urlManager.old_urls_size()<2000:
            url=self.urlManager.get_new_url()
            i=i+1
            print(str(i)+‘:‘+str(url))
            pattern=re.compile(‘/.*?/‘)
            user_name=re.findall(pattern,url)
            url=‘https://home.cnblogs.com‘+user_name[1]

            content=self.downloader.download(self.driver,url)
            new_urls=self.parser.parser_url(content)
            self.urlManager.add_urls(new_urls)

            try:
                content=self.parser.parser_data(self.driver)
                self.output.store_data(content)
            except:
                i=i-1
                print(‘error url may not exits:‘+self.driver.current_url)
        self.output.output_end()
        self.urlManager.save_status()
        #self.driver.close()
        print(‘ed‘)
if __name__==‘__main__‘:
    spider=Spider()
    spider.crawl(‘https://www.cnblogs.com/‘)

UrlManager.py

import pickle
import hashlib
import re
class UrlManager():
    def __init__(self):
        self.old_urls=self.load_process(‘new_urls‘)
        self.new_urls=self.load_process(‘old_urls‘)

    def load_process(self,file_name):
        print(‘loading .‘)
        try:
            with open(file_name,‘rb‘) as f:
                tmp=pickle.load(f)
                return tmp
        except:
            print(‘file may not exist.will create it‘)
        new_set=set()
        self.save_process(file_name,new_set)
        return new_set

    def save_process(self,file_name,data):
        with open(file_name,‘wb‘) as f:
            pickle.dump(data,f)

    def save_status(self):
        self.save_process(‘new_urls‘,self.new_urls)
        self.save_process(‘old_urls‘,self.old_urls)

    def add_urls(self,urls):
        for url in urls:
            m=hashlib.md5()
            m.update(url.encode(‘utf8‘))
            url_md5=m.hexdigest()[8:-8]
            if url not in self.new_urls and url_md5 not in self.old_urls:
                self.new_urls.add(url)

    def get_new_url(self):
        new_url=self.new_urls.pop()
        m=hashlib.md5()
        m.update(new_url.encode(‘utf8‘))
        url_md5=m.hexdigest()[8:-8]
        self.old_urls.add(url_md5)
        return new_url

    def new_urls_size(self):
        return len(self.new_urls)

    def old_urls_size(self):
        return len(self.old_urls)

HtmlParser.py

import re
import json
class HtmlParser(object):
    def parser_url(self,content):
        pattern=re.compile(u‘https://www.cnblogs.com/\w*/‘)
        all_urls=re.findall(pattern,content)
        all_urls=list(set(all_urls))
        return all_urls

    def parser_data(self,driver):
        dict={}
        user_id=driver.find_element_by_class_name(‘display_name‘).text
        all_message=driver.find_element_by_class_name(‘user_profile‘).text
        all_message=all_message.split(‘\n‘)
        all_message.insert(0,‘用户ID:‘+user_id+‘\n‘)
        switch={‘用户ID‘:‘user_id‘,
                ‘姓名‘:‘name‘,
                ‘性别‘:‘sex‘,
                ‘出生日期‘:‘birth_day‘,
                ‘家乡‘:‘hometown‘,
                ‘现居住地‘:‘live_place‘,
                ‘单位‘:‘work_for‘,
                ‘工作状况‘:‘job_status‘,
                ‘感兴趣的技术‘:‘interest_technology‘,
                ‘最近目标‘:‘recent_goal‘,
                ‘座右铭‘:‘mark_words‘,
                ‘自我介绍‘:‘introduce‘,
                ‘园龄‘:‘blog_age‘,
                ‘博客‘:‘blog_address‘,
                ‘婚姻‘:‘marriage‘,
                ‘职位‘:‘position‘,
                ‘QQ‘:‘qq‘,
                ‘Email‘:‘email‘
            }
        key=‘‘
        value=‘‘
        for each in all_message:
            try:
                each=each.replace(‘\n‘,‘‘)
                key=switch[each.split(‘:‘)[0]]
                value=each.split(‘:‘)[1]
                dict[key]=value
            except:
                print(‘split error:‘+each+‘auto fixed..‘)
                value=value+each
                dict[key]=value
                print(dict)
        return dict

HtmlDownloader.py

import json
class HtmlDownloader(object):
    def download_root(self,url,driver):
        driver.get(url)
        with open(‘cookies.json‘, ‘r‘, encoding=‘utf-8‘) as f:
            listCookies = json.loads(f.read())
        for cookie in listCookies:
            driver.add_cookie({
                ‘domain‘: cookie[‘domain‘],  # 此处xxx.com前,需要带点
                ‘name‘: cookie[‘name‘],
                ‘value‘: cookie[‘value‘]
            })
        driver.refresh()
        return driver.page_source

    def download(self,driver,url):
        driver.get(url)
        return driver.page_source

DataOutput.py

import sqlite3
class DataOutput(object):
    def __init__(self):
        self.cx=sqlite3.connect("cnblog.db")
        self.table_name=‘cnblog‘
        self.create_table()

    def create_table(self):
        values=‘‘‘
        id integer primary key autoincrement,
        user_id varchar(50) not null,
        name varchar(50),
        sex varchar(6),
        birth_day varchar(30),
        hometown varchar(50),
        live_place varchar(50),
        marriage varchar(20),
        position varchar(30),
        work_for varchar(50),
        job_status varchar(20),
        interest_technology varchar(200),
        recent_goal varchar(500),
        mark_words varchar(500),
        introduce varchar(500),
        blog_age varchar(30),
        blog_address varchar(100),
        qq varchar(15),
        email varchar(30)
        ‘‘‘
        self.cx.execute(‘create table if not exists %s(%s)‘ %(self.table_name,values))

    def store_data(self,data):
        flag=0
        user_id=‘‘
        for key,value in data.items():
            if flag==0:
                cmd="insert into %s (%s) values (‘%s‘)" %(self.table_name,key,value)
                user_id=value
                flag=1
            else:
                cmd=‘update %s set %s="%s" where user_id="%s"‘ %(self.table_name,key,value,user_id)
            self.cx.execute(cmd)
        self.cx.commit()

    def output_end(self):
        self.cx.close()

原文地址:https://www.cnblogs.com/bai2018/p/11219819.html

时间: 2024-11-08 21:15:49

python网络爬虫(14)博客园用户信息爬取的相关文章

PageRank 计算博客园用户排名

PageRank 通过网页与网页之间的链接关系计算各网页权重,一般权重高的网页特点是:链接向它的网页数量多.链向它的网页其权重也较高.PageRank 就是通过这样的连接关系,一轮轮迭代计算后得出各网页的权重. 思路拓展一下,其实人与人之间也是连接着的,在社会的人际关系网中,每个人的社会地位和身价也是不同的.以微博为例,我们都有关注者和粉丝(类似网页之间的链接),可以发现所谓的“大V”基本上粉丝数量多,并且粉丝里不乏很多其他“大V”,所以这个帐号的价值就大. 同样博客园也具有类似的社交关系,用户

PageRank实践-博客园用户PageRank排名

博客园用户由关注和粉丝的关系,这与网页的链接关系很类似,于是我就爬了博客园的粉丝与关注用户,然后计算了一下用户的PageRank排名,注意本排名仅仅是个人娱乐,不代表任何利益,而且可能计算有误,望大家不要较真. 关于PageRank的原理和计算方法参看上一篇文章,这篇文章主要介绍一下博客园用户PageRank的结果. 目前博客园用户超过了17万,我以自己为启点,不断的爬取用户的粉丝和关注,最终爬到的用户是132483,还剩4万多的用户没有爬取到,我分析这部分用户是既没有粉丝也不关注其他用户的孤岛

python 爬虫 计算博客园浏览量,刷浏览量

首先进入博客园的管理页面: 通过观察A-JAX请求,发现博客的分类(categories)是一个json格式的数据即:                                    于是先爬取categories.通过各个分类的页面进而爬去地址,浏览量,打开一个category的页面: 检查网页     这样就得到了每个博客的地址和浏览量了 上代码,其他一些问题在代码中给出注释: import time import requests import json import re from

运维学python之爬虫高级篇(七)scrapy爬取知乎关注用户存入mongodb

首先,祝大家开工大吉!本篇将要介绍的是从一个用户开始,通过抓关注列表和粉丝列表,实现用户的详细信息抓取并将抓取到的结果存储到 MongoDB. 1 环境需求 基础环境沿用之前的环境,只是增加了MongoDB(非关系型数据库)和PyMongo(Python 的 MongoDB 连接库),默认我认为大家都已经安装好并启动 了MongoDB 服务. 项目创建.爬虫创建.禁用ROBOTSTXT_OBEY设置略(可以参考上一篇) 2 测试爬虫效果 我这里先写一个简单的爬虫,爬取用户的关注人数和粉丝数,代码

运维学python之爬虫高级篇(五)scrapy爬取豆瓣电影TOP250

对于scrapy我们前面已经介绍了简单的应用,今天我们用一个完整的例子,爬取豆瓣电影TOP250来做一个小的练习,把scrapy阶段做一个总结. 1 环境配置 语言:Python 3.6.1 IDE: Pycharm 浏览器:firefox 爬虫框架:Scrapy 1.5.0 操作系统:Windows 10 家庭中文版 2 爬取前分析 2.1 需要保存的数据 首先确定我们要获取的内容,在items中定义字段,来将非结构化数据生成结构化数据,获取的内容主要包括:排名.电影名称.得分.评论人数.如下

抖音用户信息爬取案例 &#197057;

原文: http://blog.gqylpy.com/gqy/416 置顶:来自一名75后老程序员的武林秘籍--必读(博主推荐) 来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我

抖音分享页用户信息爬取

其实这个是有客户要求做的,但我完成的不够完美.过来分享出来好了~ 首先,你知道抖音有一个用户分享页吧? 像这样的:https://www.douyin.com/share/user/58841646784 F12查看代码. ok,可以看到有数字的地方都做了字体反爬,比如抖音id上的数字啊,粉丝数这些. 那我们这样子,先把它的这个字体文件下载下来 在开发者工具中选择Network筛选font后刷新网页就能找到这个字体了,如下图: 然后复制链接到新窗口打开就能下载字体了. 这是我下到的字体 下一步就

Python爬虫爬取博客园并保存

Python爬虫爬取博客园并保存        爬取博客园指定用户的文章修饰后全部保存到本地 首先定义爬取的模块文件: crawlers_main.py 执行入口 url_manager.py url管理器 download_manager.py 下载模块 parser_manager.py html解析器(解析html需要利用的内容) output_manager.py 输出html网页全部内容文件(包括css,png,js等) crawlers_main.py 执行入口 1 # coding

网络爬虫+HtmlAgilityPack+windows服务从博客园爬取20万博文

网络爬虫+HtmlAgilityPack+windows服务从博客园爬取20万博文 1.前言 最新在公司做一个项目,需要一些文章类的数据,当时就想到了用网络爬虫去一些技术性的网站爬一些,当然我经常去的就是博客园,于是就有下面的这篇文章. 2.准备工作 我需要把我从博客园爬取的数据,保存起来,最好的方式当然是保存到数据库中去了,好了我们先建一个数据库,在来一张表,保存我们的数据,其实都很简单的了啊,如下图所示 BlogArticleId博文自增ID,BlogTitle博文标题,BlogUrl博文地