我用Python编写了一个spidering脚本,效果很好。但是,完成需要很长时间(超过9小时,具体取决于网站的链接数量)。
我想在其中实现线程以减少时间,但我无法确定哪个部分最适合线程。乍一看,我会创建线程来获取每个页面的页面内容,然后锁定visited_urls
和to_visit_urls
数组,以确保所有内容都使用相同的列表。
但似乎可能花费大部分时间检查visited_urls
和to_visit_urls
数组中的重复项,因此以这种方式进行线程实际上会节省我那么多时间吗?有没有更好的方法来训练我的蜘蛛?
答案 0 :(得分:0)
您应该使用grequests,它是请求的异步版本,允许您一次刮取多个URL,从而显着提高吞吐量。如果您遍历您的网址并处理子列表,这将非常有效。对于重复项,只需将列表转换为集合并返回将删除它们,因为本质上的集合不支持重复。
urls = [...]
reqs = [grequests.get(x) for x in urls]
resp = grequests.map(reqs)