欢迎访问我的网站与公众号!点击与扫码即可进入,谢谢关注!

更为详细的教程,建议查看业内大咖崔庆才的博客,非常多的基础知识。https://cuiqingcai.com/202262.html

错误解决

pip安装过程中出现下发VC++ 14错误的,安装下面的这个微软包
error: Microsoft Visual C++ 14.0 is required. Get it with "Build Tools for Visual Studio"
https://pan.baidu.com/s/1GgLLcGTMj80JZSvfg1LuYw?pwd=7777

百度图片下载小例子(风景图片)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from playwright.sync_api import sync_playwright
import wget

with sync_playwright() as p:
# 可以选择chromium、firefox和webkit运行chrome浏览器
# False是有头模式,默认为true是无头模式
browser = p.chromium.launch(headless=False)
context = browser.new_context()
# 打开新页面
page = context.new_page()
# 调到指定页面
page.goto('https://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&dyTabStr=MTEsMCw0LDYsMSwzLDUsMiw4LDcsOQ%3D%3D&word=%E9%A3%8E%E6%99%AF')
imgs = page.query_selector_all('img')
for i in range(len(imgs)):
url = imgs[i].get_attribute('src')
try:
wget.download(url, './' + str(i) + '.jpg')
except Exception as e:
print(e)
# 关闭
browser.close()

一些高级功能

事件监听

response 事件,同时将回调方法设置为 on_response

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def on_response(response):
print(f'Statue {response.status}: {response.url}')

with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.on('response', on_response)
page.goto('https://spa6.scrape.center/')
page.wait_for_load_state('networkidle')
browser.close()
# 结果:正好对应浏览器 Network 面板中所有的请求和响应内容
# Statue 200: https://spa6.scrape.center/
# Statue 200: https://spa6.scrape.center/css/app.ea9d802a.css
# ...
# 修改一下,直接拦截了ajax
def on_response(response):
if '/api/movie/' in response.url and response.status == 200:
print(response.json())
# {'count': 100, 'results': [{'id': 1, 'name': ......

网络劫持

最后再介绍一个实用的方法 route
可以实现一些网络劫持和修改操作,比如修改 request 的属性,修改 response 响应结果等。

  1. 取消图片加载

    1
    2
    3
    4
    5
    6
    7
    8
    def cancel_request(route, request):
    route.abort()

    page.route(re.compile(r"(\.png)|(\.jpg)"), cancel_request)
    page.goto("https://spa6.scrape.center/")
    page.wait_for_load_state('networkidle')
    page.screenshot(path='no_picture.png')
    browser.close()

    调用了 route 方法,第一个参数通过正则表达式传入了匹配的 URL 路径
    这里代表的是任何包含 .png 或 .jpg 的链接,遇到这样的请求,会回调 cancel_request 方法处理
    cancel_request 方法可以接收两个参数,一个是 route,代表一个 CallableRoute 对象
    另外一个是 request,代表 Request 对象。
    这里我们直接调用了 route 的 abort 方法,取消了这次请求,所以最终导致的结果就是图片的加载全部取消了。

    在爬虫的过程中,浏览器中是否把图片加载出来不重要,可以提高整个页面的加载速度,提高爬取效率。

  2. 替换成本地文件

    1
    2
    3
    4
    5
    6
    7
    8
    <html>
    <head>
    <title>Hack Response</title>
    </head>
    <body>
    <h1>Hack Response</h1>
    </body>
    </html>

    下面的例子是,再进入这个网站,网页标题和内容只会显示Hack Response,而不是原本的内容

    1
    2
    3
    4
    def modify_response(route, request):
    route.fulfill(path="./custom_response.html")
    page.route('/', modify_response)
    page.goto("https://spa6.scrape.center/")