
pip install selenium pip install pymysql pip install datetime 确保chrome安装对应版本的驱动(将该驱动放在chrome安装路径下),用于控制chrome浏览器,并将路径添加到环境变量的Path变量中,如图所示!
#安装chrome驱动教程链接: https://blog.csdn.net/linglong_L/article/details/136283810 

如下图,景点的详细信息有:景点名称、景点等级(1-5A)、景点地址、开放时间(有两种,我们采用下面的)、联系电话、景点介绍、景点图片等内容

- 控制打开chrome,并访问指定查询所有景点路径
def __init__(self): options = Options() options.add_argument('--headless') service = Service() self.chrome = Chrome(service=service) self.chrome.get( 'https://huodong.ctrip.com/things-to-do/list?pagetype=city&citytype=dt&keyword=%E6%A2%85%E5%B7%9E&id=523&name=%E6%A2%85%E5%B7%9E&pshowcode=Ticket2&kwdfrom=srch&bookingtransactionid=1711160613361_6064') time.sleep(3) self.page = 1 self.headers = { 'cookie': 'suid=lh/P1+4RKuhAYg684ErS+g==; suid=lh/P1+4RKuhAYg684ErS+g==', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36', }
- 使用selenium的根据class定位元素方法,找到详细景点的href属性,即为该景点的访问路径
- 并通过page属性控制访问的页数
#获取景点请求路径 def get_url(self): while True: content = self.chrome.find_element(By.CLASS_NAME, "right-content-list").get_attribute('innerHTML') cons = re.findall(r'href="(.*?)" title="(.*?)"', content) for con in cons: self.detail_url = 'https:' + con[0] self.title = con[1] print(self.detail_url, self.title) self.get_detail() self.chrome.find_element(By.CLASS_NAME,'u_icon_enArrowforward').click() time.sleep(1) self.page += 1 if self.page == 120: break 
- 景点的详细信息有:景点名称、景点等级(1-5A)、景点地址、开放时间(有两种,我们采用下面的)、联系电话、景点介绍、景点图片等内容
- 通过正则表达式获取,详细代码如下:
- 并每次获取详细信息之后,将信息保存到mysql数据库中
def get_detail(self): detail_con = requests.get(self.detail_url, verify=False, headers=self.headers).text # time.sleep(2) '''使用正则获取信息''' self.title = ''.join(re.findall(r'(.*?)<', detail_con, re.DOTALL)) print('景点名称:'+self.title) #self.rank = ''.join(re.findall(r'rankText">(.*?)<', detail_con, re.DOTALL)) self.address = ''.join(re.findall(r'地址
(.*?)<', detail_con, re.DOTALL)) self.mobile = ''.join(re.findall(r'官方电话
(.*?)<', detail_con, re.DOTALL)) self.quality_grade= ''.join(re.findall(r'
(.*?) 'cookie': 'suid=lh/P1+4RKuhAYg684ErS+g==; suid=lh/P1+4RKuhAYg684ErS+g==', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36', } #获取景点请求路径 def get_url(self): while True: content = self.chrome.find_element(By.CLASS_NAME, "right-content-list").get_attribute('innerHTML') cons = re.findall(r'href="(.*?)" title="(.*?)"', content) for con in cons: self.detail_url = 'https:' + con[0] self.title = con[1] print(self.detail_url, self.title) self.get_detail() self.chrome.find_element(By.CLASS_NAME,'u_icon_enArrowforward').click() time.sleep(1) self.page += 1 if self.page == 120: break def get_detail(self): detail_con = requests.get(self.detail_url, verify=False, headers=self.headers).text # time.sleep(2) '''使用正则获取信息''' self.title = ''.join(re.findall(r'(.*?)<', detail_con, re.DOTALL)) print('景点名称:'+self.title) #self.rank = ''.join(re.findall(r'rankText">(.*?)<', detail_con, re.DOTALL)) self.address = ''.join(re.findall(r'地址
(.*?)<', detail_con, re.DOTALL)) self.mobile = ''.join(re.findall(r'官方电话
(.*?)<', detail_con, re.DOTALL)) self.quality_grade= ''.join(re.findall(r'
(.*?)id}?onlyContent=true&onlyShelf=true' ticket_res = requests.get(ticket_url, verify=False, headers=self.headers).text # time.sleep(1) ticket_ret = etree.HTML(ticket_res) ticket = ticket_ret.xpath('//table[@class="ticket-table"]//div[@class="ttd-fs-18"]/text()') price = ticket_ret.xpath( '//table[@class="ticket-table"]//td[@class="td-price"]//strong[@class="ttd-fs-24"]/text()') print(ticket) print(price) '''拿到的列表里可能存在不确定数量的空值,所以这里用while True把空值全部删除,这样才可以确保门票种类与价格正确对应上''' while True: try: ticket.remove(' ') except: break while True: try: price.remove(' ') except: break ''' 这里多一个if判断是因为我发现有些详情页即便拿到门票信息并剔除掉空值之后仍然存在无法对应的问题,原因是网页规则有变动, 所以一旦出现这种情况需要使用新的匹配规则,否则会数据会出错(不会报错,但信息对应会错误) ''' if len(ticket) != len(price): ticket = ticket_ret.xpath( '//table[@class="ticket-table"]/tbody[@class="tkt-bg-gray"]//a[@class="ticket-title "]/text()') price = ticket_ret.xpath('//table[@class="ticket-table"]//strong[@class="ttd-fs-24"]/text()') while True: try: ticket.remove(' ') except: break while True: try: price.remove(' ') except: break print(ticket) print(price) ticket_dict = dict(zip(ticket, price)) print(ticket_dict) if __name__ == '__main__': jy_jd = Jy_jd() jy_jd.get_url() 3.6效果图


上一篇:【亲测有效】Win11(23H2)重启后任务栏Copilot图标恢复
下一篇:正确解决selenium.common.exceptions.SessionNotCreatedException: Message: session not created异常的有效解决方法
相关内容
热门资讯
技术分享!多乐辅助下载,南丰数...
技术分享!多乐辅助下载,南丰数刀脚本-原来真的是有辅助教程(有挂细节)小薇(辅助器软件下载)致您一封...
记者揭秘!微信边锋辅助挂件,战...
记者揭秘!微信边锋辅助挂件,战皇大厅辅助那个可靠-果然真的有辅助教程(确实有挂)1、实时微信边锋辅助...
重大通报!哈局八张模拟器,新广...
重大通报!哈局八张模拟器,新广西老友辅助-切实有辅助教程(真实有挂)1、让任何用户在无需哈局八张模拟...
揭秘攻略!茶馆游戏辅助,填大坑...
揭秘攻略!茶馆游戏辅助,填大坑辅助器视频-都是是有辅助app(有挂细节)1、首先打开填大坑辅助器视频...
详细说明!雀友会广东潮汕麻雀,...
详细说明!雀友会广东潮汕麻雀,四川徒有辅助软件-原来是真的有辅助神器(详细教程)1、进入到雀友会广东...
记者揭秘!吉安中至小程序,微乐...
记者揭秘!吉安中至小程序,微乐陕西小程序破解器-切实是有辅助教程(有挂教程)1、许多玩家不知道微乐陕...
玩家攻略!吉祥填大坑小程序辅助...
玩家攻略!吉祥填大坑小程序辅助,心悦填大坑辅助-果然真的有辅助教程(有挂助手)1、全新机制【吉祥填大...
盘点一款!河南微乐麻将小程序辅...
盘点一款!河南微乐麻将小程序辅助器,友友联盟有辅助吗-确实是有辅助攻略(真的有挂)1、河南微乐麻将小...
信息共享!手机游戏辅助脚本工具...
信息共享!手机游戏辅助脚本工具,西兵互娱辅助插件app-一贯真的是有辅助教程(有挂解惑)一、手机游戏...
关于!欢乐情怀怎么开挂,指尖四...
关于!欢乐情怀怎么开挂,指尖四川辅助脚本视频-其实存在有辅助工具(有挂方法)1、欢乐情怀怎么开挂透视...