一、什么是爬虫?
学习爬虫前,我们首先要先了解一下爬虫的目的是什么?爬虫简单来说就是一个程序,这个程序会根据我们的设定,将网页上的目标内容获取并存储下来,供后续使用。
爬虫的工作过程跟我们自己上网搜索的过程类似,爬虫是一个“拟人”的操作
人力工作过程:浏览器发送请求(在搜索框输入内容并搜索)-- 服务器返回搜索结果 -- 肉眼筛选目标内容,通过复制或手动输入记录下来
爬虫工作过程:模拟浏览器发送请求 -- 服务器返回搜索结果 -- 下载网页内容 -- 解析网页内容并获取目标信息 -- 存放于数据库或文件中
二、爬虫工作流程
1、模拟浏览器发送请求、服务器返回搜索结果、下载网页内容
爬虫工作的前3个过程,在实际工作中是合并在一起处理的。我们会使用http库向目标站点发送一个Request,服务器能正常响应的话,会返回一个Response,下载这个Response,供后面进行我网页解析。
发送请求下载网页常用的2个工具,一个是python自带的基础模块 urllib,一个是第三方包 requests(如果没安装,先用pip install requests安装一下),示例代码如下:
#用urllib
from urllib import request
url='http://gz.ziroom.com/z/vr/61669497.html'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
req = request.Request(url, headers=headers)
urlhtml = request.urlopen(req) #请求打开网页
print(urlhtml.read().decode('utf-8')) #网页解码
#用requests
import requests
url='http://gz.ziroom.com/z/vr/61669497.html'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
urlhtml=requests.get(url, headers=headers) #请求打开网页
#print(urlhtml)
urlhtml.encoding='utf-8' #网页解码
print(urlhtml.text) #读取网页
2、解析网页并获取目标信息
根据得到的数据类型不同,有不同的解析方法
html数据:正则表达式(RE模块),第三方解析库bs4(Beautifulsoup)
json数据:json模块
二进制数据:wb方式
实际爬取中,最最常遇到的是html数据,而对html数据解析最最常用的是Beautifulsoup,所以这里拿Beautifulsoup来举例解析了。
继续上面的例子,在下载网页后,用Beautifulsoup进行结构化解析
from bs4 import BeautifulSoup
import requests
#requests 解析网页
url='http://gz.ziroom.com/z/vr/61669497.html'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
urlhtml=requests.get(url, headers=headers) #请求打开网页
urlhtml.encoding='utf-8' #网页解码
soup = BeautifulSoup(urlhtml.text,'lxml')
print(soup)
解析后,就是根据结果规则获取目标信息了,这里通常使用select或find定位,详细使用可以看另外两篇文档《python 爬虫之select用法》《python 爬虫之find、find_all用法》 ,这里简单用select举个例子
from bs4 import BeautifulSoup
import requests
url='http://gz.ziroom.com/z/vr/61669497.html'
urlhtml=requests.get(url)
urlhtml.encoding='utf-8'
soup=BeautifulSoup(urlhtml.text,'lxml')
alink = soup.select('h1')
print(type(alink))
print('------------------**----------------------')
print(alink)
3、存放数据
存放数据的形式,基本就两种,一种是直接将数据存入数据库,一种是以文件(如:txt、xlsx等)的格式存储。
存入数据库需要用pymssql包,先创建数据库链接再进行数据库交互;文件形式存储最常用的是用pandas库的to_excel\to_csv进行,直接举例吧
首先是存储到数据库的方式
#将数据写入数据库
#连接数据库
server = "服务器名,如果是本地数据库IP用127.0.0.1"
user = "用户名"
password = "密码"
database = "数据库名"
conn = pymssql.connect(server, user, password, database)
cursor = conn.cursor()
if not cursor:
raise(NameError,"连接数据库失败")
else:
print('OK')
#写入数据
sql_xj = "INSERT INTO table1 ([年月],[日期],[来源],[区域],[类型],[套数],[面积]) VALUES (%s,%s,%s,%s,%s,%d,%d)"
cursor.executemany(sql_xj, data_xj)
# 如果没有指定autocommit属性为True的话就需要调用commit()方法
conn.commit()
print(time,'写入数据库成功')
conn.close()#关闭数据库
然后是pandas的存储
#将数据导出到excel
import pandas as pd
df=pd.DataFrame()
df['区域']=area
df['日期']=date
df.to_excel(r'test01.xlsx')