导包
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)
- db=pymysql.connect(xxx)连接
- db.begin()
- cur=db.cursor() 利用游标Cursor - 用来给数据库发送sql语法,执行数据操作
- cur.execute() 在实验中:创建可以直接这样执行,insert的需要下面这步
- db.submit
- 最后需要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()
结果: