Python打造自动化爬取携程旅游,太强了这个工具

1、查找数据源 , 获取网址携程旅游网址
2、导入需要的模块from selenium import webdriverimport timefrom pc import data_boolimport randomfrom selenium.webdriver.common.keys import Keys3、实例化对象bool_=data_bool()#实例化4、写入需要键入的地区 , 省份diqu=['北京','上海','深圳','成都','广州','杭州','三亚','海口','乌鲁木齐','拉萨','武汉','南京','西安','南疆','大理','香格里拉','西双版纳','五台山','哈尔滨','甘肃','浙江','天津','江苏','福建','重庆','湖南','辽宁','山东','内蒙古','安徽','四川','湖北','海南','河北','青海','陕西','江西','宁夏','云南','吉林','河南','广西','黑龙江','山西','新疆','贵州','西藏','云南'] # 需要键入的地区 全国省份集合5、设置函数 , 用异常捕获处理查看参数数据
Python打造自动化爬取携程旅游,太强了这个工具文章插图
def result(driver):#获取父级元素parent=driver.find_element_by_class_name('main_col')#获取景点等多信息try:str_introduce=parent.find_elements_by_css_selector('p.list_product_title')except:str_introduce=[]print('头部获取到空值')#获取跟团游或地点信息try:str_product=parent.find_elements_by_css_selector('p.list_product_tip')except:str_product=[]print('跟团游获取到空值')#获取列表字段的介绍信息try:list_box=parent.find_elements_by_css_selector('list_label_box')list_box_item=[]for i in list_box:list_box_item.append(i.find_elements_by_css_selector('span'))except:list_box_item=[]print('列表获取空值')#获取供应商信息try:list_retail=parent.find_elements_by_css_selector('p.list_product_retail')except:list_retail=[]print('供应商得到空值')#获取评分信息try:str_grade=parent.find_elements_by_css_selector('p.list_change_grade')except:str_grade=[]print('评分获得空值')#获取出行人数信息try:str_number=parent.find_elements_by_css_selector('div.list_change_one')except:str_number=[]print('出游人数获的空值')#获取点评数量信息try:str_remark=parent.find_elements_by_css_selector('div.list_change_two')except:str_remark=[]print('点评数量获得空值')#获取价格信息try:str_price=parent.find_elements_by_css_selector('span.list_sr_price')except:str_price=[]print('价格获取到空值')#添加主要数据try:rank=[]#以供应商的长度做位循环范围for i in range(len(list_retail)):box=[]#景点信息try:introduce=str_introduce[i].textexcept:introduce='无'#供应商try:retail=list_retail[i].textexcept:retail='无'#评分信息try:grade=str_grade[i].textexcept:grade='0分'#出行人数try:number=str_number[i].textexcept:number='0人'#点评人数try:remark=str_remark[i].textexcept:remark='0条'#价格try:price=str_price[i].textexcept:price='¥0元'try:#每一个 list_box_itemitem=list_box_item[i]#标签数据添加for j in item:box.append(j.text)#添加到rank列表except:box=[]rank.append([introduce,retail,grade,number,remark,price,box])bool_.MemoryCsv(rank,'携程旅游数据.csv','a')parent.find_element_by_css_selector('a.down').click()except:parent.find_element_by_css_selector('a.down').click()price('数据丢失了\n')6、定义函数抓取第一页def range_(begin,end,driver):#三个参数(开始 , 停止 , driver获取的信息)for i in range(begin,end):result(driver)#传入函数time.sleep(random.randint(20,25))#随机睡眠20-25秒print(f'第{i}页')#打印页数7、写入点击事件 , 自动打开网页查找携程def t(x,x1,x2):for index,i in enumerate(x[x1:x2]):driver=webdriver.Chrome()time.sleep(3)driver.get(';salecity=1 --tt-darkmode-color: #979797;">8、导入多线程使用的模块 , 写入多线程【Python打造自动化爬取携程旅游,太强了这个工具】import threadingt1=threading.Thread(target=t,args=(diqu,11,23))t2=threading.Thread(target=t,args=(diqu,23,31))t3=threading.Thread(target=t,args=(diqu,31,36))t1.start()t2.start()t3.start()9、pc是一个py文件里面是获取头部和存储的代码
Python打造自动化爬取携程旅游,太强了这个工具文章插图
import requestsimport requestsimport chardetimport randomimport csvfrom openpyxl import Workbookfrom pandas import DataFrame,Seriesclass data_bool():def __init__(self):passdef get_html(self, url):# 获取html的基本结构# 获取头部user_agent = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"]headers = {'User-Agent': random.choice(user_agent)}# 获取网址response = requests.get(url=url, headers=headers)# 获取编码encoding = chardet.detect(response.content)# 设置编码response.encoding ='utf-8'# 获取编码值return response# 存储csv格式 只是支持二维列表[[],[]],支持多线程def MemoryCsv(self, data: list, fileName: str, mode='w'):with open(fileName, mode=mode, encoding='utf-8', newline='')as f:csvfile = csv.writer(f)# 写入datafor each in data:csvfile.writerow(each)print(fileName, "存储成功")# 存储Excel 格式的函数 不支持多线程def MemoryExcel(self, data, fileName):wb = Workbook()sheet = wb.activefor each in data:sheet.append(each)wb.save(fileName)print(fileName, '存储成功')def Memonry_pandas_csv(self,data:list,fileName,mode='w'):DataFrame(data).to_csv(fileName,mode=mode,header=False,index=False)