使用requests、re、BeautifulSoup、线程池爬取携程酒店信息并保存到Excel中
import requests
import json
import re
import csv
import threadpool
import time, random
from bs4 import BeautifulSoup
from fake_useragent import UserAgent def hotel(city_letter, city_num, city_name):
with open('has_address.json', 'a+', encoding="utf-8") as f:
f.write(str(city_num) + '\n')
f.close()
ss = 0
with open('携程/%s.csv' % city_name, 'w+', encoding='utf-8-sig') as hotel_xie:
k = csv.writer(hotel_xie, dialect='excel')
k.writerow(['序号', '名称', '价格', '星级', '地址', '酒店介绍'])
for i in range(1, 100):
url = "http://hotels.ctrip.com/Domestic/Tool/AjaxHotelList.aspx"
headers = {
"Connection": "keep-alive",
"origin": "http://hotels.ctrip.com",
"Host": "hotels.ctrip.com",
"referer": "http://hotels.ctrip.com/hotel/%s" % city_letter,
"user-agent": UserAgent(verify_ssl=False).random,
"Content-Type": "application/x-www-form-urlencoded",
}
data = {
"StartTime": "2019-02-25",
"DepTime": "2019-02-26",
"RoomGuestCount": "1,1,0",
"city": city_num,
"page": i,
}
try:
time.sleep(random.randint(1, 5))
html = requests.post(url, headers=headers, data=data)
regex = re.compile(r'\\(?![/u"])')
fixed = regex.sub(r"\\\\", html.text) aa = json.loads(fixed)
except Exception:
pass
for n in range(0, 25):
try:
hotel_name = aa["hotelPositionJSON"][n]["name"]
hotel_id = aa["hotelPositionJSON"][n]["id"]
hotel_address = aa["hotelPositionJSON"][n]["address"]
price = eval(aa["HotelMaiDianData"]["value"]["htllist"])[n]["amount"]
star_class = aa["hotelPositionJSON"][n]["star"][-2:]
time.sleep(random.randint(1, 3))
hotel_intro = requests.get('http://hotels.ctrip.com/hotel/%s.html' % hotel_id)
res_req = BeautifulSoup(hotel_intro.text, "html5lib")
iss = re.sub('资质备案', '', re.sub('联系方式', '', res_req.find('div', id='htlDes').findAll('p')[0].get_text()))
ins = iss.replace('\n', '').replace(' ', '').replace(' ', '')
s = res_req.find('span', id='J_realContact')['data-real'].replace('\n', ',')
tel = s[s.rfind("电话"): s.rfind("<a") - 2]
duction = res_req.find('span', id='ctl00_MainContentPlaceHolder_hotelDetailInfo_lbDesc').get_text().replace('\n', ',')
introduction = str(ins) + str(tel) + str(duction)
ss += 1
k.writerow([ss, hotel_name, price + "元起", star_class, hotel_address, introduction])
except Exception:
continue
time.sleep(random.randint(1, 4))
hotel_xie.close() if __name__ == '__main__':
has_num = []
will_req_list = []
for line in open("address.json", encoding='utf-8'):
single_list = line.replace("\n", "").split(',')
for has in open("has_address.json", encoding='utf-8'):
has_num.append(int(has.replace("\n", "")))
if int(single_list[1]) in has_num:
continue
single_tuple = (single_list, None)
will_req_list.append(single_tuple)
pool = threadpool.ThreadPool(8)
request_list = threadpool.makeRequests(hotel, will_req_list)
[pool.putRequest(req) for req in request_list]
pool.wait() # 爬取地址
# h = {
# "Connection": "keep-alive",
# "origin": "http://hotels.ctrip.com",
# "Host": "hotels.ctrip.com",
# "referer": "http://hotels.ctrip.com/hotel/beijing1",
# "user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
# "Content-Type": "application/x-www-form-urlencoded",
# }
# res = requests.get('http://hotels.ctrip.com/Domestic/Tool/AjaxGetCitySuggestion.aspx', headers=h)
# a_list = re.findall('data:(.*?),group:', res.text)
# with open('address.json', 'w+', encoding="utf-8") as f:
# for address in a_list:
# i = 0
# al = address.split(',')
# for a in al:
# city_letter = ''.join(re.findall(r'[A-Za-z]', a))
# f.write(city_letter + ',')
# city_num = re.sub("\D", "", a)
# f.write(str(city_num))
# city_name = re.sub('[A-Za-z0-9\"\|]', "", a)
# f.write(',' + str(city_name))
# f.write('\n')
# i += 1
# f.close()
使用requests、re、BeautifulSoup、线程池爬取携程酒店信息并保存到Excel中的更多相关文章
- 使用requests、BeautifulSoup、线程池爬取艺龙酒店信息并保存到Excel中
import requests import time, random, csv from fake_useragent import UserAgent from bs4 import Beauti ...
- Python爬取猫眼电影100榜并保存到excel表格
首先我们前期要导入的第三方类库有; 通过猫眼电影100榜的源码可以看到很有规律 如: 亦或者是: 根据规律我们可以得到非贪婪的正则表达式 """<div class ...
- 爬取拉勾网所有python职位并保存到excel表格 对象方式
# 1.把之间案例,使用bs4,正则,xpath,进行数据提取. # 2.爬取拉钩网上的所有python职位. from urllib import request,parse import json ...
- 爬取淘宝商品数据并保存在excel中
1.re实现 import requests from requests.exceptions import RequestException import re,json import xlwt,x ...
- 基于requests模块的cookie,session和线程池爬取
目录 基于requests模块的cookie,session和线程池爬取 基于requests模块的cookie操作 基于requests模块的代理操作 基于multiprocessing.dummy ...
- Python+Requests+异步线程池爬取视频到本地
1.本次项目为获取梨视频中的视频,再使用异步线程池下载视频到本地 2.获取视频时,其地址中的Url是会动态变化,不播放时src值为图片的地址,播放时src值为mp4格式 3.查看视频链接是否存在aja ...
- python爬取数据保存到Excel中
# -*- conding:utf-8 -*- # 1.两页的内容 # 2.抓取每页title和URL # 3.根据title创建文件,发送URL请求,提取数据 import requests fro ...
- 使用pandas中的raad_html函数爬取TOP500超级计算机表格数据并保存到csv文件和mysql数据库中
参考链接:https://www.makcyun.top/web_scraping_withpython2.html #!/usr/bin/env python # -*- coding: utf-8 ...
- 「拉勾网」薪资调查的小爬虫,并将抓取结果保存到excel中
学习Python也有一段时间了,各种理论知识大体上也算略知一二了,今天就进入实战演练:通过Python来编写一个拉勾网薪资调查的小爬虫. 第一步:分析网站的请求过程 我们在查看拉勾网上的招聘信息的时候 ...
随机推荐
- dp-01背包问题 (升级)
The story happened long long ago. One day, Cao Cao made a special order called "Chicken Rib&quo ...
- dfs - 卡一个无符号长整形
Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal repr ...
- Webpack实战(一):Webpack打包工具安装及参数配置
为什么要模块化 javascript跟其他开发语言有很多的区别,其中一个就是没有模块化概念,如果一个项目中有多个js文件,我们只能通过script标签引入的方式,把一个个js文件插入到页面,这种做法会 ...
- ii
char a[10], b[10], c[10], d[10],e[10],f[10],g[10],h[10]; scanf("%s %s %s %s", a, b, c, d); ...
- Lobooi第二次作业:熟悉使用工具
第二次作业 GIT地址 https://github.com/Lobooi//AchaoCalculator GIT用户名 Lobooi 学号后五位 24235 博客地址 https://home.c ...
- Dynamics 365 CRM Connected Field Service 不能接收IoT Alert
今天浪费了2,3个小时再connected field service(CFS)上面. 状况如下 1. 在CFS中添加了新的customer assets,并且点击了注册按钮. 2. 注册步骤一直在i ...
- 谈谈 InnoDB引擎中的一些索引策略
如果我们在工作能够更好的利用好索引,那将会极大的提升数据库的性能. 覆盖索引 覆盖索引是指在普通索引树中可以得到查询的结果,不需要在回到主键索引树中再次搜索 建立如下这张表来演示覆盖索引: creat ...
- JVM第一弹
JVM第一弹 基本概念 JVM是可运行java代码的假想计算机,包括一套字节码指令集,一组寄存器,一个栈,一个垃圾回收.堆和一个存储方法域.JVM是运行在操作系统之上的,它与硬件没有直接的交互. 运行 ...
- linux--->linux 各个文件夹及含义
1./bin 是binary的缩写 存放linux常用命令 2./lib 该目录用来存放系统动态链接共享库,几乎所有的应用程序都会用到该目录下的共享库. 3./dev 该目录包含了Linux系统中使用 ...
- JDK源码之String类解析
一 概述 String由final修饰,是不可变类,即String对象也是不可变对象.这意味着当修改一个String对象的内容时,JVM不会改变原来的对象,而是生成一个新的String对象 主要考虑以 ...