首页 > 解决方案 > 如何使用 Python 3.7.4 和 beautifulsoup4 抓取 Cyber​​ix3D 网站 (http://www.3dgamemaker.com) 上游戏的所有 URL 链接?

问题描述

我正在尝试调整https://stackoverflow.com/a/46135607/9637147中的代码以抓取 Cyber​​ix3D 网站上游戏的所有 URL 链接。但是当我运行我的代码时它没有这样做,给我一个 403 Forbidden 错误。如何修复我的代码?

这样我就可以更快地将 Cyber​​ix3D 网站上的所有游戏存档到 Wayback Machine ( http://web.archive.org/ ) 上。我尝试在循环useragent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) Gecko/20170101 Firefox/67.0".encode("utf-8")的第一行之前添加该行,然后替换为允许代码使用该用户代理,但即便如此,我仍然收到 403 Forbidden 错误。forhtml=urlopen(url)html=urlopen(url,useragent)

from urllib.request import urlopen
from bs4 import BeautifulSoup
file="Cyberix3D games.csv"
f=open(file,"w")
Headers="Link\n"
f.write(Headers)
for page in range(1,410):
    url="http://www.gamemaker3d.com/games#page={}&orderBy=Recent".format(page)
    html=urlopen(url)
    soup=BeautifulSoup(html,"html.parser")
    Title=soup.find_all("a",{"href":"views-field-nothing"})
    for i in Title:
        try:
            link=i.find("a",{"href":"/player?pid="}).get_text()
            print(link)
            f.write("{}".format(link))
        except:AttributeError
f.close()

我希望将上述链接打印在 Python 3.7.4 Shell 中,并添加到名为 Cyber​​ix3D games.csv 的 CSV 文件中,但是我在 Python 3.7.4 Shell 中得到urllib.error.HTTPError: HTTP Error 403: Forbidden了一堆File "C:\Users\Niall Ward\AppData\Local\Programs\Python\Python37-32\lib\urllib\request.py", line x, in ys 以及而是一个名为 Cyber​​ix3D games.csv 的空 CSV 文件。

标签: pythonpython-3.xbeautifulsoup

解决方案


一些网站阻止不是来自浏览器的连接——反僵尸程序、垃圾邮件等。有许多不同的解决方案可以工作:模拟浏览器来获取,比如说,代理一个合法的响应;您可以在请求中添加标头;等等

运行您的代码后,我尝试了一个比我上面提到的更简单的解决方案:而不是使用from urllib.request import urlopen我使用过import requests的并且这样做我不得不改变

# Start by importing requests
import requests
from bs4 import BeautifulSoup
file="Cyberix3D games.csv"
f=open(file,"w")
Headers="Link\n"
f.write(Headers)
for page in range(1,410):
    url="http://www.gamemaker3d.com/games#page={}&orderBy=Recent".format(page)
    print(url)
    # Here we use requests to get the page and its content. 
    # Note that variables names don't really matter here.
    gamemaker_link=requests.get(url)
    # Used gamemnaker_link.contetnt and lxml as my parser.
    gamemaker_content=BeautifulSoup(gamemaker_link.content, "lxml")

    # etc etc etc

要求

如果还没有,则需要安装(我使用了 pip):

  1. 要求
  2. lxml

笔记

我不确定处理页面元素是否有任何变化,但这至少应该有助于访问页面。

希望能帮助到你。

快乐编码!


推荐阅读