python里最方便获取页面内容的是urllib.request,但是有些网站是需要浏览器加载执行js后才会显示完整的页面数据,此时urllib.request就不行了,只能抓取到空白页面或者不完整的页面,可以使用requests_html的html.render对页面渲染解决这个问题。
安装requests_html
pip install requests_html
代码
from requests_html import HTMLSession
def open_url(url):
headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0'}
session = HTMLSession()
resp = session.get(url, headers=headers)
resp.html.render(timeout=20)
return resp.html.html
首次使用时,会自动下载chrome,提示如下:
[W:pyppeteer.chromium_downloader] Starting Chromium download. Download may take a few minutes.
100%|█████████████████████████████████████████████████████████████████████████| 137M/137M [00:12<00:00, 11.0Mb/s]
[W:pyppeteer.chromium_downloader] Chromium download done.
[W:pyppeteer.chromium_downloader] chromium extracted to: C:\Users\mk0201-00322\AppData\Local\pyppeteer\pyppeteer\local-chromium\588429
我是用的windows,这里遇到了一个问题,在他提示的这个目录里并无法找到chrome,所以即使这里提示下载成功后,也会报错:
self._execute_child(args, executable, preexec_fn, close_fds,
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\lib\subprocess.py", line 1420, in _execute_child
hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
OSError: [WinError 14001] 应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行 sxstrace.exe 工具。
经过一番研究,刚刚的那个chrome在我的电脑上是下载到了这个位置
c:\Users\mk0201-00322\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\Local\pyppeteer\pyppeteer\local-chromium\588429\
我直接把他copy到了刚刚下载时所提示的那个路径后,问题解决。理论上来说,应该是有地方可以设置路径,让pypetter可以找到chrome的,不过我懒得去查了,这个方法可以解决问题就可以了。
现在开发的爬虫,已经可以获得完整的页面了。