Python网络爬虫案例实战:Python平台

Python网络爬虫案例实战:Python平台

Python软件概述

Python是一种计算机程序设计语言,是一种面向对象的动态类型语言,其自身具有独立的特点,主要表现为:
● 简单:Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样,它使你能够专注于解决问题而不是去搞明白语言本身。
● 易学:Python极其容易上手,因为Python有极其简单的说明文档。
● 速度快:Python 的底层是用C语言写的,很多标准库和第三方库也都是用C写的,运行速度非常快。
● 可扩展性:如果需要一段关键代码运行得更快或者希望某些算法不公开,可以部分程序用C或C++编写,然后在Python程序中使用它们。
● 可嵌入性:可以把Python嵌入C/C++程序,从而向程序用户提供脚本功能。

在Windows系统中搭建Python环境

Windows系统并非都默认安装了Python,因此你可能需要下载并安装它,再下载并安装一个文本编辑器。安装Python下载并安装Python 3.6.5(注意选择正确的操作系统)。

完成Python后,再到PowerShell中输入python,看到进入终端的命令提示则代表phthon安装成功。安装成功后的界面如图2-5所示。
为了编程方便,需要安装Greany程序,首先下载Windows Greany安装程序,可访问httt://geany.org/,单击Download下的Releases,找到安装程序geany-1.25_setup.exe或类似的文件。下载安装程序后,运行它并接受所有的默认设置。

现在选择菜单“生成|设置生成命令”,将看到文字Compile和Execute,它们旁边都有一个命令。默认情况下,这两个命令都是python(全部小写),但Geany不知道这个命令位于系统的什么地方。需要添加启动张端会话时使用的路径。在编译命令和执行中,添加命令python所在的驱动器和文件夹。

使用pip安装第三方库

pip是Python安装各种第三方库(package)的工具。
对于第三方库不太理解的读者,可以将库理解为供用户调用的代码组合。在安装某个库后,可以直接调用其中的功能,使得我们不用一个代码一个代码地实现某个功能。这就像你需要为计算机杀毒时会选择下载一个杀毒软件一样,而不是自己写一个杀毒软件,直接使用杀毒软件中的杀毒功能来杀毒就可以了。这个比方中的杀毒软件就像是第三方库,杀毒功能就是第三方库中可以实现的功能。

下面例子中,将介绍如何用pip安装第三方库bs4,它可以使用其中的BeautifulSoup解析网页。打开cmd.exe,在Windows中为cmd,在Mac中为terminal。在Windows中,cmd命令是提示符,输入一些命令后,cmd.exe可以执行对系统的管理。单击“开始”按钮,在“搜索程序和文件”文本框中输入cmd后按回车键,系统会打开命令提示符窗口,如图2-9所示。在Mac中,可以直接在“应用程序”中打开terminal程序。

条件语句与循环语句

条件语句

条件语句可以使得当满足条件的时候才执行某部分代码。条件为布尔值,也就是只有True和False两个值。当if判断条件成立时才执行后面的语句;当条件不成立的时候,执行else后面的语句。

在Python中,条件语句的语法格式为:

if condition_1:
    statement_block_1
elif condition_2:
    statement_block_2
else:
    statement_block_3

在嵌套 if 语句中,可以把 if…elif…else 结构放在另外一个 if…elif…else 结构中。其语法格式为:

if 表达式1:
    语句
    if 表达式2:
        语句
    elif 表达式3:
        语句
    else:
        语句
elif 表达式4:
    语句
else:
    语句

循环语句

Python中的循环语句有for和while,下面给予介绍。

  1. while循环
    Python中while语句的一般形式:
    while 判断条件:
    语句
    同样需要注意冒号和缩进。另外,在Python中没有do…while循环。

  2. for循环
    Python的 for循环可以遍历任何序列的项目,如一个列表或者一个字符串。
    for循环的一般格式如下:
    for in :

    else:

面向对象编程

面向对象技术简介

面向对象技术主要有:
● 类(Class):用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
● 方法:类中定义的函数。
● 类变量:类变量在整个实例化的对象中是公用的,类变量定义在类中且在函数体之外,类变量通常不作为实例变量使用。
● 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
● 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
● 局部变量:定义在方法中的变量,只作用于当前实例的类。
● 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
● 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
● 实例化:创建一个类的实例,类的具体对象。
● 对象:通过类定义的数据结构实例,对象包括两个数据成员(类变量和实例变量)和方法。

类定义

类定义的语法格式为:

class ClassName:
    <statement-1>
.
.
.
    <statement-N>

类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性。

类对象

类对象支持两种操作:属性引用和实例化。属性引用使用和 Python 中所有的属性引用一样的标准语法:obj.name。类对象创建后,类命名空间中所有的命名都是有效属性名。

第一个爬虫实例

当了解了Python的基础语法后,本节尝试利用Python编写第一个爬虫实例。

程序开头我们添加:

coding : UTF-8

这样就能告诉解释器该py程序是utf-8编码的,源程序中可以有中文。
(1)要引用的包
import requests
import csv
import random
import time
import socket
import http.client
import urllib.request
from bs4 import BeautifulSoup
其中,
requests:用来爬取网页的html源代码。
csv:将数据写入csv文件中。
在这里插入图片描述
random:取随机数。
time:时间相关操作。
socket 和http.client:在这里只用于异常处理。
BeautifulSoup:用来代替正则式取源码中相应标签中的内容。
urllib.request:另一种爬取网页的html源代码的方法,但是不如 requests方便。

def get_content(url , data = None): 
	header={ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, sdch', 'Accept-Language': 'zh-CN,zh;q=0.8', 'Connection': 'keep-alive', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.235' } 
	timeout = random.choice(range(80, 180)) 
	while True: 
		try: 
			rep = requests.get(url,headers = header,timeout = timeout)
			rep.encoding = 'utf-8' # req = urllib.request.Request(url, data, header) 
			break 
		except socket.timeout as e: 
			print( '3:', e) 
			time.sleep(random.choice(range(8,15))) 
		except socket.error as e: 
			print( '4:', e) 
			time.sleep(random.choice(range(20, 60))) 
		except http.client.BadStatusLine as e: 
			print( '5:', e) 
			time.sleep(random.choice(range(30, 80))) 
		except http.client.IncompleteRead as e: 
			print( '6:', e) 
			time.sleep(random.choice(range(5, 15))) 
	return(rep.text)# 返回 html_text

其中,header是requests,get的一个参数,目的是模拟浏览器访问。header可以使用Chrome的开发者工具获得,具体方法如下:
打开 Chrome,按F12键,选择network,效果如图2-13所示。
在这里插入图片描述
重新访问该网站,找到第一个网络请求,查看它的header,如图2-14所示。
在这里插入图片描述
timeout是设定的一个超时时间,取随机数是因为防止被网站认定为网络爬虫。然后通过requests.get方法获取网页的源代码,rep.encoding ='utf-8’是将源代码的编码格式改为utf-8(不改源代码中中文部分会为乱码)。
接着,还是用开发者工具查看网页源码,并找到所需字段的相应位置,如图2-15所示。
在这里插入图片描述
(3)我们需要的字段都在id ="7d"的“div”的ul中。日期在每个li中hl中,天气情况在每个li的第一个p标签内,最高温度和最低温度在每个li的span和i标签中。到了傍晚,需要找到当天最高温度,所以要多加一个判断。代码如下:

def get_data(html_text): 
	final = [] 
	bs = BeautifulSoup(html_text, "html.parser") # 创建BeautifulSoup对象 
	body = bs.body # 获取body部分 
	data = body.find('div', {'id': '7d'}) # 找到id为7d的div 
	ul = data.find('ul') # 获取ul部分 
	li = ul.find_all('li') # 获取所有的li 
	for day in li: # 对每个li标签中的内容进行遍历 
		temp = [] 
		date = day.find('h1').string # 找到日期 
		temp.append(date) # 添加到temp中 
		inf = day.find_all('p') # 找到li中的所有p标签 
		temp.append(inf[0].string,) #第一个p标签中的内容(天气状况)加到temp中 
		if inf[1].find('span') is None: 
			temperature_highest = None # 天气预报可能没有当天的最高气温(到了傍晚,就是这样),需要加个判断语句,来输出最低气温 
		else:
			temperature_highest = inf[1].find('span').string # 找到最高温
			temperature_highest = temperature_highest.replace('℃', '') # 到了晚上网站会变,最高温度后面也有个℃
			temperature_lowest = inf[1].find('i').string # 找到最低温
			temperature_lowest = temperature_lowest.replace('℃', '') # 最低温度后面有个℃,去掉这个符号
			temp.append(temperature_highest) # 将最高温添加到temp中
			temp.append(temperature_lowest) #将最低温添加到temp中
			final.append(temp) #将temp加到final中
	return final

(4)写人文件csv。将数据爬取出来后要将它们写人文件,具体代码如下:

def write_data(data, name): 
	file_name = name 
	with open(file_name, 'a', errors='ignore', newline='') as f: 
		f_csv = csv.writer(f) 
		f_csv.writerows(data)

(5)主函数。

if __name__ == '__main__': 
	url ='http://www.weather.com.cn/weather/101200901.shtml' 
	html = get_content(url) 
	result = get_data(html) 
	write_data(result, 'weather.csv')		

运行程序,生成的 weather.csv文件如图2-16所示。
在这里插入图片描述
在这里插入图片描述

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值