Python爬虫实战从零构建去哪儿网旅游信息采集工具1. 爬虫开发前的环境准备与避坑要点工欲善其事必先利其器。在开始爬取去哪儿网旅游信息前我们需要确保开发环境配置正确。许多新手常在这个阶段就踩坑导致后续问题频发。首先确认Python版本建议使用3.7及以上版本。过低的版本可能导致某些库不兼容。安装依赖库时新手常犯的错误是直接使用系统Python而非虚拟环境。这会导致不同项目间的库版本冲突# 创建虚拟环境推荐 python -m venv qunar_spider_env source qunar_spider_env/bin/activate # Linux/Mac qunar_spider_env\Scripts\activate # Windows关键库的安装也有讲究。requests库用于网络请求pyquery用于解析HTML这两个是核心依赖。常见安装错误包括使用pip install时未添加--upgrade参数导致安装旧版本网络问题导致安装失败却未察觉混淆了Python2和Python3的pip命令正确的安装方式应该是pip install --upgrade requests pyquery验证安装是否成功的小技巧import requests, pyquery print(requests.__version__, pyquery.__version__)2. 请求构造与反爬策略实战2.1 请求头设置的艺术新手最常遇到的第一个坑就是请求被拒绝。去哪儿网会对非常规访问进行识别合理的请求头设置至关重要。以下是一个经过实战检验的请求头模板headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Accept-Language: zh-CN,zh;q0.9, Accept-Encoding: gzip, deflate, br, Referer: https://piao.qunar.com/, Connection: keep-alive }关键点说明User-Agent不能太简单或包含Python字样Accept-Language对中文网站很重要Referer设置可以增加请求可信度2.2 URL编码处理技巧去哪儿网的搜索关键词在URL中会进行编码处理这是新手第二个常见坑点。比如广州一日游会被编码为%E5%B9%BF%E5%B7%9E%E4%B8%80%E6%97%A5%E6%B8%B8Python中可以使用urllib.parse进行自动编码from urllib.parse import quote keyword 广州一日游 encoded_keyword quote(keyword) print(encoded_keyword) # 输出编码后的字符串3. 页面解析与数据提取实战3.1 元素定位的精准方法使用pyquery解析页面时新手常遇到提取不到数据的问题。关键在于正确选择CSS选择器。以去哪儿网旅游产品为例from pyquery import PyQuery as pq doc pq(html_content) # 正确选择器示例 names doc(.sight_item .sight_item_caption a) # 项目名称 prices doc(.sight_item .sight_item_price em) # 价格 scores doc(.sight_item .product_star_level em) # 评分调试技巧在浏览器开发者工具中验证选择器先打印doc.html()确认是否获取到完整页面逐步缩小选择器范围3.2 数据清洗与格式化提取到的原始数据往往需要清洗。常见问题包括价格包含无关符号如¥评分是字符串需要转数字名称包含多余空格处理示例def clean_data(items): results [] for item in items: name item.find(a).text().strip() price float(item.find(.price em).text().replace(¥, )) score float(item.find(.score em).text()) results.append({name: name, price: price, score: score}) return results4. 分页爬取与数据存储4.1 分页逻辑实现去哪儿网的分页参数是page数字实现多页爬取需要注意base_url https://piao.qunar.com/daytrip/list.htm?keyword{}page{} for page in range(1, 6): # 爬取1-5页 url base_url.format(encoded_keyword, page) try: response requests.get(url, headersheaders, timeout10) # 处理响应... except Exception as e: print(f第{page}页请求失败:, str(e))注意事项添加适当的延迟避免被封如time.sleep(1)处理可能出现的网络异常记录已爬取的页码便于断点续爬4.2 数据存储方案比较存储方式优点缺点适用场景TXT文件简单直观查询困难小规模临时存储CSV结构清晰无数据类型中小规模数据SQLite查询方便需要SQL知识需要复杂查询MongoDB灵活扩展需要安装服务大规模非结构化数据推荐使用CSV作为新手入门选择import csv def save_to_csv(data, filename): with open(filename, w, newline, encodingutf-8) as f: writer csv.DictWriter(f, fieldnames[name, price, score]) writer.writeheader() writer.writerows(data)5. 项目进阶打造实用工具5.1 交互式查询功能将爬虫升级为交互式工具提升实用性def interactive_search(): keyword input(请输入旅游目的地如广州) pages int(input(请输入要爬取的页数1-10)) # 验证输入有效性 if not keyword or pages 1 or pages 10: print(输入无效) return print(f开始爬取{keyword}的{pages}页数据...) # 爬取逻辑...5.2 异常处理与日志记录健壮的工具需要完善的异常处理import logging logging.basicConfig( filenamequnar_spider.log, levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s ) try: # 爬取代码... except requests.exceptions.RequestException as e: logging.error(f请求异常: {str(e)}) except Exception as e: logging.error(f未知错误: {str(e)})6. 性能优化与反反爬策略6.1 请求优化技巧使用会话(Session)保持连接合理设置超时时间启用gzip压缩优化后的请求示例session requests.Session() session.headers.update(headers) response session.get(url, timeout(3.05, 10), allow_redirectsTrue)6.2 代理IP的使用当遇到IP封锁时可以考虑使用代理proxies { http: http://your_proxy:port, https: https://your_proxy:port } response requests.get(url, proxiesproxies)注意事项免费代理质量参差不齐需要自己实现代理池管理过度请求仍可能导致封禁7. 项目打包与分发7.1 使用PyInstaller打包将Python脚本打包为可执行文件pyinstaller --onefile --console qunar_spider.py常见问题解决打包后文件过大使用--exclude-module排除不必要模块运行时缺少依赖使用--add-data添加数据文件杀毒软件误报进行代码签名7.2 跨平台兼容性处理确保工具在不同系统都能运行import platform def get_save_path(): system platform.system() if system Windows: return os.path.expanduser(~/Documents) elif system Linux: return os.path.expanduser(~/) else: # Mac return os.path.expanduser(~/Desktop)
Python爬虫新手避坑指南:以爬取去哪儿网一日游信息为例,详解requests与pyquery实战
Python爬虫实战从零构建去哪儿网旅游信息采集工具1. 爬虫开发前的环境准备与避坑要点工欲善其事必先利其器。在开始爬取去哪儿网旅游信息前我们需要确保开发环境配置正确。许多新手常在这个阶段就踩坑导致后续问题频发。首先确认Python版本建议使用3.7及以上版本。过低的版本可能导致某些库不兼容。安装依赖库时新手常犯的错误是直接使用系统Python而非虚拟环境。这会导致不同项目间的库版本冲突# 创建虚拟环境推荐 python -m venv qunar_spider_env source qunar_spider_env/bin/activate # Linux/Mac qunar_spider_env\Scripts\activate # Windows关键库的安装也有讲究。requests库用于网络请求pyquery用于解析HTML这两个是核心依赖。常见安装错误包括使用pip install时未添加--upgrade参数导致安装旧版本网络问题导致安装失败却未察觉混淆了Python2和Python3的pip命令正确的安装方式应该是pip install --upgrade requests pyquery验证安装是否成功的小技巧import requests, pyquery print(requests.__version__, pyquery.__version__)2. 请求构造与反爬策略实战2.1 请求头设置的艺术新手最常遇到的第一个坑就是请求被拒绝。去哪儿网会对非常规访问进行识别合理的请求头设置至关重要。以下是一个经过实战检验的请求头模板headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Accept-Language: zh-CN,zh;q0.9, Accept-Encoding: gzip, deflate, br, Referer: https://piao.qunar.com/, Connection: keep-alive }关键点说明User-Agent不能太简单或包含Python字样Accept-Language对中文网站很重要Referer设置可以增加请求可信度2.2 URL编码处理技巧去哪儿网的搜索关键词在URL中会进行编码处理这是新手第二个常见坑点。比如广州一日游会被编码为%E5%B9%BF%E5%B7%9E%E4%B8%80%E6%97%A5%E6%B8%B8Python中可以使用urllib.parse进行自动编码from urllib.parse import quote keyword 广州一日游 encoded_keyword quote(keyword) print(encoded_keyword) # 输出编码后的字符串3. 页面解析与数据提取实战3.1 元素定位的精准方法使用pyquery解析页面时新手常遇到提取不到数据的问题。关键在于正确选择CSS选择器。以去哪儿网旅游产品为例from pyquery import PyQuery as pq doc pq(html_content) # 正确选择器示例 names doc(.sight_item .sight_item_caption a) # 项目名称 prices doc(.sight_item .sight_item_price em) # 价格 scores doc(.sight_item .product_star_level em) # 评分调试技巧在浏览器开发者工具中验证选择器先打印doc.html()确认是否获取到完整页面逐步缩小选择器范围3.2 数据清洗与格式化提取到的原始数据往往需要清洗。常见问题包括价格包含无关符号如¥评分是字符串需要转数字名称包含多余空格处理示例def clean_data(items): results [] for item in items: name item.find(a).text().strip() price float(item.find(.price em).text().replace(¥, )) score float(item.find(.score em).text()) results.append({name: name, price: price, score: score}) return results4. 分页爬取与数据存储4.1 分页逻辑实现去哪儿网的分页参数是page数字实现多页爬取需要注意base_url https://piao.qunar.com/daytrip/list.htm?keyword{}page{} for page in range(1, 6): # 爬取1-5页 url base_url.format(encoded_keyword, page) try: response requests.get(url, headersheaders, timeout10) # 处理响应... except Exception as e: print(f第{page}页请求失败:, str(e))注意事项添加适当的延迟避免被封如time.sleep(1)处理可能出现的网络异常记录已爬取的页码便于断点续爬4.2 数据存储方案比较存储方式优点缺点适用场景TXT文件简单直观查询困难小规模临时存储CSV结构清晰无数据类型中小规模数据SQLite查询方便需要SQL知识需要复杂查询MongoDB灵活扩展需要安装服务大规模非结构化数据推荐使用CSV作为新手入门选择import csv def save_to_csv(data, filename): with open(filename, w, newline, encodingutf-8) as f: writer csv.DictWriter(f, fieldnames[name, price, score]) writer.writeheader() writer.writerows(data)5. 项目进阶打造实用工具5.1 交互式查询功能将爬虫升级为交互式工具提升实用性def interactive_search(): keyword input(请输入旅游目的地如广州) pages int(input(请输入要爬取的页数1-10)) # 验证输入有效性 if not keyword or pages 1 or pages 10: print(输入无效) return print(f开始爬取{keyword}的{pages}页数据...) # 爬取逻辑...5.2 异常处理与日志记录健壮的工具需要完善的异常处理import logging logging.basicConfig( filenamequnar_spider.log, levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s ) try: # 爬取代码... except requests.exceptions.RequestException as e: logging.error(f请求异常: {str(e)}) except Exception as e: logging.error(f未知错误: {str(e)})6. 性能优化与反反爬策略6.1 请求优化技巧使用会话(Session)保持连接合理设置超时时间启用gzip压缩优化后的请求示例session requests.Session() session.headers.update(headers) response session.get(url, timeout(3.05, 10), allow_redirectsTrue)6.2 代理IP的使用当遇到IP封锁时可以考虑使用代理proxies { http: http://your_proxy:port, https: https://your_proxy:port } response requests.get(url, proxiesproxies)注意事项免费代理质量参差不齐需要自己实现代理池管理过度请求仍可能导致封禁7. 项目打包与分发7.1 使用PyInstaller打包将Python脚本打包为可执行文件pyinstaller --onefile --console qunar_spider.py常见问题解决打包后文件过大使用--exclude-module排除不必要模块运行时缺少依赖使用--add-data添加数据文件杀毒软件误报进行代码签名7.2 跨平台兼容性处理确保工具在不同系统都能运行import platform def get_save_path(): system platform.system() if system Windows: return os.path.expanduser(~/Documents) elif system Linux: return os.path.expanduser(~/) else: # Mac return os.path.expanduser(~/Desktop)