闲来无事,所以爬下去哪儿网站的旅游景点信息,爬取网页之前,最重要的是分析网页的架构。

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

实战爬取国庆期间各景点数据。数据来源去哪儿网相关推荐

  1. node 爬虫 实战 - 爬取拉勾网职位数据

    node 爬虫 实战 - 爬取拉勾网职位数据,主要想把数据用于大数据学习,到时候大数据分析可以自己分析一下职位的情况,和比较一些我现在的职位在深圳乃至全国的开发人员水平. 涉及到的技术栈:node.j ...

  2. Python爬虫实战爬取租房网站2w+数据-链家上海区域信息(超详细)

    Python爬虫实战爬取租房网站-链家上海区域信息(过程超详细) 内容可能有点啰嗦 大佬们请见谅 后面会贴代码 带火们有需求的话就用吧 正好这几天做的实验报告就直接拿过来了,我想后面应该会有人用的到吧 ...

  3. python实现爬虫探探_全栈 - 9 实战 爬取豆瓣电影数据

    这是全栈数据工程师养成攻略系列教程的第九期:9 实战 爬取豆瓣电影数据. 掌握了爬虫的基本原理和代码实现,现在让我们通过实战项目巩固一下. 确定目标 在写爬虫之前应当想清楚:我需要哪方面的数据?需要包 ...

  4. 爬虫实战(一)—利用requests、mongo、redis代理池爬取英雄联盟opgg实时英雄数据

    概述 可关注微信订阅号 loak 查看实际效果. 代码已托管github,地址为:https://github.com/luozhengszj/LOLGokSpider 包括了项目的所有代码. 此篇文 ...

  5. python 爬取携程旅游景点评论

    python爬取携程旅游景点评论 爬取网址:https://you.ctrip.com/ 爬取评论全部代码 import requests import json import re import t ...

  6. python爬虫实战---爬取大众点评评论

    python爬虫实战-爬取大众点评评论(加密字体) 1.首先打开一个店铺找到评论 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多 ...

  7. 2021春项目需求记录 python实现模拟登录+爬取NASA Modis 上的产品数据

    python实现模拟登录+爬取Nasa Modis 上的产品数据 概述 需求分析 基本思路 代码 概述 3月的中旬时候参与了学校的一个大创项目,作为本科生,本人只是摸鱼打杂,负责了其中的一个功能模块: ...

  8. selenium模拟浏览器-----爬取马蜂窝地区全部景点

    为什么使用selenium 在前面的文章中,我们了解了Ajax的分析和爬取方式,但是,对于参数加密复杂的网页来说,用之前构造请求头的方法来爬取数据未免显得困难,所以这里我们选择了使用selenium. ...

  9. python爬虫实战-爬取微信公众号所有历史文章 - (00) 概述

    http://efonfighting.imwork.net 欢迎关注微信公众号"一番码客"获取免费下载服务与源码,并及时接收最新文章推送. 最近几年随着人工智能和大数据的兴起,p ...

最新文章

  1. div 下 的img水平居中
  2. 安全性测试之认证授权
  3. 【C语言】20-static和extern关键字2-对变量的作用
  4. 使用Python的http.server实现一个简易的Web Api对外提供HanLP拼音转换服务
  5. 理解Shadow DOM
  6. linux 服务器硬件报警,Linux服务器硬件运行状态及故障邮件提醒的监控脚本分享...
  7. 51nod 1050 循环数组最大子段和 单调队列优化DP
  8. 【BZOJ2654】tree
  9. Window下MySQL 8.0重新设置密码
  10. 计算机网络(王道考研笔记)
  11. soundpool android,Android中用SoundPool播放音频
  12. dbv oracle驱动,oracle dbv使用详解
  13. javascript手册安卓版_javascript手册
  14. java计算机毕业设计教务管理系统源码+mysql数据库+系统+lw文档+部署
  15. 如何将MAPGIS中的文件转换为SHP格式,及坐标系问题
  16. 把阿拉伯数字1,2,3...转化成一,二,三
  17. 野火PID上位机通信移植
  18. java阶段测试A卷含答案
  19. 域名解析、域名转向的作用
  20. Unity3d 根据布线,自动生成碰撞墙

热门文章

  1. 从大力教育到大力智能:字节用台灯切入在线教育靠谱吗?
  2. 手动更新mac_如何手动和自动调整Mac的屏幕亮度
  3. css指针悬停_CSS中的指针事件属性
  4. java redis 计数器_redis:每天重置计数器
  5. python自动写作软件_Windows 下优秀的写作软件有哪些?
  6. Anki和欧陆词典的搭配使用
  7. 什么? 用Python兼职300-600元/单,时间自由可日结!
  8. 从前端小白到大佬 第十天
  9. 关于大型语言模型的争论和局限
  10. 学Python划重点 五 (处理Excel、Word、PDF实例)