【问题标题】:Issue scraping dynamic content with mechanize使用机械化问题抓取动态内容
【发布时间】:2016-03-18 16:58:28
【问题描述】:

我正在尝试在流媒体视频网站上抓取搜索结果。搜索结果是动态加载的,我认为这就是我没有得到正确结果的原因。在我提交表单并取回我的 results.html 后,它始终是没有完成搜索的主页......任何帮助都会很棒,如果 Mechanize 根本没有这个功能,也许有人可以指出我的正确之处方向?提前致谢。

import mechanize

br = mechanize.Browser()

br.set_handle_robots(False)
br.set_handle_equiv(False)
br.addheaders = [('User-agent', 'Mozilla')]

br.open('http://movietv.to')

br.select_form(nr=0)
br.form.set_all_readonly(False)
br.form.set_value("Godfather", nr=0)

resp = br.submit()

with open('results.html', 'w') as f:
    f.write(resp.read())

【问题讨论】:

    标签: python web-scraping mechanize dynamic-content


    【解决方案1】:

    Mechanize 并不是这个特定“动态”站点的理想选择。最简单的高级方法是通过 selenium 实现浏览器自动化。

    虽然我使用requestsBeautifulSoup HTML 解析器使它工作。实现这一目标的关键是 1) 电影通过 XHR 请求加载到 http://movietv.to/index/loadmovies 和 2) 此请求需要发送 token - 它可以从主页上的 script 元素中提取。

    完整的工作实现:

    import re
    
    import requests
    from bs4 import BeautifulSoup
    
    
    search = "Godfather"
    
    token_pattern = re.compile(r'var token_key="(.*?)";')
    with requests.Session() as session:  # maintaining web-scraping session
        session.headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36"}
    
        # extract token
        response = session.get("http://movietv.to/")
        soup = BeautifulSoup(response.content, "html.parser")
    
        script = soup.find("script", text=token_pattern).get_text()
        match = token_pattern.search(script)
        if not match:
            raise ValueError("Cannot find token!")
    
        token = match.group(1)
    
        # search for the movies
        response = session.post("http://movietv.to/index/loadmovies", data={
            "loadmovies": "showData",
            "page": "1",
            "abc": "All",
            "genres": "",
            "sortby": "Popularity",
            "quality": "All",
            "type": "movie",
            "q": search,
            "token": token
        })
    
        soup = BeautifulSoup(response.content, "html.parser")
    
        for movie in soup.select("div.item"):
            title = movie.find("h2", class_="movie-title")
    
            print(title.get_text())
    

    打印找到的电影:

    The Godfather
    The Godfather: Part II
    The Godfather: Part III
    

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多