网络抓取同步请求

时间:2017-03-08 21:02:20

标签: python-3.x web-scraping beautifulsoup

from urllib import request
import urllib
from bs4 import BeautifulSoup as bs

page = request.urlopen("http://someurl.ulr").read()
soup = (page,"lxml")

现在这个过程非常慢,因为它会使一个请求解析数据, 完成指定的步骤,然后我们回去发出请求。

- for example



for links in findAll('a'):
    print (links.href)

然后我们回去发出请求,因为我们想要抓取另一个网址,如何加速这个过程?

我应该将URL的整个源代码存储在一个文件中,然后进行必要的操作(解析,找到我们需要的数据)---?

我有这个想法,因为来自DoS(拒绝服务)脚本  使用导入socks和线程来发出大量请求。

注意:这只是一个想法, 有没有更有效的方法呢?

1 个答案:

答案 0 :(得分:2)

最有效的方法很可能是使用asyncio,并且在某一点上产生与你有线程一样多的python进程。

asyncio documentation

并像这样调用你的脚本:

for i in $(seq $(nproc)); do python yourscript.py $entry; done

这将带来巨大的速度提升。为了进一步提高处理速度,你可以使用正则表达式解析器而不是Beautifulsoup,这给了我大约5倍的加速。

您也可以使用专门的库来完成此任务,例如: scrapy