python抓取数据库,Python爬虫实战六之抓取爱问知识人问题并保存至数据库

bb2d1e0cd592577ad5043ffe8b9e92ed.png

大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括:

Urllib的用法及异常处理

Beautiful Soup的简单应用

MySQLdb的基础用法

正则表达式的简单应用

环境配置

在这之前,我们需要先配置一下环境,我的Python的版本为2.7,需要额外安装的库有两个,一个是Beautiful Soup,一个是MySQLdb,在这里附上两个库的下载地址, Beautiful Soup MySQLdb 大家可以下载之后通过如下命令安装

1

python setup.py install

环境配置好之后,我们便可以开心地撸爬虫了

框架思路

首先我们随便找一个分类地址,外语学习 - 爱问知识人,打开之后可以看到一系列的问题列表。 我们在这个页面需要获取的东西有: 总的页码数,每一页的所有问题链接。 接下来我们需要遍历所有的问题,来抓取每一个详情页面,提取问题,问题内容,回答者,回答时间,回答内容。 最后,我们需要把这些内容存储到数据库中。

要点简析

其实大部分内容相信大家会了前面的内容,这里的爬虫思路已经融汇贯通了,这里就说一下一些扩展的功能

1.日志输出

日志输出,我们要输出时间和爬取的状态,比如像下面这样:

[2015-08-10 03:05:20] 113011 号问题存在其他答案 我个人认为应该是樱桃沟很美的 [2015-08-10 03:05:20] 保存到数据库,此问题的ID为 113011 [2015-08-10 03:05:20] 当前爬取第 2 的内容,发现一个问题 百度有一个地方,花儿带着芳香,水儿流淌奔腾是什么意思 多多帮忙哦 回答数量 1 [2015-08-10 03:05:19] 保存到数据库,此问题的ID为 113010

所以,我们需要引入时间函数,然后写一个获取当前时间的函数

1

2

3

4

5

6

7

8

9

import time

#获取当前时间

def getCurrentTime(self):

return time.strftime('[%Y-%m-%d %H:%M:%S]',time.localtime(time.time()))

#获取当前时间

def getCurrentDate(self):

return time.strftime('%Y-%m-%d',time.localtime(time.time()))

以上分别是获取带具体时间和获取日期的函数,在输出时,我们可以在输出语句的前面调用这函数即可。 然后我们需要将缓冲区设置输出到log中,在程序的最前面加上这两句即可

1

2

f_handler=open('out.log', 'w')

sys.stdout=f_handler

这样,所有的print语句输出的内容就会保存到out.log文件中了。

2.页码保存

爬虫爬取过程中可能出现各种各样的错误,这样会导致爬虫的中断,如果我们重新运行爬虫,那么就会导致爬虫从头开始运行了,这样显然是不合理的。所以,我们需要把当前爬取的页面保存下来,比如可以保存到文本中,假如爬虫中断了,重新运行爬虫,读取文本文件的内容,接着爬取即可。 大家可以稍微参考一下函数的实现:

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

#主函数

def main(self):

f_handler=open('out.log', 'w')

sys.stdout=f_handler

page= open('page.txt', 'r')

content = page.readline()

start_page = int(content.strip()) - 1

page.close()

print self.getCurrentTime(),"开始页码",start_page

print self.getCurrentTime(),"爬虫正在启动,开始爬取爱问知识人问题"

self.total_num = self.getTotalPageNum()

print self.getCurrentTime(),"获取到目录页面个数",self.total_num,"个"

if not start_page:

start_page = self.total_num

for x in range(1,start_page):

print self.getCurrentTime(),"正在抓取第",start_page-x+1,"个页面"

try:

self.getQuestions(start_page-x+1)

except urllib2.URLError, e:

if hasattr(e, "reason"):

print self.getCurrentTime(),"某总页面内抓取或提取失败,错误原因", e.reason

except Exception,e:

print self.getCurrentTime(),"某总页面内抓取或提取失败,错误原因:",e

if start_page-x+1 < start_page:

f=open('page.txt','w')

f.write(str(start_page-x+1))

print self.getCurrentTime(),"写入新页码",start_page-x+1

f.close()

这样,不管我们爬虫中途遇到什么错误,妈妈也不会担心了

3.页面处理

页面处理过程中,我们可能遇到各种各样奇葩的HTML代码,和上一节一样,我们沿用一个页面处理类即可。

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

import re

#处理页面标签类

class Tool:

#将超链接广告剔除

removeADLink = re.compile('

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值