摄影:产品经理
鱼子酱
问题1:
[彤颜无忌] 提问:
各位 在做元素定位时 有没有方法根据文本信息模糊匹配来定位页面元素呢?
问题解答:
[青南]
有,xpath有contains关键词。
//div/a[contains(text(), "xxx")]/@href
[彤颜无忌]
contains 我记得好像是根据标签属性来定位的
我想定位 我这个div标签里的文本信息 模糊定位
[青南]
都可以
标签属性用 contains(@xxx, "sss")
文本用 contains(text(), "yyy")
问题2:
[Simon] 提问:
求助:用协程,本地代理服务器,一个session 抓取网页,我想每5000个请求后,切换服务器,但我切换时,发现有些协程还没跑完,从而出现错误。估计是找到原来的链接了。我怎么判断5000个协程都结束了?这样可以根据这个条件再切换代理,就不会出现这样的错误了。
问题解答:
[青南]
放到一个列表里面,然后:
await asyncio.gather(*这个列表)
[Simon]
出现错误的最后反馈
[青南]
全部跑完了以后它才会返回
[Simon]
内容很多,会不会很吃内存?
[青南]
当然会
所以你可以一批一批来,例如每一批100个请求
问题3:
[彤颜无忌] 提问:
@青南 群主好 用selenium做自动化遇到问题 想请教一下群里的各位大神
https://iot.sctel.com.cn/cas/login?service=https://iot.sctel.com.cn/mf-dp/cas这个网站有反爬机制 我用群主发布的方法chromdriver可以正常打开 但是只要一操作元素定位好像就又被屏蔽了
问题解答:
[青南]
因为它可以劫持find_element_by_xxx这些方法,一调用就会发现
[彤颜无忌]
所以想请教一下 是否还有其他方法 可以避开?
[青南]
@彤颜无忌 你会javascript吗
[彤颜无忌]
@青南 会点
我该怎么做 您能大概讲一讲吗?
[青南]
你先在正常的chrome里面,通过开发者工具的console 写javascript,你看看能不能选择节点
你还可以使用用js选到节点以后,能不能调用click去点击某些超链接
[彤颜无忌]
好 我先试试看
[青南]
如果正常执行的话,你就可以通过selenium执行js来绕过它的检测
就不要用selenium自带的那些方法了
问题4:
[sunboy] 提问:
遇到个问题是kafka producer send 方法send之后会出现 kafka中实际上没有收到数据
问题解答:
[sunboy]
查了下说send 是异步的,可以使用get方法去同步
[青南]
因为kafka有一个缓存。要凑够一定数量或者过一定的时间,才会一批从发送。
不是异步,而是缓存。
可以用producer.flush()强行把缓存发送
[青南]
是缓存到本地然后发送是吧
[sunboy]
缓存到内存里面。
[sunboy]
如果没有达到缓存的量是不是说不会发送呢
[青南]
过一定的时间也会发。
[sunboy]
如果说我的爬虫爬了两条数据然后爬虫结束了,但是没发kafka,然后容器kill掉了,那么这样信息就丢失了对吗
一定的时间没有确定的秒数是吧
我最近就发现好多数据日志中有kakfa没有
南哥那我在每次发送之后然后直接flush一下,这样对于性能其他的有什么影响吗
[青南]
会变慢。
是程序自动结束还是强行手动杀死?
[sunboy]
那么和同步发送相比呢,直接send之后调用get一下呢那么和同步发送相比呢,直接send之后调用get一下呢
自动结束的
我是docker调度,增量抓取
[青南]
get更慢。因为你要发两次TCP请求。
.flush只发一次,。
爬完以后,你sleep 60秒再结束
[sunboy]
[青南]
休眠一段时间。
[sunboy]
ok,休眠是一个比较优质的方案
好的我试试,谢谢南哥
[青南]
你也可以在最后flush一下。
不用每次send都flush
End