python爬虫小实例
介绍几个爬虫使用的基本模块与库:
re #正则表达式,urllib库,requests库,BeautifulSoup库以及workbook库。
对于以上的几个库,进行简单介绍
openpyxl.workbook # Python中操作Excel的workbook库和openpyxl模块
re正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去匹配符合规则的字符。
在线匹配工具: http://www.regexpal.com/ 和 http://rubular.com/
正则匹配软件:McTracer 支持将正则导成对应的语言如java C# js等直接帮你转写成你需要的语言,Copy直接用就行了很方便,另外支持把正则表达式用法解释,如哪一段是捕获分组,哪段是贪婪匹配等等,总之用起来 So Happy .
Urllib 库,它是 Python 内置的 HTTP 请求库,也就是说我们不需要额外安装即可使用,它包含四个模块:
第一个模块 request,它是最基本的 HTTP 请求模块,我们可以用它来模拟发送一请求,就像在浏览器里输入网址然后敲击回车一样,只需要给库方法传入 URL 还有额外的参数,就可以模拟实现这个过程了。(urllib.request:打开和读取url)
第二个 error 模块即异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作保证程序不会意外终止。
第三个 parse 模块是一个工具模块,提供了许多 URL 处理方法,比如拆分、解析、合并等等的方法。
第四个模块是 robotparser,主要是用来识别网站的 robots.txt 文件(爬虫协议),然后判断哪些网站可以爬,哪些网站不可以爬的,其实用的比较少。
requests库是用Python语言编写的,基于urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库。它比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求。是python实现的最简单易用的HTTP库,建议爬虫使用requests,它的7个主要方法:
BeautifulSoup库是灵活又方便的网页解析库,处理高效,支持多种解析器。利用它不用编写正则表达式即可方便地实现网页信息的提取。
对于Python库的安装,需要在电脑命令行中使用pip install 库名进行安装如:pip install requests
现在就来爬取一下2018年中国最富有1000人
http://finance.sina.com.cn/zt_d/jmzf2018/
第一步,导入库
import re
import urllib.request
#urllib库是Python自带的库,大家也可以使用第三方库requests
from openpyxl import Workbook
第二步,使用re 爬取2018中国最有钱的1000人网站中的表格
#定义获取用户资源链接的函数
url = 'http://finance.sina.com.cn/zt_d/jmzf2018/' #定义目标URL
Sheet1_title = '2018年中国最有钱1000人'
def get_html(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
} #对于网页反爬虫采取的举措,消息头
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request) '''发起请求(GET)--向指定的url发送请求,并返回服务器响应的类文件对象'''
data = response.read().decode('utf-8') '''read()获取响应体的内容,内容是bytes字节流,需要转换成字符串'''
return data
headers 参数是一个字典,这个就是 Request Headers 了,你可以在构造 Request 时通过 headers 参数直接构造,也可以通过调用 Request实例的add_header() 方法来添加, Request Headers 最常用的用法就是通过修改 User-Agent 来伪装浏览器,默认的 User-Agent 是 Python-urllib,我们可以通过修改它来伪装浏览器。
#定义抓取内容的函数
def get_word(data):
pattern = re.compile(r'<td>.+</td>') #进行正则表达式编译
list = re.findall(pattern, data)
return list
def do_list(list):
list_s = []
s = 0
list_m = []
for i in list:
if s % 7 == 0 and s > 0:
list_s.append(list_m)
list_m = []
i = i.lstrip('<td>') # 数据格式处理
i = i.rstrip('</td>')
i = i.strip(' ')
i = i.replace('amp;', '')
list_m.append(i) # 循环6次,然后将m放入s中
s += 1
return list_s
#定义将抓取的内容进行Excel处理并保存的函数
def excel(list_s):
wb = Workbook()
ws1 = wb.active
ws1.title = Sheet1_title
ws1['A1'] = '排名'
ws1['B1'] = '姓名'
ws1['C1'] = '财富(亿元)'
ws1['D1'] = '年龄'
ws1['E1'] = '性别'
ws1['F1'] = '主要财富来源'
ws1['G1'] = '主要公司所在地'
s = 2
for (num, name, money, age, sex, comp, add) in list_s:
col_A = 'A%s' % s
col_B = 'B%s' % s
col_C = 'C%s' % s
col_D = 'D%s' % s
col_E = 'E%s' % s
col_F = 'F%s' % s
col_G = 'G%s' % s
ws1[col_A] = num
ws1[col_B] = name
ws1[col_C] = money
ws1[col_D] = age
ws1[col_E] = sex
ws1[col_F] = comp
ws1[col_G] = add
s += 1
wb.save(filename='2018年中国最有钱1000人.xlsx') #数据存储
return
data = get_html(url)
list = get_word(data)
list_s = do_list(list)
excel(list_s)
爬取结果:
大家也可是试一试2019年的http://finance.sina.com.cn/zt_d/2018zgzf1000/