【问题标题】:Scraping multiple web pages has the same results as the first page using Python使用 Python 抓取多个网页与第一页的结果相同
【发布时间】:2017-08-13 20:04:44
【问题描述】:

我的问题是关于我试图从 CME 集团网站获取产品名称。但是,为什么我在循环中更改了 URL,但代码却无法访问下一页?对此有何想法和意见?提前致谢。

from urllib.request import Request
from urllib.request import urlopen
from bs4 import BeautifulSoup

for i in range(1,6):
 url='http://www.cmegroup.com/trading/products/#pageNumber='+str(i)+'&sortAsc=false'

 CMEacess=Request(url,headers={'User-Agent':'Mozilla/5.0'})
 print(url)
 print('page: '+str(i))

 CMEpage=urlopen(CMEacess).read()
 CMEsoup=BeautifulSoup(CMEpage,'html.parser')

 namelist=CMEsoup.findAll('th',attrs={'class','cmeTableLeft'})

  for name in namelist:
    print(name.get_text())

  print('\n')

【问题讨论】:

  • url 中将# 替换为?
  • 成功了!你能详细说明一下吗?
  • ? 表示后面是查询字符串,因此参数pageNumbersortAsc 由服务器端脚本处理。

标签: python-3.x web-scraping beautifulsoup


【解决方案1】:

您可以尝试使用 requests 库而不是 urllib。我刚刚使用与您的代码类似的代码成功访问了第 5 页,但存在这种差异。

请注意,文字“D3”出现在第五页而不是第一页。

>>> import requests
>>> i = 5
>>> url='http://www.cmegroup.com/trading/products/#pageNumber='+str(i)+'&sortAsc=false'
>>> page = requests.get(url).content
>>> import bs4
>>> soup = bs4.BeautifulSoup(page, 'lxml')
>>> soup.find_all(string='D3')
['D3', 'D3']

【讨论】:

  • 感谢您的信息。但是为什么使用字符串 D3 与产品名称有关?我将代码更改为您的格式。但是在我更改数字后,它仍然最终给了我相同的结果。但不知何故,@t.m.adam 起作用了。
  • 根据我的经验,requests 库通常比 urllib 库更好。那是我的起始位置。这是一个测试,我是否可以使用 form 的 url,你必须得到第 5 页的请求。我只是选择了“D3”的存在作为页面中的标记。您的意思是说使用我的答案中的代码您仍然无法获得第 5 页的其他部分吗?
  • 抱歉回复晚了。不,我仍然无法通过您的格式循环浏览下一页。但它确实通过将 # 更改为 ?.
猜你喜欢
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
相关资源
最近更新 更多