在之前的文章中,我们已经爬取了单网页的湖北大学贴吧的信息。我爱小徐子:(python小白必看!)python爬虫详细讲解:静态单网页的内容爬取 爬取对象:百度贴吧湖北大学吧zhuanlan.zhihu.com
仔细想一想,单网页也才只有50条信息,如果你想找到女神在哪些时间段发了哪些帖子,这么点信息是远远不够的········(毕竟,女神并不会天天发帖,贴吧每天的发帖数量肯定远远不止50条),所以,为了老铁们的幸福生活/*注:并不是为了我自己,因为我女神是我女朋友(不加这句话,怕是要跪搓衣板板)*/现在有必要更深入的探讨一下怎么爬取多网页的信息。
老规矩,在进入正题之前,让我先激励激励你们(吹吹牛皮)。
我从昨天下午回到家一直弄python弄到现在,不要觉得我是无聊,我的分子生物学实验报告还没写,数据结构的二叉树的遍历还没有开始研究,英语单词也还没背(虽然我经常忘记背),线代作业也还没开始写,再扯远一点,我的马原老师说的”挟泰山以超北海“,”方生方死,方死方生“到底是什么哲学意义,我也还没有开始研究。然而,就是这样,我什么都没做,我还是不怕,因为我爱python,我喜欢python的从入门到精通!(说得像真的一样),不知道大家有没有感觉很热血呢? 没有的话,我们就进入正题!(是的,并没有打错字)
本文分为这几个部分来讲python函数,编码问题,pandas库的使用,爬取数据,保存数据到本地excel。
python中的函数问题
每种语言都有它的函数定义方式,比如C语言就是 关键字 函数名(形参),同样地,python也有它的函数定义方式 def 函数名(形参): 函数的作用如果大家看过书的话,应该都知道,它是用来封装一段可以重复使用的代码的,而这段代码之所以能够被重复使用,就是因为实参可以代替形参的位置,从而实现不同的功能。
比如我定义一个函数:
def myfunction():
print("我爱小徐子")
这样,一个函数就制作完成啦!
那么如果我们要调用python中的函数应该怎么做呢?其实也很简单,只需要这样做:
myfunction()
来看看实际效果:
python中的编码问题
python作为一门优雅的编程语言,个人认为,它最不优雅的地方就是编码,编码问题简直能让人吐血·······
首先第一点要知道,unicode编码是包括了所有的语言编码,统一使用的是两个字节,而utf-8编码方式,针对于英文字母是和ASCⅡ相同的使用一的字节,而汉字使用的是两个字节。 unicode编码在内存中使用(并不代表内存中总是使用unicode编码),utf-8在硬盘中使用。 windows系统自带使用的是gbk编码方式。 注意到encode()方法是将unicode编码转化成其他编码,而decode是将其他编码转化成unicode编码方式。
pandas库的使用
python 中自带有对数据表格处理的pandas库,用起来十分简单(所以说经常用python可能会成为一个调包侠,而实际算法一个都不会,这也是python方便的原因:什么库都有,什么都能做),首先,你需要安装pandas库,在命令行中输入:pip install pandas即可。 下面来简单地讲一讲一些pandas库的基本操作:
#声明
import pandas as pd
from pandas import DataFrame
要知道,pandas中有一个DataFrame模块,它类似与excel的表格形式。 在这里,我们需要知道将文件保存为excel格式使用的命令是:
df.to_excel(文件名)
其中df就是DataFrame类型。
pandas库还有很多操作,大家可以在网上自行学习。
进行数据的爬取
进行数据的爬取时,有一个问题真的是超级坑爹,就是关于.text.strip()这个方法的运用。
大家可以先看我的代码(和之前的文章爬取方式相同,不清楚的可以看专栏之前的文章):
In [14]: import requests
...:
...: import pandas as pd
...:zui
...: from pandas import DataFrame
...:
...: import numpy as np
...:
...: from bs4 import BeautifulSoup
...:
...: def get_url(url):
...:
...: r=requests.get(url)
...: r.raise_for_status()
...: r.encoding='utf-8'#这里我们已经知道了贴吧的编码方式,所以直接用utf-8
...: r=r.text
...: return r
...: def analyze_url(url,title_list,author_list,reply_list):
...: soup=BeautifulSoup(url,'lxml')
...: Tags=soup.find_all('li',attrs={"class":" j_thread_list clearfix"})
...: for li in Tags:
...: title_list.append(li.find('div',attrs={"class":"threadlist_title pull_left j_th_tit "}))
...: author_list.append(li.find('span',attrs={"class":"frs-author-name-wrap"}))
...: reply_list.append(li.find('div',attrs={"class":"col2_left j_threadlist_li_left"}))
...: title_list=[]
...: author_list=[]
...: reply_list=[]
...: for i in range(0,11):
...: url='http://tieba.baidu.com/f?kw=%E6%B9%96%E5%8C%97%E5%A4%A7%E5%AD%A6&ie=utf-8&pn='+str(50*i)
...: html=get_url(url)
...: analyze_url(html,title_list,author_list,reply_list)
...: print('正在爬取第%d页'%i)
最后爬取的结果是这样的:
可是,我到现在都有一个问题,我想除去标签,可是使用.text.strip()就会报错:
有大佬能解决的可以和我交流一下。
保存数据到本地excel
代码为:
In [16]: df=DataFrame()
In [17]: df["标题"]=title_list
In [18]: df["发帖人"]=author_list
In [19]: df["回复数量"]=reply_list
In [20]: df.to_excel(r'C:\Users\13016\Desktop\3.xlsx')
最后的结果为:
总而言之,今天的文章昨天其实就可以写出来。希望本文给大家一些帮助,当然,有知道为什么用.text.strip()方法会报错的原因的朋友,记得和我交流,至少,我到现在还是没有发现为什么会出现这个问题。
更多优质内容,请关注微信公众号:生物信息与python