HELLO WORLD!
愿这是新生活的开端。
最近正在写一篇文本挖掘的论文,但是前期需要大量的文本数据作为挖掘的对象。鉴于需要的文本数量数以千计,所以我决定试着写一个爬虫的程序来进行文本的获取。之前只是零星的学过一点爬虫,但是始终没有自己亲自编写过,也不了解爬虫的过程。所以想借助这个机会,来让自己真正意义上的学会利用python进行爬虫的这项技能,熟悉并掌握爬虫的有关知识。
预计的学习内容如下:
1.Python的函数式编程
2.requests库的使用
3.BeautifulSoup库的使用
4.正则表达式的使用
5.文件的读写
6.单个网页的爬取
7.多个网页的爬取
考虑到自己对爬虫的知识其实掌握的很少,所以准备分几天学习,大致的学习计划如下:
1.使用面向过程的编程方式进行单个网页的爬取
2.将简单的面向过程的编程方式改为函数式编程,进行单个网页的爬取
3.进行多个动态网页的爬取
4.学习面向对象编程的方式来进行爬虫程序的编写
爬虫的目的是获取安全管理网上的安全事故案例中的事故原因和事故总结。
下面是简单的面向过程的方式编写的单个网页的爬虫:
# __*__ encoding:utf-8 __*__ # 开始输出的网页代码中的中文全是乱码,于是加了这一句与底下的sys那几句
import sys
import os
import bs4
import re
import requests
from bs4 import BeautifulSoup
reload(sys) # 单独加这几句并不能解决中文乱码问题
sys.setdefaultencoding('utf-8')
r = requests.get('http://www.safehoo.com/Case/Case/Hit/201803/1516881.shtml')
r.encoding = r.apparent_encoding # 将网页代码编码,否则输出的中文全是乱码(经过验证,只要加上这一句,sys和开头的那句#可以不加)
soup = BeautifulSoup(r.text,"html.parser")
num = [] # 输出所有p标签中的内容
for i in soup.find_all('p'):
num.append(i)
event = num[1] # 输出第二个p标签的内容
safevent = str(event) # 解决输出格式问题
fo = open('C:\Users\Administrator\Desktop\safe_event.txt','ab+') # 将获取的信息写入txt文件
fo.write(safevent.encode('utf-8')) # 将获取的网页信息的数据格式使用str()函数强制转为字符串类型,然后将字符串的编码转为‘utf-8’
fo.close() # 关闭文件
在编写该程序过程中解决的问题:
1.获取到的网页在pycharm中显示时的中文乱码问题:
在网站上找到两种办法:
方法一:
# __*__ encoding:utf-8 __*__
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
这种方法并没有解决问题,真正解决问题的是第二种方法。
方法二:
r.encoding = r.apparent_encoding # r是获取到的网页代码
只使用该句即能实现网页代码中的中文乱码问题
2.输出所有p标签中的内容
因为使用soup.find_all('p')输出的是第一个p标签的内容,所以使用for循环的方式遍历所有p标签,将每一个p标签中的内容当做列表的一个元素添加到列表中,然后将第二个元素输出
3.存入txt文件时的中文乱码问题
这个主要是编码错误,我们将爬取的内容使用的是utf-8编码,存入的txt文件也应该是utf-8编码,否则中文显示的将是乱码。
依然没有解决的问题:
我只想获得标签中的内容,试着滤掉标签,但是未实现。尝试过的方法:使用soup.p.string可以滤掉标签只输出标签中的内容,但是只输出第一个p标签中的内容,我们想要的是第二个p标签中的内容。还试着使用正则式表达式将得到的字符串中的标签滤掉。该问题未解决。
编写该爬虫涉及的知识:
1.BeautifulSoup 库的使用
2.文件的读写
3.正则表达式的使用
4.中文编码问题
为了学习这四个方面的知识,我会再写四个博客专门学习。