实战爬取国庆期间各景点数据。数据来源去哪儿网
闲来无事,所以爬下去哪儿网站的旅游景点信息,爬取网页之前,最重要的是分析网页的架构。
1. 选择要爬取的网页及定位自己要爬取的信息
url=http://piao.qunar.com/ 爬取全国热门城市的境内门票
首先要得到全国热门城市的城市名及它们背后的链接
2. 根据获得的链接进入对应的页面
进一步分析页面,将我们要的数据一个个找出来
3. 得到页面的下一页
因为我要根据最大页数来遍历每一页,倒数第二个a标签中的数据是页数信息
到这里我们就将我们的思路屡清楚了:
1.首先根据初始给的url,解析该url得到城市的城市名及背后的链接
2.再根据得到的链接解析出其中包含很多页的每一页链接
3.根据得到的每一个的链接,再来对每一页的信息解析
4.将解析后的数据存入到MySQL数据库中
4. 设计数据库
5. 直接上代码
import requests
from bs4 import BeautifulSoup
import re
import pymysql
# 解析出每个城市及其该城市对应的url
def parse_city(url):
html = requests.get(url,headers=headers)
html = html.text
soup = BeautifulSoup(html,'lxml')
city = soup.find_all('ul',{'class':'mp-sidebar-list','mp-role':'hotCityList'})[0].find_all('li')
for i in city:
# 得到每个城市的名字和对应的url
city_name = i.a.text
city_url = i.a['href']
city_url='http://piao.qunar.com'+city_url
city_page(city_name,city_url)
# 解析出每个城市的url的下一页
def city_page(city_name,city_url):
html = requests.get(city_url,headers=headers)
html = html.text
soup = BeautifulSoup(html,'lxml')
page = soup.find_all('div',{'class':'pager'})[0].find_all('a')
# 得到a标签中的href
page_url = page[0]['href']
# 得到下一页的url,这个url由我们来指定,只需把页数前面的字符串匹配出来即可
page_select_url = re.findall('(.*page=)',page_url)[0]
# 将完整的页数的url拼接起来
page_select_url = 'http://piao.qunar.com'+page_select_url
# 这里选-2是有深意的,因为在选择每一页的地方倒一是下一页,而倒二则是尾页数
page_num = int(page[-2].text)
print('有%s页的数据'%page_num)
for i in range(1,page_num+1):
# 遍历得到某个城市中所有页数
print('第%d页信息'%i)
parse_page_url = page_select_url+str(i)
print('网页地址:',parse_page_url)
# 将每一页的url都传递到parse_page中进行解析
parse_page(city_name,parse_page_url)
# 解析每个城市每一页的信息
def parse_page(city_name,parse_page_url):
html = requests.get(parse_page_url,headers=headers)
html = html.text
soup = BeautifulSoup(html,'lxml')
jingdian = soup.find_all('div',{'class':'result_list','id':'search-list'})[0].find_all('div',{'class':'sight_item'})
for c in jingdian:
# 景点名
jd_name = c.find_all('a',{'data-click-type':'l_title','class':'name'})[0].text
# 景点级别,有的景区无级别,所以要设置一个异常
try:
jd_jb = c.find_all('span',{'class':'level'})[0].text
except:
jd_jb='普通景区'
# text得到的是 地址:北京市东城区景山前街4号 这种格式,所以以空格拆分,取后面那个
jd_address = c.find_all('p',{'class':{'address','color999'}})[0].text.split()[-1]
# 景点介绍
jd_jieshao = c.find_all('div',{'class':{'intro','color999'}})[0].text
# 景点价格,有的是免费,并无价格这一参数,所以设置一个异常
try:
jd_price = c.find_all('span',{'class':'sight_item_price'})[0].find_all('em')[0].text
except:
jd_price=0
# 有的是免费,并销量这一参数,所以设置一个异常
try:
jd_xiaoliang = c.find_all('span',{'class':'hot_num'})[0].text
# 景点销量
jd_xiaoliang=int(jd_xiaoliang)
except:
jd_xiaoliang=0
print('{0} {1} {2} {3} {4}'.format(jd_name,jd_jb,jd_jieshao,jd_price,jd_xiaoliang))
mysql(city_name,jd_name,jd_jb,jd_jieshao,jd_price,jd_xiaoliang)
# 定义一个类,将连接MySQL的操作写入其中
class down_mysql:
def __init__(self,city_name,jd_name,jd_jb,jd_jieshao,jd_price,jd_xiaoliang):
self.city_name = city_name
self.jd_name = jd_name
self.jd_jb = jd_jb
self.jd_jieshao = jd_jieshao
self.jd_price = jd_price
self.jd_xiaoliang = jd_xiaoliang
self.connect = pymysql.connect(
host = 'localhost',
db = 'test',
port = 3306,
user = 'root',
passwd = '123456',
charset = 'utf8',
use_unicode = False
)
self.cursor = self.connect.cursor()
# 保存数据到MySQL中
def save_mysql(self):
sql = "insert into qu_na(city_name,jd_name,jd_jb,jd_jieshao,jd_price,jd_xiaoliang) VALUES (%s,%s,%s,%s,%s,%s)"
try:
self.cursor.execute(sql,(self.city_name,self.jd_name,self.jd_jb,self.jd_jieshao,self.jd_price,self.jd_xiaoliang))
self.connect.commit()
print('数据插入成功')
except:
print('数据插入错误')
def mysql(city_name,jd_name,jd_jb,jd_jieshao,jd_price,jd_xiaoliang):
# 新建类,将数据保存在MySQL中
down = down_mysql(city_name,jd_name,jd_jb,jd_jieshao,jd_price,jd_xiaoliang)
down.save_mysql()
if __name__=='__main__':
headers = {
'User-Agent': 'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)', }
start_url='http://piao.qunar.com/'
parse_city(start_url)
运行程序
然后再来看我们的MySQL数据库
表设计可能错了,这个字段给大了,总而言之还算是爬下来了
---------------------
作者:programmer188
实战爬取国庆期间各景点数据。数据来源去哪儿网相关推荐
- node 爬虫 实战 - 爬取拉勾网职位数据
node 爬虫 实战 - 爬取拉勾网职位数据,主要想把数据用于大数据学习,到时候大数据分析可以自己分析一下职位的情况,和比较一些我现在的职位在深圳乃至全国的开发人员水平. 涉及到的技术栈:node.j ...
- Python爬虫实战爬取租房网站2w+数据-链家上海区域信息(超详细)
Python爬虫实战爬取租房网站-链家上海区域信息(过程超详细) 内容可能有点啰嗦 大佬们请见谅 后面会贴代码 带火们有需求的话就用吧 正好这几天做的实验报告就直接拿过来了,我想后面应该会有人用的到吧 ...
- python实现爬虫探探_全栈 - 9 实战 爬取豆瓣电影数据
这是全栈数据工程师养成攻略系列教程的第九期:9 实战 爬取豆瓣电影数据. 掌握了爬虫的基本原理和代码实现,现在让我们通过实战项目巩固一下. 确定目标 在写爬虫之前应当想清楚:我需要哪方面的数据?需要包 ...
- 爬虫实战(一)—利用requests、mongo、redis代理池爬取英雄联盟opgg实时英雄数据
概述 可关注微信订阅号 loak 查看实际效果. 代码已托管github,地址为:https://github.com/luozhengszj/LOLGokSpider 包括了项目的所有代码. 此篇文 ...
- python 爬取携程旅游景点评论
python爬取携程旅游景点评论 爬取网址:https://you.ctrip.com/ 爬取评论全部代码 import requests import json import re import t ...
- python爬虫实战---爬取大众点评评论
python爬虫实战-爬取大众点评评论(加密字体) 1.首先打开一个店铺找到评论 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多 ...
- 2021春项目需求记录 python实现模拟登录+爬取NASA Modis 上的产品数据
python实现模拟登录+爬取Nasa Modis 上的产品数据 概述 需求分析 基本思路 代码 概述 3月的中旬时候参与了学校的一个大创项目,作为本科生,本人只是摸鱼打杂,负责了其中的一个功能模块: ...
- selenium模拟浏览器-----爬取马蜂窝地区全部景点
为什么使用selenium 在前面的文章中,我们了解了Ajax的分析和爬取方式,但是,对于参数加密复杂的网页来说,用之前构造请求头的方法来爬取数据未免显得困难,所以这里我们选择了使用selenium. ...
- python爬虫实战-爬取微信公众号所有历史文章 - (00) 概述
http://efonfighting.imwork.net 欢迎关注微信公众号"一番码客"获取免费下载服务与源码,并及时接收最新文章推送. 最近几年随着人工智能和大数据的兴起,p ...
最新文章
- div 下 的img水平居中
- 安全性测试之认证授权
- 【C语言】20-static和extern关键字2-对变量的作用
- 使用Python的http.server实现一个简易的Web Api对外提供HanLP拼音转换服务
- 理解Shadow DOM
- linux 服务器硬件报警,Linux服务器硬件运行状态及故障邮件提醒的监控脚本分享...
- 51nod 1050 循环数组最大子段和 单调队列优化DP
- 【BZOJ2654】tree
- Window下MySQL 8.0重新设置密码
- 计算机网络(王道考研笔记)
- soundpool android,Android中用SoundPool播放音频
- dbv oracle驱动,oracle dbv使用详解
- javascript手册安卓版_javascript手册
- java计算机毕业设计教务管理系统源码+mysql数据库+系统+lw文档+部署
- 如何将MAPGIS中的文件转换为SHP格式,及坐标系问题
- 把阿拉伯数字1,2,3...转化成一,二,三
- 野火PID上位机通信移植
- java阶段测试A卷含答案
- 域名解析、域名转向的作用
- Unity3d 根据布线,自动生成碰撞墙