爬虫 — 大众点评商户信息的爬取和文字反爬

该博客介绍了使用Python进行网络爬虫,从大众点评网站抓取海口地区商铺名称和ID,并尝试通过API接口获取详细信息。由于API反爬限制,作者转向解析详情页以获取地址和电话。同时,博客提到了文字反解析技术,用于处理详情页中包含的特殊字符。最后,数据被存储为Excel文件并进行了预处理。

信息爬取

import requests
from lxml import etree
import time
import json
import pandas as pd

# 获取商户名称和ID
result = []
for i in range(1,51):
    print(i)
    url = r'http://www.dianping.com/haikou/ch10/p{page}'.format(page=i)
    headers = {
   
   
    "Cache-Control": "max-age=0",
    "Upgrade-Insecure-Requests": "1",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Cookie": "navCtgScroll=1; _lxsdk_cuid=17a1dc4c18e1d-0a7ec7a9c3737a-45410429-240000-17a1dc4c18fc8; _hc.v=028ffd92-97cc-7fa9-e64f-74408f8c9421.1623997072; s_ViewType=10; aburl=1; _dp.ac.v=771d9bb8-a7f2-4d76-8bf3-a13639ae2217; ctu=6f9ef9a624f2bb02349e3412ec41e048b9d1e204d4b5ace5828e7fef8adc319b; uuid=FABC533C9DFB7697EA69101F0E9BA3433B4C21FA22195EF9294F2EB256C50DBD; iuuid=FABC533C9DFB7697EA69101F0E9BA3433B4C21FA22195EF9294F2EB256C50DBD; _lxsdk=FABC533C9DFB7697EA69101F0E9BA3433B4C21FA22195EF9294F2EB256C50DBD; _ga=GA1.2.2029444719.1624263718; ua=dpuser_8723703376; fspop=test; cy=23; cye=haikou; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; Hm_lvt_602b80cf8079ae6591966cc70a3940e7=1638601245; dper=92b45344e065dccd73f49a5f35c3199caf0700028fb482052cbdc6dd828e7788da6496adb22783938714abee41ab3b737cb23486307598f8c7321ca1afabdc689d54c6084be55dd55ade40bc9d3270e87f91e3e9a0e3df9456baff3b84e57454; ll=7fd06e815b796be3df069dec7836c3df; uamo=18508921021; dplet=51f7f8eb52ef4c18661bd3a1955e648f; Hm_lpvt_602b80cf8079ae6591966cc70a3940e7=1638603180; _lxsdk_s=17d843ebc0f-d5-044-030%7C%7C193"}
    response = requests.get(url=url,headers=headers)
    html = etree.HTML(response.text)
    shop_id = html.xpath('//*[@id="shop-all-list"]//ul//li//a[@data-click-name="shop_title_click"]/@data-shopid')
    shop_name = html.xpath('//*[@id="shop-all-list"]//ul//li//a[@data-click-name="shop_title_click"]/@title')
    for i in zip(shop_id,shop_name):
        info={
   
   }
        info['店名'] = i[1
爬取大众点评平台的商家信息涉及多个技术环节,包括解析网页结构、处理机制以及数据存储等。以下是详细的实现方法注意事项: ### 1. 技术选型与工具 为了高效地获取数据,可以选择以下技术组合: - **Selenium**:用于模拟浏览器行为,能够动态加载网页内容,适用于 JavaScript 渲染的页面。 - **Requests + BeautifulSoup**:适用于静态页面数据抓取,代码实现简单,适合小规模数据采集任务[^4]。 - **Scrapy**:一个功能强大的爬虫框架,支持异步请求、数据提取规则定义等功能,适合大规模、长期运行的数据采集项目[^2]。 ### 2. 数据目标与字段 根据需求,可以提取以下商家相关信息: - 店铺名称 - 评分 - 评论数量 - 人均消费 - 地址 - 分类(如餐饮、美发等) - 团购详情(如原价、团购价、销量等)[^4] ### 3. 网页分析与数据提取 使用 Selenium 或 Requests 获取网页 HTML 后,通过 XPath 或正则表达式定位所需数据。例如,店铺名称可能存在于某个具有特定 class 的 `<div>` 标签中,而评分可能是嵌套在 `<span>` 元素内的数字值。对于复杂的网站结构,建议使用开发者工具(如 Chrome DevTools)进行元素审查以确定目标数据的路径。 ### 4. 策略 大众点评等大型网站通常具备较强的机制,例如 IP 封锁、验证码验证、User-Agent 检测等。为应对这些挑战,可以采取以下措施: - 使用代理 IP 池轮换 IP 地址,防止单一 IP 被封禁。 - 设置合理的请求间隔,避免短时间内大量请求触发风控系统。 - 随机生成 User-Agent 字符串,并定期更换,模拟真实用户访问。 - 如果遇到验证码,可集成第三方 OCR 识别服务或使用打码平台解决。 ### 5. 数据存储方案 采集到的数据可以通过多种方式进行持久化存储: - **CSV 文件**:适合小型项目,便于 Excel 或 Python Pandas 进行后续分析。 - **MySQL / PostgreSQL**:关系型数据库支持复杂查询与数据关联操作,适合长期维护的数据集。 - **MongoDB**:非关系型数据库,适用于灵活结构的数据存储,无需预定义表结构。 ### 6. 示例代码 以下是一个基于 Selenium 的简化示例,展示如何获取店铺名称评分: ```python from selenium import webdriver from selenium.webdriver.common.by import By import time # 初始化浏览器驱动 driver = webdriver.Chrome() # 访问目标 URL url = "https://www.dianping.com/search/keyword/1/0_北京美食" driver.get(url) # 等待页面加载完成 time.sleep(5) # 提取店铺名称评分 shops = driver.find_elements(By.CLASS_NAME, "shop-name") ratings = driver.find_elements(By.CLASS_NAME, "rating-stars") for shop, rating in zip(shops, ratings): print(f"店铺名称: {shop.text}, 评分: {rating.get_attribute('title')}") # 关闭浏览器 driver.quit() ``` ### 7. 异常处理与日志记录 为了保证爬虫系统的健壮性,应加入异常处理逻辑,包括网络超时重试、页面解析失败检测等。同时,建议使用 logging 模块记录程序运行状态,以便后期排查问题。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值