wshrk123 2019-05-10 00:36 采纳率: 0%
浏览 241

爬虫时光网出现load104问题

  • * 图片说明图片说明图片说明

爬虫新手,爬取时光网热映电影想要爬取该电影的上映电影时间,价格,影院,但是不论是直接用request爬取还是PhantomJS爬取,都出现图片中问题,即load104,求大神帮帮忙

爬取网址:http://theater.mtime.com/China_Jiangsu_Province_Nanjing/movie/235701/
第一个图是我爬下来的内容
代码如下

import requests
import codecs
from bs4 import BeautifulSoup
from requests.exceptions import RequestException
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'accept-encoding': 'gzip, deflate',
'accept-language': 'zh-CN,zh;q=0.9',
'referer': 'http://theater.mtime.com/China_Jiangsu_Province_Nanjing/',
'Host': 'theater.mtime.com',
}

def get_one_page(url,headers):
try:
response = requests.get(url,headers=headers)
if response.status_code == 200:
return response.text
return None
except RequestException:
return None

def get_detail_onemovie(movid,date,headers):
url='http://theater.mtime.com/China_Jiangsu_Province_Nanjing/movie/'+movid+'/'+date+'/'
print(url)
html=get_one_page(url,headers)
soup = BeautifulSoup(html, 'lxml')
with codecs.open('one_page.txt', 'w', encoding='utf-8') as f:
f.write(soup.prettify())

get_detail_onemovie('235701','20190510',headers)

下面是模拟浏览器的代码

from selenium import webdriver
import codecs
driver = webdriver.PhantomJS()
driver.get('http://theater.mtime.com/China_Jiangsu_Province_Nanjing/movie/256175/20190509/')
with codecs.open('one_page.txt', 'w', encoding='utf-8') as f:
f.write(driver.page_source)
driver.close()

  • 写回答

1条回答 默认 最新

  • 一只小爪磕 新星创作者: 前端开发技术领域 2024-05-26 16:00
    关注

    本答案由爪磕协同GPT-4o回答,希望对您有所帮助 解决问题望采纳!


    在爬取时光网时遇到 load104 问题,通常是由于网页内容未能正确加载或加载内容需要JavaScript动态渲染导致的。这种情况下,传统的静态HTML请求可能无法获取到你需要的内容。

    为了解决这个问题,你可以使用以下几种方法:

    1. 使用无头浏览器

    无头浏览器如 Puppeteer 或 Selenium 可以执行 JavaScript 并等待页面完全加载,从而获取动态内容。

    使用 Puppeteer

    1. 安装 Puppeteer:

      npm install puppeteer
      
    2. 使用 Puppeteer 爬取页面:

      const puppeteer = require('puppeteer');
      
      (async () => {
          const browser = await puppeteer.launch();
          const page = await browser.newPage();
          await page.goto('https://www.example.com'); // 替换为实际的时光网地址
      
          // 等待特定的元素加载完成
          await page.waitForSelector('#cinemaListRegion');
      
          // 获取页面内容
          const content = await page.content();
      
          console.log(content);
      
          await browser.close();
      })();
      

    2. 使用 Selenium

    Selenium 也可以用于控制浏览器并获取动态加载的内容。

    1. 安装 Selenium 和浏览器驱动(如 ChromeDriver):

      pip install selenium
      
    2. 使用 Selenium 爬取页面:

      from selenium import webdriver
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      
      # 设置 WebDriver 路径
      driver = webdriver.Chrome(executable_path='/path/to/chromedriver')
      
      # 打开页面
      driver.get('https://www.example.com')  # 替换为实际的时光网地址
      
      try:
          # 等待特定元素加载完成
          element = WebDriverWait(driver, 10).until(
              EC.presence_of_element_located((By.ID, 'cinemaListRegion'))
          )
          # 获取页面内容
          html_content = driver.page_source
          print(html_content)
      finally:
          driver.quit()
      

    3. 使用请求库(如 requests)与 JavaScript 渲染的结合

    如果你知道页面数据是通过某个 API 请求加载的,可以直接请求该 API 接口而不是整个页面。

    1. 使用 requests 库请求数据:

      import requests
      
      url = 'https://www.example.com/api/data'  # 替换为实际的 API 地址
      headers = {
          'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
      }
      
      response = requests.get(url, headers=headers)
      data = response.json()
      
      print(data)
      

    4. 检查网络请求

    使用浏览器的开发者工具查看网络请求,查找加载数据的 API 请求地址,并直接请求这些 API 而不是整个页面。

    总结

    通过使用无头浏览器(如 Puppeteer 或 Selenium)可以有效地处理 JavaScript 动态渲染的内容,确保你能够获取到完整的网页数据。如果发现数据是通过特定的 API 加载的,直接请求 API 也是一种高效的方法。

    评论

报告相同问题?