爬虫·悠哉网旅游数据,并保存至mysql数据库

导包

import requests
import urllib 
from bs4 import BeautifulSoup
import pymysql
import openpyxl
import os

获取浏览器header

header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}

获取时间(做软件的时候经常需要,在这就是当做学习的)

import datetime
def get_time():
    now_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')#特殊format(格式化)输出
    return now_time
get_time()

结果:

请求并保存页面

doc_path = '悠哉网'
def save_html(html, doc):
    if not os.path.exists('./data/'+doc):
#         os.makedirs('./data/'+doc)
#         print('路径创建成功')
        with open('./data/%s.html'%(doc),'w+',encoding='utf-8') as f:
            f.write(html)
            
def get_html(url):#获取解析出来的html代码
    req = requests.get(url, header)
    if req.status_code == 200:
        html = req.content.decode('utf-8')   
        save_html(html, doc_path)
        return html 
    else:
        print('访问失败')
#get_html(url)

连接、创建数据库。

在这小结一下老师讲的db使用步骤(不一定正确,只是可以保证功能OK)

  1. db=pymysql.connect(xxx)连接
  2. db.begin()
  3. cur=db.cursor() 利用游标Cursor - 用来给数据库发送sql语法,执行数据操作
  4. cur.execute() 在实验中:创建可以直接这样执行,insert的需要下面这步
  5. db.submit
  6. 最后需要cur.close() db.close()
  • 获取sql语句的:取巧方法就是直接提取sql语句
import pymysql
db = pymysql.connect(host='localhost', user='root', passwd='', port=3306, db='db_travel', charset='utf8')
db.begin()
cur = db.cursor()
cur.execute("drop table if exists info")
sql_create = '''
CREATE TABLE `info` (
  `旅游项目` varchar(100) NOT NULL,
  `出发地` varchar(255) DEFAULT NULL,
  `出发日期` varchar(255) DEFAULT NULL,
  `价格` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`旅游项目`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

'''
cur.execute(sql_create)#这样就创建好了

解析tree,最好画出html树,条理清晰

url = 'https://search.uzai.com/%s/%d/0/0/'#url的format模板
# addr = int(input('输入要查询的国家或城市:(按回车键结束输入)'))
addr = 'guangzhou'

def get_page_n(html):# 查询分页详情
    soup = BeautifulSoup(html,'html.parser')
    page_n = soup.find('div', attrs={"data-pageparameter":"page"})["data-pagecount"]#这是总页码数
    return page_n

def get_content(url):    
    html = get_html(url)    
    soup = BeautifulSoup(html,'html.parser')
    cont = soup.find_all("div",attrs={"class":"main_left1"})#一页中的旅游信息    
    for con in cont:
        des_name = con.find("div",attrs={"class":"main_left1_rl"}).h2["title"]
        dep_name = con.find("div", attrs={"class": "main_left1_rl"}).find("div",attrs={"class":"place_departure"}).span.string
        date = con.find("div", attrs={"class": "main_left1_rl"}).find("div",attrs={"class":"departure_date"}).get_text()#获取标签中所有文本信息
        price = con.find("div",attrs={"class":"main_left1_rr_tab"}).div.get_text()
        print("==========================================================================");
        print("旅游项目:",des_name)
        print("出发地:", dep_name)
        print("出发日期:", date)
        print("价格:", price)
        sql_insert='''
        INSERT INTO `info` (`旅游项目`, `出发地`, `出发日期`, `价格`) VALUES ('%s', '%s', '%s', '%s')

        '''%(des_name, dep_name.replace('出发',''), date.replace('出发日期:',''), price)
        cur.execute(sql_insert)
        db.commit()# 提交事务,不写的话没insert
def main(html):
    url_1st = url%(addr,1)#第一页
    html =  get_html(url_1st)    
    soup = BeautifulSoup(html,'html.parser')
    #先要判断是否有分页,eg广州只有一页
    div_page = soup.find('div', attrs={'class':"page"})
    if div_page.text.strip() == '':#为空说明没有分页,只有一页
        get_content(url_1st)
    else:
        page_n = soup.find('div', attrs={"data-pageparameter":"page"})["data-pagecount"]#这是总页码数
        for i in range(1, 1+int(page_n)):
            url_one = url%(addr,i)#其中一页(这里要遍历每一页)    
            print('\n\n第%d页\n'%i)
            get_content(url_one)

main(url)
db.close()

结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值