tushare是比较著名的金融财经的包。
通过pip安装tushare包之后,
直接就可以调用
import tushare as ts
df = ts.get_sina_dd('600848', date='2015-12-24', vol=500)
#指定大于等于500手的数据
数据是直接dataframe,比较方便存储。
曾因酒醉鞭名马 生怕情多累美人
tushare是比较著名的金融财经的包。
通过pip安装tushare包之后,
直接就可以调用
import tushare as ts
df = ts.get_sina_dd('600848', date='2015-12-24', vol=500)
#指定大于等于500手的数据
数据是直接dataframe,比较方便存储。
python能不能发微博呢?
我们知道很多应用都有开发者平台,只要成为开发者,就可以调用其中的数据。当然初级的开发者调用的次数等都有限制。
廖雪峰老师开发了weibo的python sdk
直接安装一下就好
##代码预览
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
from weibo import APIClient
APP_KEY = '2234125265' # app key
APP_SECRET = '******' # app secret
CALLBACK_URL = 'https://api.weibo.com/oauth2/default.html' # callback url 授权回调页,与OAuth2.0 授权设置的一致
def press_sina_weibo():
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
print client.get_authorize_url()
r = client.request_access_token(raw_input("input code:").strip())
client.set_access_token(r.access_token, r.expires_in)
print client.post.statuses__update(status=u'这是来自ipad pro客户端的微博信息')
#print client.statuses.user_timeline.get()
if __name__ == '__main__':
press_sina_weibo()
这里不太方便的是需要手动输入下参数进去。
看过一些sina的官方开发者文档,感觉限制很多的,也试过尝试一些开发者开源项目爬取微博,导致微博被盗。。
文档很重要,还可能思维方面与国外人差异有点大 ,跟不上,看全英文的又吃力。。。
爬取分类信息网站龙头 ganji网。
首先呢,来看看结构
我们需要来看看首页那里的所有类目,里面包含20项
基本上所有的帖子都会被分类在这20个下方,根据时间被分配不同的id,像这样
http://bj.ganji.com/ershoubijibendiannao/2111373477x.htm
当然后面加了个x。。。
from bs4 import BeautifulSoup
import requests
start_url = 'http://bj.ganji.com/wu/'
url_host = 'http://bj.ganji.com'
def get_index_url(url):
# url = start_url
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text, 'lxml')
links = soup.select('.fenlei > dt > a')
for link in links:
page_url = url_host + link.get('href')
print(page_url)
get_index_url(start_url)
程序的运行结果是20个链接,
http://bj.ganji.com/jiaju/
http://bj.ganji.com/rirongbaihuo/
http://bj.ganji.com/shouji/
http://bj.ganji.com/shoujihaoma/
http://bj.ganji.com/bangong/
http://bj.ganji.com/nongyongpin/
http://bj.ganji.com/jiadian/
http://bj.ganji.com/ershoubijibendiannao/
http://bj.ganji.com/ruanjiantushu/
http://bj.ganji.com/yingyouyunfu/
http://bj.ganji.com/diannao/
http://bj.ganji.com/xianzhilipin/
http://bj.ganji.com/fushixiaobaxuemao/
http://bj.ganji.com/meironghuazhuang/
http://bj.ganji.com/shuma/
http://bj.ganji.com/laonianyongpin/
http://bj.ganji.com/xuniwupin/
http://bj.ganji.com/qitawupin/
http://bj.ganji.com/ershoufree/
http://bj.ganji.com/wupinjiaohuan/
把这20个链接放入程序中,成为channel_list。
这也就是我们的第一个小程序 channel_extracing.py。
以二手笔记本电脑为例,可以看到后面结构为o+page,这里o代表的是个人发布的,后面是page。
那么首先考虑的是构造一个爬虫来抓取links
# spider 1
def get_links_from(channel, pages, who_sells='o'):
# http://bj.ganji.com/ershoubijibendiannao/o3/
# o for personal a for merchant
list_view = '{}{}{}/'.format(channel, str(who_sells), str(pages))
wb_data = requests.get(list_view,headers=headers,proxies=proxies)
soup = BeautifulSoup(wb_data.text, 'lxml')
if soup.find('ul', 'pageLink'):
for link in soup.select('dd.feature div ul li a'):
item_link = link.get('href')
if item_link != "javascript:":
url_list.insert_one({'url': item_link})
print(item_link)
# return urls
else:
# It's the last page !
pass
这里注意一下加了一个判断,判断这一页不是最后一页,就是看下方有无pageLink,俗称也就是翻页器类似的,还有就是直接加上了headers部分和proxy部分反爬取。
函数的结果是urls,并考虑使用mongo数据库来存储这个url_list。
接下来就是访问单个的url来抓取里面的数据信息了。
# spider 2
def get_item_info_from(url,data=None):
wb_data = requests.get(url,headers=headers)
if wb_data.status_code == 404:
pass
else:
soup = BeautifulSoup(wb_data.text, 'lxml')
data = {
'title':soup.title.text.strip(),
'price':soup.select('.f22.fc-orange.f-type')[0].text.strip(),
'pub_date':soup.select('.pr-5')[0].text.strip().split(' ')[0],
'area':list(map(lambda x:x.text,soup.select('ul.det-infor > li:nth-of-type(3) > a'))),
'cates':list(soup.select('ul.det-infor > li:nth-of-type(1) > span')[0].stripped_strings),
'url':url
}
print(data)
item_info.insert_one(data)
看图,单个页面我们考虑抓取,标题title 价格price 发布时间pub_data 交易地点area 类型cates 另外再考虑把url也加入里面。大概先这样咯。
把程序组织一下 组成第二个py程序 page_parsing.py
当然详情页抓取的数据我们也放到mongo的数据库中。
到这里初步小结一下,实现了哪些呢?先是从ganji的首页获取分类,20个分类
然后在这20个分类下,获取单个帖子的详情页,然后通过详情页去抓取想要的数据。
爬取的初步流程完成了,接下来就是包装,
写个主函数,定义下我们抓取多少页的大分类,先url_list然后item_info都存入到mongo的数据库中。
ps 考虑写一个计数的函数观察我们抓取的信息数目。
from multiprocessing import Pool
from page_parsing import get_item_info_from,url_list,item_info,get_links_from
from channel_extracing import channel_list
也就是前面的两个函数,我们实现了几个功能:
channel_list
两个方法 get_item_info_from get_links_from
两个mongo数据库的collections url_list item_info
另外这里使用多进程来加快抓取的速度
def get_all_links_from(channel):
for i in range(1,100):
get_links_from(channel,i)
注意前面定义的函数我们定义了页面,这里抓取1-99页,当然也许部分分类商品多,99不足,部分分类商品不是很多,我们也已经有判断会pass掉。。
if __name__ == '__main__':
pool = Pool(processes=6)
# pool = Pool()
pool.map(get_all_links_from,channel_list.split())
pool.close()
pool.join()
开6个进程进行爬爬爬,先存url,再根据url访问抓取。
import time
from page_parsing import url_list
while True:
print(url_list.find().count())
time.sleep(5)
把曾经做过的东西做下小结吧。
如何来使用python发送电子邮件呢?
一般而言,官方提供的思路就是使用smtplib包,但是实现起来个人感觉还是稍显复杂,需要按照要求书写好多比如smtp mime 手动添加邮件头,还需要一些email标准的某些知识。
like this:
1 | #!/usr/bin/python |
可能看起来也不是很多,但是还是感觉稍稍有点麻烦。python让人着迷的地方,就是有大量的优秀开发人员开发的各种第三方库,现在我们需要的只是yagmail。
##yagmail
安装不多说,直接pip
pip install yagmail
它支持python2.7+
使用的话也相对简单
import yagmail
yag = yagmail(zhangjohn202@gmail.com,'your2-steppassword')
contents='i love you more!'
yag.send(to='815012839@qq.com',subject='fall love at first sight',contents=contents)
这里说下,一般的邮箱都是用户名和登录密码,别的邮箱我不知道现在有多少改进,感觉gmail不愧是属于全人类的邮箱,这里采用更为安全的方式来进行登录,两步验证密码。
自然只是最简单的举例,yagmail实现的功能还有富文本邮件 邮件附件以及使用邮件模板这较为常见的三项,详细可以参考yagmail的github主页。