为什么 request.get() 返回错误的页面内容?
Why request.get() returning wrong page content?
我一直在尝试使用 BeautifulSoup 解析网页。当我导入 urlopen fromm urllib.request 并打开 https://pbejobbers.com 它 returns 而不是网页本身:
<html>
<body>
<script src="/aes.min.js" type="text/javascript"></script>
<script>
function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[
0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("0181cdf0013bf7
0f89e91be7ef0d00c2"),b=toNumbers("a168ceeade18bccc1cdd77af68ef1753"),c=toNumbers("200a38f39b6a3fe3564acf9bd88c25da");document.cookie="OCXS="+toHex(slowAES.decryp
t(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";document.location.href="http://pbejobbers.com/product/search?search=USC4215&81e93addddb02a10cd0652f09
370ae96=1";
</script>
</body>
</html>
我有一组 UPC 代码,可用于查找我正在寻找的产品。我将数组传递给一个函数并解析 html 以找到必要的标签,但我可以得到实际的 html。
这是我的代码:
from urllib.request import urlopen
from bs4 import BeautifulSoup
upc_codes = ['USC4215', 'USC4225', 'USC12050']
def retrunh1(upc):
html = urlopen('https://pbejobbers.com/product/search?search={}'.format(upc))
soup = BeautifulSoup(html, 'html.parser')
print(soup.prettify())
if __name__=='__main__':
for upc in upc_codes:
retrunh1(upc)
我认为问题出在请求函数上。我将其隔离以查看它是什么 return 并且当我这样做时我得到与上面相同的 html :
import requests
r = requests.get('https://pbejobbers.com')
print(r.text)
我对网络解析还很陌生,我需要一些关于如何解决这个问题的建议。
谢谢
javascript 可能会在浏览器开始执行时动态填充页面的 html 部分,因此 urllib
无法下载完整的源代码。
您的 python 脚本需要使用像 Selenium 这样的无头浏览器框架来像浏览器一样加载页面,然后提取您需要的内容。
正如其他人提到的,请不要违反他们的服务条款,尤其是如果数据是 private/behind 登录页面
当我手动搜索USC4215
时,url是https://pbejobbers.com/product/search?search=USC4215&_rand=0.35863039778309025
该网站正在附加一个随机密码 _rand
以防止机器人网络抓取。您需要使用有效的随机密钥发出请求才能收到响应。
其实这个秘密通常是通过一组cookies生成的,如果你点击Inspect ==> Network ==> Doc
和Ctrl + R
刷新网站,你会发现更多关于网络流量的信息,因为你再做一个request,你的http请求和响应内容是什么。
请试试这个。
Python代码:
from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests
import re
upc_codes = ['USC4215', 'USC4225', 'USC12050']
def retrunh1(upc):
payload = {'search': upc }
r = requests.get('https://pbejobbers.com/product', params=payload)
matches = re.search(r'document\.location\.href=\"(:?.*)=1\";', str(r.text), re.M|re.S)
url = matches[1]
response = requests.get(url)
for resp in response.history:
r = requests.post(resp.headers['Location'])
soup = BeautifulSoup(r.content, 'html.parser')
print(soup.prettify())
if __name__=='__main__':
for upc in upc_codes:
retrunh1(upc)
输出:
<div class="page-area-container">
<div class=" middlebar">
<div class=" middlebar__left">
<a class=" logo" href="/">
<img alt="PBE Jobbers" class=" logo-img" src="/bundles/pjfrontend/pbejobbers/images/logo/pbe-logo.svg?version=9d4c5d60"/>
</a>
</div>
...
</div>
...
</div>
我一直在尝试使用 BeautifulSoup 解析网页。当我导入 urlopen fromm urllib.request 并打开 https://pbejobbers.com 它 returns 而不是网页本身:
<html>
<body>
<script src="/aes.min.js" type="text/javascript"></script>
<script>
function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[
0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("0181cdf0013bf7
0f89e91be7ef0d00c2"),b=toNumbers("a168ceeade18bccc1cdd77af68ef1753"),c=toNumbers("200a38f39b6a3fe3564acf9bd88c25da");document.cookie="OCXS="+toHex(slowAES.decryp
t(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";document.location.href="http://pbejobbers.com/product/search?search=USC4215&81e93addddb02a10cd0652f09
370ae96=1";
</script>
</body>
</html>
我有一组 UPC 代码,可用于查找我正在寻找的产品。我将数组传递给一个函数并解析 html 以找到必要的标签,但我可以得到实际的 html。 这是我的代码:
from urllib.request import urlopen
from bs4 import BeautifulSoup
upc_codes = ['USC4215', 'USC4225', 'USC12050']
def retrunh1(upc):
html = urlopen('https://pbejobbers.com/product/search?search={}'.format(upc))
soup = BeautifulSoup(html, 'html.parser')
print(soup.prettify())
if __name__=='__main__':
for upc in upc_codes:
retrunh1(upc)
我认为问题出在请求函数上。我将其隔离以查看它是什么 return 并且当我这样做时我得到与上面相同的 html :
import requests
r = requests.get('https://pbejobbers.com')
print(r.text)
我对网络解析还很陌生,我需要一些关于如何解决这个问题的建议。 谢谢
javascript 可能会在浏览器开始执行时动态填充页面的 html 部分,因此 urllib
无法下载完整的源代码。
您的 python 脚本需要使用像 Selenium 这样的无头浏览器框架来像浏览器一样加载页面,然后提取您需要的内容。
正如其他人提到的,请不要违反他们的服务条款,尤其是如果数据是 private/behind 登录页面
当我手动搜索USC4215
时,url是https://pbejobbers.com/product/search?search=USC4215&_rand=0.35863039778309025
该网站正在附加一个随机密码 _rand
以防止机器人网络抓取。您需要使用有效的随机密钥发出请求才能收到响应。
其实这个秘密通常是通过一组cookies生成的,如果你点击Inspect ==> Network ==> Doc
和Ctrl + R
刷新网站,你会发现更多关于网络流量的信息,因为你再做一个request,你的http请求和响应内容是什么。
请试试这个。
Python代码:
from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests
import re
upc_codes = ['USC4215', 'USC4225', 'USC12050']
def retrunh1(upc):
payload = {'search': upc }
r = requests.get('https://pbejobbers.com/product', params=payload)
matches = re.search(r'document\.location\.href=\"(:?.*)=1\";', str(r.text), re.M|re.S)
url = matches[1]
response = requests.get(url)
for resp in response.history:
r = requests.post(resp.headers['Location'])
soup = BeautifulSoup(r.content, 'html.parser')
print(soup.prettify())
if __name__=='__main__':
for upc in upc_codes:
retrunh1(upc)
输出:
<div class="page-area-container">
<div class=" middlebar">
<div class=" middlebar__left">
<a class=" logo" href="/">
<img alt="PBE Jobbers" class=" logo-img" src="/bundles/pjfrontend/pbejobbers/images/logo/pbe-logo.svg?version=9d4c5d60"/>
</a>
</div>
...
</div>
...
</div>