月度归档:2022年03月

selenium结合mitmporxy进行抓取的一些技巧

在抓取一些必须用selenium进行抓取的网站时,又想加载速度时,可以按下面的方式去操作

在mac,带参数启动程序:
open -a “Google Chrome” –args -ignore-certificate-errors –proxy-server=127.0.0.1:8080

这里去下载selenium grid
https://www.selenium.dev/downloads/

这里去下载 chrome的webdriver
https://chromedriver.storage.googleapis.com/index.html

再写一个启动脚本:
java -jar ./selenium-server-4.1.2.jar standalone

使用mitmproxy来过滤掉一些无用的请求
安装 pip3 install mitmporxy

写一个过滤脚本: filter_rewardstyle.com.py

import re
from mitmproxy import ctx, http

# def http_connect(flow: http.HTTPFlow):
#     if "rewardstyle.com" not in flow.request.host:
#             ctx.log("忽略connect请求:"+flow.request.url)
#             flow.response = http.Response.make(404)
#             return


def request(flow: http.HTTPFlow):
    ctx.log("============ request: " + flow.request.url)
    if "rewardstyle.com" not in flow.request.host:
        if re.search(r'\.(css|js|jpg|png|gif|woff|tiff|ico)$', flow.request.url):
            ctx.log("忽略资源:"+flow.request.url)
            flow.response = http.Response.make(404)
            return


def response(flow):
    # ctx.log(flow.request.url)
    """修改应答数据"""
    if "rewardstyle.com" not in flow.request.url:
        flow.response.text = "by mitmproxy"

运行这个命令:
mitmdump -s filter_rewardstyle.com.py

PHP进程卡住假死问题处理

来源,原站已无法打开
https://www.im050.com/posts/390

首先通过strace命令跟踪假死进程的系统调用信息

strace -p 16618

执行以上命令后,得到如下结果

poll([{fd=33, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
poll([{fd=33, events=POLLOUT}], 1, 1000) = 0 (Timeout)
poll([{fd=33, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
poll([{fd=33, events=POLLOUT}], 1, 1000) = 0 (Timeout)

Tips: 通过命令man poll可以查看poll系统调用的函数原型

发现当前进程占用了33的文件描述符,接着可以通过下面的命令列出占用该文件描述符的进程

lsof -d 33 | grep php

得到如下结果

php     16618 root   33u  IPv4             987105      0t0   TCP iZbp10yq5syyio54pew3swZ:56030->192.168.110.2:http (SYN_SENT)

可以看到当前进程正在进行http请求,并且处于SYN_SENT的状态 (长期处于该状态),最后猜想可能是由于curl没有设置超时时间,服务器没有及时反应或无法响应的情况下造成了假死现象。

经过调整之后,进程运行正常。