Gather ye rosebuds while ye may

开始Python3抓取数据

python · abc

暂时没有看廖雪峰的python3教程,而是直接看了这个👉笨办法学Python
笨办法学python - Learn Python The Hard Way 里面写的基本上是初级语法
看了一会儿发现这是针对无基础人士写的python2教程
看完之后就一个感觉:

python语法还是蛮简单的,但是swift还要简单一些


需求

终极目标是写一个python脚本,用于抓取热点微博,并定时转发
看了一下新浪微博api,为了完成该目标就需要

  1. 转发一条微博信息
  2. 发布一条微博信息
  3. 获取最新的公共微博

在深入的话还需要微博登录


step by step

api看不懂就看看demo
demo看不懂至少我看懂了post包里面需要什么数据
那么就直接开始尝试建立post或者get
还是不行,那么开始python抓取网页数据吧————这也是抓取热点微博的一个方法


简单抓取网页数据

注意使用的是python3版本
不要用错了人家老版本的了 必须的urllib库变了:

python 3.x中urllib库和urilib2库合并成了urllib库
其中urllib2.urlopen()变成了urllib.request.urlopen()
urllib2.Request()变成了urllib.request.Request()

参考了这两个网页Python3 urllib GET方式获取数据python3.3 抓取网页数据

代码如下
image
我直接查询了一下我的微博的主页
本来写的是百度的,东西太多了看不过来。。。。。
网页的html数据就被储存在z_data当中,re库能够通过html的语法进行查询
第一个查询标题,第二个循环了查询链接
回显如下
image


更新2015-10-04 23:06:34

目的

是把网页中sidebar目录里的所有网页连接给装到一个 dic 字典当中
或者装到txt 文件当中,这样以后可以用脚本使用该 txt 文档
然后把文档里的所有东西都给拖下来
相当于是通过给出来的目录,下载整个网站
通过脚本可以吧.html文档简单的变成 markdown 文档

操作

此次操作当中最重要的弄懂 python3 的正则表达式和目录操作
相关网页:

re模块 正则表达式
Python 3语法小记(四)字典 dictionary

代码

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
import urllib.request
import re

dic = {'name':'urls'}

url = "the url u want"

data = urllib.request.urlopen(url).read().decode("UTF-8")

urllib.request.urlopen(url).close()

links = re.compile('000">(.+?)</')

for urls in links.findall(data):
if "<a" in urls:
pass
else:
urls.replace('/','_')
dic['%s'%urls] = '-'

for names in dic.keys():

temp = 'href="(.+?)">'+names
urlses = re.compile(temp)
try:
urlname = urlses.findall(data)[0]
except:
continue
dic[names] = urlname

print(dic)

关键在于两个正则表达式:
temp = 'href="(.+?)">'+names
links = re.compile('000">(.+?)</')
这两个的构造是通过网页源代码来的,我想找的代码段是(.+?)里的内容
本来只用一个正则就行了的,但是整个网页当中有两段目录
于是 dic 显示一个名字names对应了两个url
所以有了第二段 url 用于约束,也就是定位到 sidebar 当中

结果

看图
image
👆成功了哟👆
接下来的就是把/wiki/开头的相对路径添加成为含有网址的绝对路径
然后存为 txt 拿给其他的脚本使用了
更新:用pickle储存,见下方更新


更新2015-10-06 20:00:10

添加成绝对路径

还是以廖雪峰的 python3 教程为例
我们在上面已经得到了这样的url 字符串:

1
/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000

这也是我们两行正则表达式的查找标准之一
在这里把url 改成绝对路径:
1
urlname = "http://www.liaoxuefeng.com"+urlses.findall(data)[0]

存档以便以后使用

这里使用pickle
参考网页:Python3 pickle序列化
使用方法如下:
👇写入👇

1
2
with open("the_name_you_want.pickle","wb") as f:
pickle.dump(dic,f)

👇读出👇
1
2
with open('the_name_you_want.pickle','rb') as f:  
dic=pickle.load(f)

这里的dic是一个字典

用一个函数来生成 html 文档

输入一个{names:url}储存的字典,效果是把储存的所有网页都下载下来
一下就写好了,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import urllib.request

def store_the_page(dic):
for names in dic:
url = dic[names]
data=urllib.request.urlopen(url).read()
urllib.request.urlopen(url).close()
try:
fp = open("%s.html"%names,"wb")
except:
continue
fp.write(data)
fp.close()
print("%s.html\t写入完成"%names)

两个.py怎么互相调用呢?

假如我有一个 b.py

1
2
def method():
print("hello world")

a.py里就该这样调用:
1
2
3
4
5
import b
blah
blah
blah
method()

也就是说,只用 import 就行了,因为在同一文件夹里,直接写import b

效果

看图:
image
看着文件一个一个生成还是蛮开心的
最后的错误是因为文件名中带有/这个特殊的符号
我们可以通过替换names字符串中的/来解决
或者是用try except来忽略它
看看 finder:
image


至此就完成了查找目录-下载目录-下载网站的过程

以上