开发者问题收集

Python-requests:无法从页面中抓取所有 html 代码

2016-04-04
1551

我正在尝试抓取 金融时报搜索 页面的内容。

使用 Requests ,我可以轻松 抓取 文章的标题和超链接。

我想获取下一页的超链接,但与文章的标题或超链接不同,我在 Requests 响应中找不到它。

from bs4 import BeautifulSoup
import requests

url = 'http://search.ft.com/search?q=SABMiller+PLC&t=all&rpp=100&fa=people%2Corganisations%2Cregions%2Csections%2Ctopics%2Ccategory%2Cbrand&s=-lastPublishDateTime&f=lastPublishDateTime[2000-01-01T00%3A00%3A00%2C2016-01-01T23%3A59%3A59]&curations=ARTICLES%2CBLOGS%2CVIDEOS%2CPODCASTS&highlight=true&p=1et'

response = requests.get(url, auth=(my login informations))
    
soup = BeautifulSoup(response.text, "lxml")

def get_titles_and_links():
    titles = soup.find_all('a')
    for ref in titles:
        if ref.get('title') and ref.get('onclick'):
            print ref.get('href')
            print ref.get('title')

get_titles_and_links() 函数为我提供了所有文章的标题和链接。

但是,对下一页使用类似的函数,我没有得到任何结果:

def get_next_page():
    next_page = soup.find_all("li", class_="page next")
    return next_page

或者:

def get_next_page():
    next_page = soup.find_all('li')
    for ref in next_page:
        if ref.get('page next'):
            print ref.get('page next')
1个回答

如果您可以在页面源代码中看到所需的链接,但无法通过 requestsurllib 获取它们。这可能意味着两件事。

  1. 您的逻辑有问题。 我们假设不是那样。
  2. 那么剩下的就是: Ajax ,您要查找的页面部分是在 document.onload 方法触发后由 javascript 加载的。因此,您无法获得一开始就不存在的东西。

我的解决方案(更像是建议)是

  1. 对网络请求进行逆向工程。 很难,但普遍适用 。我个人就是这么做的。您可能想要使用 re 模块。
  2. 找到 呈现 javascript 的东西。也就是说, 模拟网页浏览 。您可能想要查看 seleniumQt 等的 webdriver 组件。 这比较简单,但有点占用内存,并且与 1 相比消耗更多的网络资源
C Panda
2016-04-04