使用Python请求访问动态生成的网站内容

时间:2016-10-11 14:56:58

标签: python json web-scraping python-requests

我尝试使用Python(BeautifulSoup)从少数网站收集数据。但是,有时访问搜索结果很困难,例如:

import requests
from bs4 import BeautifulSoup

url1 = 'https://auto.ria.com/legkovie/city/vinnica/?page=1'
url2= 'https://auto.ria.com/search/?top=11&category_id=1&state[0]=1'

def get_value(url):
    r = requests.get(url, headers = {'Accept-Encoding' : 'deflate'})
    print("Response Time: {}".format(r.elapsed.total_seconds()))

    soup =  BeautifulSoup(r.text, 'lxml')
    data = soup.find('span', attrs = {'id' : 'resultsCount'}).find('strong')
    print('{} \n'.format(data))

get_value(url1)
get_value(url2)

输出结果为:

Response Time: 5.4943
<strong class="count">5 310</strong> 

Response Time: 0.174867
<strong class="count">0</strong>  

虽然在url2的情况下,浏览器中显示的数字是338。 我想在某些json中可以找到搜索结果,但是如何使用请求来访问它?

2 个答案:

答案 0 :(得分:0)

我建议缩小汤品的细节,看看那里有什么。您可以尝试使用findAll而不是查找和打印结果。您也可以尝试剥离最终调用以查找(对于强标记)并打印结果。一旦您调查较大的对象,您可能会看到正在发生的事情。它可能是url2标记不同,你必须调整你的功能以适应。

答案 1 :(得分:0)

您的代码运行正常,url2返回预期的结果。通过查看chrome的页面来源:
<span id="resultsCount" class="hide">Найдено <strong class="count">0</strong> объявлений</span>

这是你试图用美丽的汤找到的标签。 chrome中显示的数字和程序的输出是相同的!

<strong class="count">0</strong> 

此外,搜索结果不会在json中返回。如果您检查响应标题:

Content-Type: text/html

也许您希望响应包含整个标记?如果是这种情况,请尝试:

data = soup.find('span', attrs = {'id' : 'resultsCount'})