学python几个月了正好练练手,发现问题不断提高,先从专题入手,爬取些数据,一开始对简书网站结构不熟悉,抓取推荐,热门,城市3个导航栏,交流发现推荐和热门是排序不同,url会重复,以及每个专题详情页三个类目最新评论,最新收录, 热门也会重复 做了下调整,代码执行完毕会返回所有专题的urls元组对象,以便下一步进入每个专题页面解析获取其他数据。注:变量focus关注数,和打开专题后最上面显示的专题关注人数会有差异,例如有的专题关注了10175人,在专题列表页会显示成"10.07k",因此在下一次获取详情页的时候回取到具体数值

多进程获取简书专题数据并写入MySQL数据库

  • 抓取热门和城市页面http://www.jianshu.com/recommendations/collections分类下的所有专题url,专题名字,收录文章数,关注数
  • 定义多个函数获取
    • 获取城市和热门两个分类异步加载的url函数
    • 解析url函数
    • 抓取数据 返回data对象
    • 获取数据存入数据库
    • 多进程

建表

#MySQL数据库建表
CREATE TABLE catetable(
cate_name VARCHAR(255),
cate_url VARCHAR(255),
total_num INT(19),
focus INT(19),
KEY cate_name(cate_name),
KEY cate_url(cate_url)
)ENGINE=INNODB DEFAULT CHARSET=utf8

python代码

#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import requests
from lxml import etree
import MySQLdb
from multiprocessing import Pool '''
获取所有所有专题所在页的url列表下一步提取每个专题的url
分析:http://www.jianshu.com/recommendations/collections页面为异步加载,查看热门和城市导航栏请求构造url列表
'''
def get_cateurls():
urls=[]
for i in range(1, 3):
cityurl='http://www.jianshu.com/recommendations/collections?page=%s&order_by=city' % i
urls.append(cityurl)
for j in range(1,40):
hoturl='http://www.jianshu.com/recommendations/collections?page=%s&order_by=hot'% j
urls.append(hoturl)
return urls ''' 解析页面 '''
def get_response(url):
html=requests.get(url).content
selector=etree.HTML(html)
return selector ''' 获取专题数据 得到专题名称 专题url 收录文章数 关注人数 通过zip函数转置数据返回data对象'''
def get_catedata(url):
selector=get_response(url)
cate_url= map(lambda x: 'http://www.jianshu.com'+x, selector.xpath('//div[@id="list-container"]//div[contains(@class,"count")]/a/@href'))
cate_name=selector.xpath('//div/h4/a/text()')
total_num=map(lambda x: int(x.strip("篇文章").strip()),selector.xpath('//div[@id="list-container"]//div[contains(@class,"count")]/a/text()'))
focus1=selector.xpath('//div[@id="list-container"]//div[contains(@class,"count")]/text()')
focus=[]
for i in focus1:
focus_num=i.split("·")[1].rstrip("人关注")
if "K" in focus_num:
focus_num=int(float(focus_num[:-1])*1000)
else:
focus_num=int(focus_num)
#print i,focus_num
focus.append(focus_num)
data=zip(cate_name,cate_url,total_num,focus)
return data ''' 写入数据库'''
def insert_into_Mysql(url):
try:
conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='你的密码',db='local_db',port=3306,charset='utf8')
with conn:
cursor = conn.cursor()
print u'正在加载 %s 页面' % url
data=get_catedata(url)
for i in data:
#print i[0], i[1], i[2],i[3]
cursor.execute("INSERT INTO catetable (cate_name,cate_url,total_num,focus) values(%s,%s,%s,%s)", (i[0], i[1], i[2],i[3]))
conn.commit()
sql='select * from catetable'
count = cursor.execute(sql)
print u'总共输入了%s条数据' % count
except MySQLdb.Error,e:
print e ''' 从数据库获取所有的专题url便于以后专题页面数据的进一步获取'''
def get_allcate_urls_from_mysql():
try:
conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='你的密码', db='local_db', port=3306, charset='utf8')
with conn:
cursor = conn.cursor()
sql = 'select cate_url from catetable'
count = cursor.execute(sql)
print u'共输入了%s条数据' % count
print u'正在获取专题url'
all_cate_urls=cursor.fetchall()
return all_cate_urls
except MySQLdb.Error, e:
print url,e ''' 多进程执行'''
def get_allcate_urls():
urls=get_cateurls()
pool = Pool(processes=4)
pool.map(insert_into_Mysql,urls)
allcate_urls=get_allcate_urls_from_mysql()
return allcate_urls ''' 先获取到所有专题的数据 下次获取每个专题的数据'''
if __name__ == '__main__':
allcate_urls=get_allcate_urls()

  

查看数据表数据

执行完查询到一共有914个专题,其中城市专题34个,880个热门专题

Python 2.7_多进程获取简书专题数据(一)的更多相关文章

  1. python分别使用多线程和多进程获取所有股票实时数据

    python分别使用多线程和多进程获取所有股票实时数据   前一天简单介绍了python怎样获取历史数据和实时分笔数据,那么如果要获取所有上市公司的实时分笔数据,应该怎么做呢? 肯定有人想的是,用一个 ...

  2. jsoup爬虫简书首页数据做个小Demo

    代码地址如下:http://www.demodashi.com/demo/11643.html 昨天LZ去面试,遇到一个大牛,被血虐一番,发现自己基础还是很薄弱,对java一些原理掌握的还是不够稳固, ...

  3. python插入记录后获取最后一条数据的id

    python插入记录后取得主键id的方法(cursor.lastrowid和conn.insert_id()) 参考:https://blog.csdn.net/qq_37788558/article ...

  4. python xlrd 模块(获取Excel表中数据)

    python xlrd 模块(获取Excel表中数据) 一.安装xlrd模块   到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了pyt ...

  5. [Selenium2+python2.7][Scrap]爬虫和selenium方式下拉滚动条获取简书作者目录并且生成Markdown格式目录

    预计阅读时间: 15分钟 环境: win7 + Selenium2.53.6+python2.7 +Firefox 45.2  (具体配置参考 http://www.cnblogs.com/yoyok ...

  6. 简书全站爬取 mysql异步保存

    # 简书网 # 数据保存在mysql中; 将selenium+chromedriver集成到scrapy; 整个网站数据爬取 # 抓取ajax数据 #爬虫文件 # -*- coding: utf-8 ...

  7. Python 2.7_发送简书关注的专题作者最新一篇文章及连接到邮件_20161218

    最近看简书文章关注了几个专题作者,写的文章都不错,对爬虫和数据分析都写的挺好,因此想到能不能获取最新的文章推送到Ipad网易邮箱大师.邮件发送代码封装成一个函数,从廖雪峰大神那里学的  http:// ...

  8. Python爬取简书主页信息

    主要学习如何通过抓包工具分析简书的Ajax加载,有时间再写一个Multithread proxy spider提升效率. 1. 关键点: 使用单线程爬取,未登录,爬取简书主页Ajax加载的内容.主要有 ...

  9. python2.7 爬取简书30日热门专题文章之简单分析_20170207

    昨天在简书上写了用Scrapy抓取简书30日热门文章,对scrapy是刚接触,跨页面抓取以及在pipelines里调用settings,连接mysql等还不是很熟悉,今天依旧以单独的py文件区去抓取数 ...

随机推荐

  1. JavaWeb:Tomcat服务器的安装与配置

    Tomcat服务器的安装与配置 安装 输入网址进入Tomcat的官网            在左边导航栏选择对应下载的版本            下载安装包形式            下载并解压到我们 ...

  2. extern "C" 有关问题

    之前帮老板编译一个库的代码,遇到了一些问题,后来发现问题出现在extern "C"语法上. 1. C/C++语法extern 关键字 extern是C/C++语言中表明函数和全局变 ...

  3. Jquery.ScrollLoading图片延迟加载技术

    关于分屏加载图片,像天猫.京东等电商图片较多页面很长,就采用了延迟加载技术. 目前很流行的做法就是滚动动态加载,显示屏幕之外的图片默认是不加载的, 随着页面的滚动,显示区域图片才被动态加载. 原理其实 ...

  4. c# 内部类使用接口IComparer实现排序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. 容器排序之sort,stable_sort

    bool isShorter(const string &s1, const string &sz){ return s1.size() < sz.size(); } int m ...

  6. Linux Shell基础 管道符和grep命令

    概述 管道符:管道符使用"丨"代表.如"命令1丨命令2".表示命令 1 的正确输出作为命令 2 的操作对象.命令 1 必须有正确输出,而命令 2 必须可以处理命 ...

  7. OPENGL ES2.0如何不使用glActiveTexture而显示多个图片

    https://www.oschina.net/question/253717_72107 用opengl es 2.0显示多个图片的话,我只会一种方式,先将图片生成纹理,然后用下面的方式渲染 // ...

  8. R中的参数传递函数:commandArgs(),getopt().

    1.commandArgs(),是R自带的参数传递函数,属于位置参数. ##test.R args=commandArgs(T) print (args[1])##第一个外部参数 print (arg ...

  9. SQL Server 字符串拼接与拆分 string varchar Split and Join

    1.Split    SQL Server 2008 新语法: DECLARE @str VARCHAR(MAX) SET @str = REPLACE(@teeIDs, ',', '''),(''' ...

  10. Linux查看文件编码格式及文件编码转换<转>

    如果你需要在Linux 中操作windows下的文件 ,那么你可能会经常遇到文件 编码 转换的问题.Windows中默认的文件 格式是GBK(gb2312),而Linux 一般都是UTF-8.下面介绍 ...