yvhcel 2024-05-01 12:12 采纳率: 0%
浏览 12

#python爬虫问题#

工作中需要获取各招标网站的信息,尝试用python进行抓取。
过程中,遇到1个招标网站(https://ec.chng.com.cn/ecmall/more.do?type=103)抓取不了,试了用requests请求和Selenium模拟浏览器操作。求帮忙,谢谢

requests请求:

import requests
from lxml import etree

# 爬取函数
def get_zb_info(url,header,pama):
    response = requests.get(url=url, headers=header, params=pama)
    response.encoding = 'utf-8'
    wb_data = response.text
    print('抓取到以下内容:', wb_data)

    # 开始数据解析。。。

if __name__ == '__main__':
    url = 'https://ec.chng.com.cn/ecmall/more.do'
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 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.7',
        'Accept-Encoding': 'gzip, deflate, br, zstd',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Cookie': 'S6J51OuUjLieO=5AjWEiOna9Nm3YKgPv7rcuukAiPK8d8Xh1p..nidvUaptoBbPw.whSm2JGJQq.xgMMJH_Ysv9oJnwB.YKOuKiLA; S6J51OuUjLieP=cpu.dPoowrPlOqm3LaFqcgf4QPxNoMp0OqfGvHpahI1KoiImS7cEs3EP6tZpIppclExhsnhNKyZ51Vg3aRbpw1295vGOn0UIOCnz1Ok9tpX2VIDar9byqvoAeU56pyD1pSZufzyTThSS6Mr7IHSs4b2ab_CTkDB.cmsVLWJE0TqRrWOOsxHdQ.a6Pjs6NjlOmST.99_GdzxLZW1nM2GlnkrzZQVvl6yryzK1GS43r67',
        # Cookie的值是在真实浏览器访问“https://ec.chng.com.cn/ecmall/more.do?type=103”,然后按F12,从请求头里复制的
        # 粘贴到此后可正确抓取到招标信息,但仅短暂有效。
    }

    pama = {
        'type': 103
    }
    get_zb_info(url, header, pama)

Selenium模拟浏览器操作:

import time,os
#引入selenium库中的webdriver模块,实现对网页的操作
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys  # 模拟键盘输入


url = u'https://ec.chng.com.cn/ecmall/more.do?type=103'
#url = u'https://bot.sannysoft.com/'

#创建浏览器对象-谷歌浏览器
options = webdriver.ChromeOptions()
#options = webdriver.EdgeOptions()

driver = webdriver.Edge(options=options)
# 隐藏浏览器指纹
#'''
with open('stealth.min.js') as f:
   js = f.read()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": js
})
#'''


#防止网站检测selenium的webdriver  undefined   false
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
   "source": """
        Object.defineProperty(navigator, 'webdriver', {
            get: () => false
        })
    """
})

driver.implicitly_wait(3)

#打开网页
print('准备打开网址')
driver.get(url)
print(f'已打开网址:{url}')

time.sleep(2)
print(f'当前页面title:{driver.title}')
print(f'当前页内容:{str(driver.page_source)}')

# 关闭当前浏览器页面、退出
driver.close()
driver.quit()

Selenium模拟浏览器操作,一直显示空白网页:

img

  • 写回答

5条回答 默认 最新

  • 专家-皆知 2024-05-01 12:12
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    针对您遇到的问题,这个网站可能使用了一些动态加载技术,比如AJAX,或者对请求有更严格的检查,导致直接使用requests或者简单的Selenium配置无法获取数据。此外,网站也可能对爬虫行为进行了检测。下面我会提供一种可能的解决方案,主要集中在优化Selenium的使用上,确保它能更好地模仿正常用户的行为。

    解决方案:优化Selenium配置与等待策略

    1. 隐式等待与显式等待结合:隐式等待可以帮助在查找元素时有一定的时间余地,而显式等待可以针对特定条件等待,直到条件满足或达到最大等待时间。

    2. 模拟滚动加载:如果数据是通过滚动加载的,我们需要模拟用户的滚动行为来触发数据加载。

    3. 处理Cookies:直接注入Cookies可能因为网站的会话管理机制而失效,但可以通过登录流程解决或检查是否有长期有效的API访问方式。

    修改后的Selenium代码示例

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    import time
    
    url = 'https://ec.chng.com.cn/ecmall/more.do?type=103'
    
    options = webdriver.EdgeOptions()
    # 隐身模式可能有助于绕过一些检测
    options.add_argument('incognito')
    # 如果需要,这里可以添加更多配置来模拟真实浏览器行为
    
    driver = webdriver.Edge(options=options)
    
    # 加载页面后,等待页面元素加载
    driver.get(url)
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'body')))
    
    # 模拟滚动加载(假设数据是通过滚动加载的)
    last_height = driver.execute_script("return document.body.scrollHeight")
    while True:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(2)  # 给服务器时间响应
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:
            break
        last_height = new_height
    
    # 现在页面应该已经加载了所有通过滚动加载的数据
    print(f'当前页内容:{driver.page_source}')
    
    # 之后可以根据页面结构提取数据
    
    # 关闭浏览器
    driver.quit()
    

    请注意,实际应用中可能需要根据网站的具体实现调整策略。例如,如果数据加载依赖于JavaScript事件而非滚动,您可能需要监听或触发那些特定事件。此外,考虑到隐私和法律因素,确保您的爬虫行为符合网站的robots.txt规则和服务条款。如果网站提供了API,使用API通常是更稳定和合法的选择。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月1日

悬赏问题

  • ¥15 数据库原理及应用上机练习题
  • ¥15 征集Python提取PDF文字属性的代码
  • ¥15 如何联系真正的开发者而非公司
  • ¥15 有偿求苍穹外卖环境配置
  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?