上药三品,神与气精

曾因酒醉鞭名马 生怕情多累美人


  • 首页

  • 关于

  • 分类

  • 标签

  • 归档

  • 搜索

python实战之四使用tushare包

发表于 2016-05-17 | 阅读次数:
字数统计: 69 | 阅读时长 ≈ 1

tushare是比较著名的金融财经的包。
通过pip安装tushare包之后,
直接就可以调用

import tushare as ts
df = ts.get_sina_dd('600848', date='2015-12-24', vol=500)
#指定大于等于500手的数据

数据是直接dataframe,比较方便存储。

python实战之三读取大文件

发表于 2016-05-17 | 阅读次数:
字数统计: 40 | 阅读时长 ≈ 1

这篇呢,就是如何来读取一个大型的excel表格,考虑文件大小在500M以上的这种如何进行读取和分析。

python实战之二发送微博

发表于 2016-05-17 | 阅读次数:
字数统计: 278 | 阅读时长 ≈ 1

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网

发表于 2016-05-17 | 分类于 pachong | 阅读次数:
字数统计: 1.1k | 阅读时长 ≈ 5

爬取分类信息网站龙头 ganji网。

首先呢,来看看结构
图1

我们需要来看看首页那里的所有类目,里面包含20项
基本上所有的帖子都会被分类在这20个下方,根据时间被分配不同的id,像这样
http://bj.ganji.com/ershoubijibendiannao/2111373477x.htm
当然后面加了个x。。。

  • 第一步
    先把这20个类目的地址爬取出来。
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。


  • 第二步
    从大的分类下获取单个帖子的链接,先来分析下页面结构,
    图2

以二手笔记本电脑为例,可以看到后面结构为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也加入里面。大概先这样咯。
图3

把程序组织一下 组成第二个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访问抓取。


  • 第四步
    写上一个计数的函数,这样可以在运行main函数存入数据库时并打印链接的同时,统计已经写了多少数据进去。
import time
from page_parsing import url_list

while True:
    print(url_list.find().count())
    time.sleep(5)

  • 最后
    附上项目github地址 项目地址

python实战之一发送电子邮件

发表于 2016-05-17 | 阅读次数:
字数统计: 549 | 阅读时长 ≈ 2

把曾经做过的东西做下小结吧。
如何来使用python发送电子邮件呢?

一般而言,官方提供的思路就是使用smtplib包,但是实现起来个人感觉还是稍显复杂,需要按照要求书写好多比如smtp mime 手动添加邮件头,还需要一些email标准的某些知识。
like this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/python
#-*- coding: utf-8 -*-

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

sender = 'z.j19910903@163.com'# 发件人
to = ["815012839@qq.com", "a@qq.com"] # 多个收件人的写法
subject = 'From Python Email test'# 邮件主题
smtpserver = 'smtp.163.com'# smtp服务器
username = 'z.j19910903'# 发件人邮箱用户名
password = '******'# 发件人邮箱密码
mail_postfix = '163.com'
contents = '这是一个Python的邮件,收到请勿回复,谢谢!!'

def send_mail(to_list, sub, content):
me = sender
msg = MIMEText(content, _subtype='plain', _charset='utf-8')
msg['Subject'] = subject
msg['From'] = me
msg['To'] = ";".join(to_list)
try:
server = smtplib.SMTP()
server.connect(smtpserver)
server.login(username, password)
server.sendmail(me, to_list, msg.as_string())
server.close()
return True
except Exception, e:
print str(e)
return False

if __name__ == '__main__':
if send_mail(to, subject, contents):
print "邮件发送成功! "
else:
print "失败!!!"

可能看起来也不是很多,但是还是感觉稍稍有点麻烦。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主页。

1…106107108109
John Cheung

John Cheung

improve your python skills

543 日志
33 分类
45 标签
RSS
GitHub Email
© 2020 John Cheung
本站访客数:
|
主题 — NexT.Pisces v5.1.4
博客全站共226.3k字