爬虫的基本步骤:获取url、解析网页并寻找所需内容;数据处理;保存。
知识点:
(1)通常同一类型网页的url具有一定规律,爬取时需要注意观察,例如景点
第2页:https://travel.qunar.com/p-cs299878-shanghai-jingdian-1-2
第3页:https://travel.qunar.com/p-cs299878-shanghai-jingdian-1-3
(2)url的获取可以通过requests.get(url),也可以通过urllib2.urlopen(url)。requests是urllib2包下的子函数。
(3)爬虫的重点在于如何解析访问后返回的内容。以 html (xml)和 json 为例:
a. 格式html、xml:BeautifulSoup4 是一个HTML或XML文件中提取数据的Python库,将内容变为一种特定的结构,可使得每个节点都变为python对象。以根据html标签(例如:head、title)、css选择器(class标签)、属性、属性值等使用find或者find_all进行内容定位和提取。
bs4有四种解析方式:
‘html.parser’解析 速度适中,容错能力强
’lxml’解析 速度快,容错能力强
’xml’解析 速度快,唯一支持xml的解析器
’html5lib’解析 速度慢点,最好的容错性
b. 格式json:可以使用python 自带的json 包将内容变成字典进行引用
url = 'https://restapi.amap.com/v3/geocode/geo?address=武汉&key=a0325cbd9f7ab7eeb1bdb16ca78922b2'
temp1 = urllib2.urlopen(url).read()
temp2 = requests.get(url).text
temptext1 = json.loads(temp1)
temptext2 = json.loads(temp2)
address = temptext1['geocodes'][0]['location']
(4)内容定位:打开网页源,选择元素视图,代码和网页板块对应。
以去哪网景点信息为例,爬取上海景点信息。附代码。
import requests
from bs4 import BeautifulSoup
import numpy as np
import pandas as pd
'''
1、数据采集
'''
def get_urls(n):
return ['https://travel.qunar.com/p-cs299878-shanghai-jingdian-1-' + str(i+1) for i in range(n)]
# 创建函数,获取分页网址
def get_informations(u):
ri = requests.get(u)
# requests访问网站
soupi = BeautifulSoup(ri.text,'lxml')
# bs使用lxml方式解析页面
infori = soupi.find('ul',class_="list_item clrfix").find_all('li')
# 根据网页css标签获取列表内容
datai = []
n=0
for i in infori:
n+=1
#print(i.text)
dic = {}
dic['lat'] = i['data-lat']
dic['lng'] = i['data-lng']
dic['景点名称'] = i.find('span',class_="cn_tit").text
dic['攻略提到数量'] = i.find('div',class_="strategy_sum").text
dic['点评数量'] = i.find('div',class_="comment_sum").text
dic['景点排名'] = i.find('span',class_="ranking_sum").text
dic['星级'] = i.find('span',class_="total_star").find('span')['style'].split(':')[1]
datai.append(dic)
# 分别获取字段内容
#print('已采集%s条数据' %(n*10))
return datai
# 构建页面爬虫
url_lst = get_urls(5)
# 获取5页网址
df = pd.DataFrame()
for u in url_lst:
dfi = pd.DataFrame(get_informations(u))
print dfi
df = pd.concat([df, dfi])
df.reset_index(inplace=True, drop=True)
# 采集数据
'''
2、字段筛选与数据清洗
'''
df['lng'] = df['lng'].astype(np.float)
df['lat'] = df['lat'].astype(np.float)
df['点评数量'] = df['点评数量'].astype(np.int)
df['攻略提到数量'] = df['攻略提到数量'].astype(np.int)
# 字段类型处理
df['星级'] = df['星级'].str.replace('%','').astype(np.float)
# 星级字段处理
df['景点排名'] = df['景点排名'].str.split('第').str[1]
df['景点排名'].fillna(value = 0,inplace = True)
'''
3、导出
'''
df.to_excel('JD.xlsx')