如何通过python调用新浪微博的API来爬取数据

如何通过python调用新浪微博的API来爬取数据,第1张

1:安装python(这个不多说啦)

2:下载新浪微博SDK的python包,解压为weibopy目录

3:申请AppKey,

流程:

1:通过oAuth认证

按我的理解简化如下:

用户在新浪微博给的页面输入账号密码,然后微博给应用一个PIN码,这样应用通过PIN码才有权限访问该用户的信息,而应用在整个过程中是接触不到密码的,所以用户觉得很安全,后果很满意

2:获得认证之后,就可以使用微博SDK提供的API获得信息啦

3:如果想设计web或者客户端应用的话,那就继续加个GUI好啦(未完成)

代码:

#!/usr/bin/python

import webbrowser

from weibopy.auth import OAuthHandler

from weibopy.api import API

AppKey = '2525355147'

AppSecret = '2e2c7bcdfc362eace266d1f2bf83fe6b'

my_auth = OAuthHandler(AppKey , AppSecret)

webbrowser.open(my_auth.get_authorization_url())

verifier = raw_input('PIN: ').strip()

my_auth.get_access_token(verifier)

my_api = API(my_auth)

for comment in my_api.mentions():

object = comment

id = object.__getattribute__("id")

text = object.__getattribute__("text")

print str(id) + " : " + text

虽然 Python 需要为 *** 作不同的数据库使用不同的模块,但不同的数据库模块并非没有规律可循,因为它们基本都遵守 Python 制订的 DB API 协议,目前该协议的最新版本是 2.0,因此这些数据库模块有很多 *** 作其实都是相同的。下面先介绍不同数据库模块之间的通用内容。

全局变量

Python 推荐支持 DB API 2.0 的数据库模块都应该提供如下 3 个全局变量:

apilevel:该全局变量显示数据库模块的 API 版本号。对于支持 DB API 2.0 版本的数据库模块来说,该变量值通常就是 2.0。如果这个变量不存在,则可能该数据库模块暂时不支持 DB API 2.0。读者应该考虑选择使用支持该数据库的其他数据库模块。

threadsafety:该全局变量指定数据库模块的线程安全等级,该等级值为 0~3 ,其中 3 代表该模块完全是线程安全的;1 表示该模块具有部分线程安全性,线程可以共享该模块,但不能共享连接;0 则表示线程完全不能共享该模块。

paramstyle:该全局变量指定当 SQL 语句需要参数时,可以使用哪种风格的参数。该变量可能返回如下变量值:

format:表示在 SQL 语句中使用 Python 标准的格式化字符串代表参数。例如,在程序中需要参数的地方使用 %s,接下来程序即可为这些参数指定参数值。

pyformat:表示在 SQL 语句中使用扩展的格式代码代表参数。比如使用 %(name),这样即可使用包含 key 为 name 的字典为该参数指定参数值。

qmark:表示在 SQL 语句中使用问号(?)代表参数。在 SQL 语句中有几个参数,全部用问号代替。

numeric:表示在 SQL 语句中使用数字占位符(:N)代表参数。例如:1 代表一个参数,:2 也表示一个参数,这些数字相当于参数名,因此它们不一定需要连续。

named:表示在 SQL 语句中使用命名占位符(:name)代表参数。例如 :name 代表一个参数,:age 也表示一个参数。

通过查阅这些全局变量,即可大致了解该数据库 API 模块的对外的编程风格,至于该模块内部的实现细节,完全由该模块实现者负责提供,通常不需要开发者关心。

数据库 API 的核心类

遵守 DB API 2.0 协议的数据库模块通常会提供一个 connect() 函数,该函数用于连接数据库,并返回数据库连接对象。

数据库连接对象通常会具有如下方法和属性:

cursor(factory=Cursor):打开游标

commit():提交事务。

rollback():回滚事务。

close():关闭数据库连接。

isolation_level:返回或设置数据库连接中事务的隔离级别。

in_transaction:判断当前是否处于事务中。

上面第一个方法可以返回一个游标对象,游标对象是 Python DB API 的核心对象,该对象主要用于执行各种 SQL 语句,包括 DDL、DML、select 查询语句等。使用游标执行不同的 SQL 语句返回不同的数据。

游标对象通常会具有如下方法和属性:

execute(sql[, parameters]):执行 SQL 语句。parameters 参数用于为 SQL 语句中的参数指定值。

executemany(sql, seq_of_parameters):重复执行 SQL 语句。可以通过 seq_of_parameters 序列为 SQL 语句中的参数指定值,该序列有多少个元素,SQL 语句被执行多少次。

executescript(sql_script):这不是 DB API 2.0 的标准方法。该方法可以直接执行包含多条 SQL 语句的 SQL 脚本。

fetchone():获取查询结果集的下一行。如果没有下一行,则返回 None。

fetchmany(size=cursor.arraysize):返回查询结果集的下 N 行组成的列表。如果没有更多的数据行,则返回空列表。

fetchall():返回查询结果集的全部行组成的列表。

close():关闭游标。

rowcount:该只读属性返回受 SQL 语句影响的行数。对于 executemany() 方法,该方法所修改的记录条数也可通过该属性获取。

lastrowid:该只读属性可获取最后修改行的 rowid。

arraysize:用于设置或获取 fetchmany() 默认获取的记录条数,该属性默认为 1。有些数据库模块没有该属性。

description:该只读属性可获取最后一次查询返回的所有列的信息。

connection:该只读属性返回创建游标的数据库连接对象。有些数据库模块没有该属性。

总结来看,Python 的 DB API 2.0 由一个 connect() 开始,一共涉及数据库连接和游标两个核心 API。它们的分工如下:

数据库连接:用于获取游标、控制事务。

游标:执行各种 SQL 语句。

掌握了上面这些 API 之后,接下来可以大致归纳出 Python DB API 2.0 的编程步骤。

*** 作数据库的基本流程

使用 Python DB API 2.0 *** 作数据库的基本流程如下:

调用 connect() 方法打开数据库连接,该方法返回数据库连接对象。

通过数据库连接对象打开游标。

使用游标执行 SQL 语句(包括 DDL、DML、select 查询语句等)。如果执行的是查询语句,则处理查询数据。

关闭游标。

关闭数据库连接。

下图显示了使用 Python DB API 2.0 *** 作数据库的基本流程。

一、爬取我们所需要的一线链接

channel_extract.py

这里的一线链接也就是我们所说的大类链接:

from bs4 import BeautifulSoupimport requests

start_url = 'http://lz.ganji.com/wu/'host_url = 'http://lz.ganji.com/'def get_channel_urls(url):

wb_data = requests.get(url)

soup = BeautifulSoup(wb_data.text, 'lxml')

links = soup.select('.fenlei >dt >a')#print(links)

for link in links:

page_url = host_url + link.get('href')

print(page_url)#get_channel_urls(start_url)channel_urls = '''

http://lz.ganji.com/jiaju/

http://lz.ganji.com/rirongbaihuo/

http://lz.ganji.com/shouji/

http://lz.ganji.com/bangong/

http://lz.ganji.com/nongyongpin/

http://lz.ganji.com/jiadian/

http://lz.ganji.com/ershoubijibendiannao/

http://lz.ganji.com/ruanjiantushu/

http://lz.ganji.com/yingyouyunfu/

http://lz.ganji.com/diannao/

http://lz.ganji.com/xianzhilipin/

http://lz.ganji.com/fushixiaobaxuemao/

http://lz.ganji.com/meironghuazhuang/

http://lz.ganji.com/shuma/

http://lz.ganji.com/laonianyongpin/

http://lz.ganji.com/xuniwupin/

'''123456789101112131415161718192021222324252627282930313233343536

那么拿我爬取的58同城为例就是爬取了二手市场所有品类的链接,也就是我说的大类链接;

找到这些链接的共同特征,用函数将其输出,并作为多行文本储存起来。

二、获取我们所需要的详情页面的链接和详情信息

page_parsing.py

1、说说我们的数据库:

先看代码:

#引入库文件from bs4 import BeautifulSoupimport requestsimport pymongo #python *** 作MongoDB的库import reimport time#链接和建立数据库client = pymongo.MongoClient('localhost', 27017)

ceshi = client['ceshi'] #建ceshi数据库ganji_url_list = ceshi['ganji_url_list'] #建立表文件ganji_url_info = ceshi['ganji_url_info']123456789101112

2、判断页面结构是否和我们想要的页面结构相匹配,比如有时候会有404页面;

3、从页面中提取我们想要的链接,也就是每个详情页面的链接;

这里我们要说的是一个方法就是:

item_link = link.get('href').split('?')[0]12

这里的这个link什么类型的,这个get方法又是什么鬼?

后来我发现了这个类型是

<class 'bs4.element.Tab>1

如果我们想要单独获取某个属性,可以这样,例如我们获取它的 class 叫什么

print soup.p['class']

#['title']12

还可以这样,利用get方法,传入属性的名称,二者是等价的

print soup.p.get('class')#['title']12

下面我来贴上代码:

#爬取所有商品的详情页面链接:def get_type_links(channel, num):

list_view = '{0}o{1}/'.format(channel, str(num))#print(list_view)

wb_data = requests.get(list_view)

soup = BeautifulSoup(wb_data.text, 'lxml')

linkOn = soup.select('.pageBox') #判断是否为我们所需页面的标志;

#如果爬下来的select链接为这样:div.pageBox >ul >li:nth-child(1) >a >span 这里的:nth-child(1)要删掉

#print(linkOn)

if linkOn:

link = soup.select('.zz >.zz-til >a')

link_2 = soup.select('.js-item >a')

link = link + link_2#print(len(link))

for linkc in link:

linkc = linkc.get('href')

ganji_url_list.insert_one({'url': linkc})

print(linkc)else:pass1234567891011121314151617181920

4、爬取详情页中我们所需要的信息

我来贴一段代码:

#爬取赶集网详情页链接:def get_url_info_ganji(url):

time.sleep(1)

wb_data = requests.get(url)

soup = BeautifulSoup(wb_data.text, 'lxml')try:

title = soup.select('head >title')[0].text

timec = soup.select('.pr-5')[0].text.strip()

type = soup.select('.det-infor >li >span >a')[0].text

price = soup.select('.det-infor >li >i')[0].text

place = soup.select('.det-infor >li >a')[1:]

placeb = []for placec in place:

placeb.append(placec.text)

tag = soup.select('.second-dt-bewrite >ul >li')[0].text

tag = ''.join(tag.split())#print(time.split())

data = {'url' : url,'title' : title,'time' : timec.split(),'type' : type,'price' : price,'place' : placeb,'new' : tag

}

ganji_url_info.insert_one(data) #向数据库中插入一条数据;

print(data)except IndexError:pass123456789101112131415161718192021222324252627282930

四、我们的主函数怎么写?

main.py

看代码:

#先从别的文件中引入函数和数据:from multiprocessing import Poolfrom page_parsing import get_type_links,get_url_info_ganji,ganji_url_listfrom channel_extract import channel_urls#爬取所有链接的函数:def get_all_links_from(channel):

for i in range(1,100):

get_type_links(channel,i)#后执行这个函数用来爬取所有详情页的文件:if __name__ == '__main__':# pool = Pool()# # pool = Pool()# pool.map(get_url_info_ganji, [url['url'] for url in ganji_url_list.find()])# pool.close()# pool.join()#先执行下面的这个函数,用来爬取所有的链接:if __name__ == '__main__':

pool = Pool()

pool = Pool()

pool.map(get_all_links_from,channel_urls.split())

pool.close()

pool.join()1234567891011121314151617181920212223242526

五、计数程序

count.py

用来显示爬取数据的数目;

import timefrom page_parsing import ganji_url_list,ganji_url_infowhile True:# print(ganji_url_list.find().count())

# time.sleep(5)

print(ganji_url_info.find().count())

time.sleep(5)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10098707.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存