未闻Code·知识星球周报总结(五)

2021-10-19 15:14:33 浏览数 (1)

知识星球周报总结是对未闻Code ·知识星球上的每周内容进行汇总,完全干货!

一、知识科普

如果download middleware中响应状态异常时,需要进行验证码处理,其中可能包含下载验证图片,向验证码接口或本地服务发送请求获取验证结果,带着验证结果向目标验证地址发送请求,向上次响应状态异常的URL重新发送请求等许多操作。因为scrapy是异步的,如果这里的各种请求用requests完成的话,同步操作会影响scrapy的速度,那么如何在download middleware中使用scrapy.request完成所有操作呢?或者有其他更好的方案来解决scrapy中过验证的操作(因为觉得上边在download middleware各种请求太繁琐了)?

方法1:你不应该把思路局限在用downloader middleware重发请求这一条路。可以通过增加一些参数的方式,让这个请求重新走正常的逻辑。例如你一开始请求URL是从Redis中读出来的,那么现在你遇到故障了,那你可以把这个有问题的URL重新放回Redis,并附带上需要处理验证码的参数,这样一来就正常逻辑里面看到有这个参数,就走有验证码的逻辑。

方法2:通过验证码以后,网站会向浏览器写入一段cookie,之后请求有这个新的cookie就不会有验证码了。所以,你可以单独用requests写一个程序,它就负责过验证码,然后活得cookies后写入Redis。scrapy发现这个请求需要验证码,就通知那个获取cookie的程序。这个通知可以是像Redis写入一些参数。那个获取cookie的程序运行完成以后,把新的cookie写到Redis。scrapy从Redis拿到新的cookie后继续新的请求。

二、问题解答

1

南哥,有一个Python并发性能问题:在用Python写高并发的代码时(网络请求任务,没有大量计算),有什么cpu优化的建议么,防止cpu占用过高

点击空白处查看答案

那你需要知道是哪个地方占用了大量的CPU。Python有一个模块可以测量到最占用CPU的函数,叫做profile。

2

提问:1.目前在用Scrapy写爬虫,每天会对网站定时爬虫,为了避免爬到重复数据,会在获取到每条数据id后,先从MongoDB里查询是否存在此id,再进行后续操作,请问这样是一种好的方式吗?有没有更合适的方式?

2.在方法之间通过meta传递数据的时候,为了保证数据正确,会使用deepcopy,如meta={"name": deepcopy(name)},是一个好习惯吗?

点击空白处查看答案

1.是好习惯。如果数据量不大,这样做没什么坏处。如果数据量很大,可以考虑把已有的数据的id放到Redis里面,不要频繁查MongoDB。

2.如果数据会在后一个callback里面会发生改变,那么可以deepcopy。如果里面的数据只是读取不会写入或者修改,那不用deepcopy。

3

提问:我现在有一堆人的面部图像(一个人可能有多张面部图像),我想从这堆面部图像中选出出现频率最高的图片,请问有什么现成的算法或者api吗?

点击空白处查看答案

这实际上是一个聚类问题。你搜索一下图片聚类

4

请问使用httpx进行异步请求,如何对超时的任务进行重试呢

点击空白处查看答案

还是正常的try except捕获超时异常,然后重试。

https://github.com/cxapython/chat_aio_spider/blob/master/utils/retry_helper.py

5

c 中的内存操作例如memcpy,memset等在python里面应该如何写呢,是该用什么方法,哪个库,求指导

点击空白处查看答案

a = 一个字典并且字典里面不含可变对象 b = a.copy() 修改b。完成。a = 包含可变对象的字典或容器 import copy b = cooy.deepcopy(a)

6

请教一下,使用selenium如何点击播放呀?

点击空白处查看答案

你先find_element_by_xpath找到这个元素,然后.click()

7

南哥,selenium不重启driver切换代理ip怎么实现?可否介绍下。

点击空白处查看答案

当然可以。非常简单。需要使用到chrome的扩展插件。你在Google搜索:selenium chrome extension change proxy就可以找到。

END

0 人点赞