多线程爬取爱上租公寓数据

6 篇文章 0 订阅
4 篇文章 0 订阅

现在大家都喜欢用Scrapy框架爬取网站,因为Scrapy框架集成了很多功能,而且底层用了twisted 非阻塞异步框架,提供了多线程爬虫功能,那么我们如何实现不用框架也能快速高效的爬取网站呢? 那么今天我就跟大家分享一个办法吧!

今天给大家分享的是采用 多线程 + 生产者消费者模式来构建的爬虫代码,不过为的是给大家分享,便于理解我给大家简单用面向过程写的代码,如果有朋友想要面向对象的代码可以在下面评论跟我要哦! 好啦,言归正传

多线程: 多线程大家都是有些了解的,它是系统调度资源的基本单位, 每一个线程和一个cpu单独进行交互效率是非常好的,而我们所要爬取的爱上租公寓有三个方面,页码数据中拿到房间URL, 访问URL拿到房子具体信息, 拿到想要的具体数据.所以为了高效我使用了3个线程.

生产者消费者: 我们都知道我们平时不做处理的时候, 都是上面生产下面等着消费, 这样下来下面等着上面生产, 上面生产完又要等着下面消费,所以时间大大浪费了, 效率非常低(可以看我下篇文章, 纯基础编写的 生产-消费-生产 的代码,效率很低), 所以我们可以使用生产者消费者模型来配合多线程构建代码.即一个生产,生产完放到仓库里,自己接着生产不用等待, 而消费者去仓库直接拿,也不用等待, 这样效率就大大提升了.

想必大家看了这么多早就烦了吧,那我就直接上代码吧,大家边看边分析.

大家可以看到,其实主代码分了3块, 即获取房间url,  获取房子详情的内容,  解析 所以我们用了3个线程.

这个是通过页码的数据拿到每一页的房子的url
def get_data(url_queue):
    print('get_data线程的名字为--%s--' % threading.current_thread().name)
    for i in range(1, 22):
        print('爬取到第{}页'.format(i))
        # db = connect_sqlite()
        re = requests.get(url=url.format('sz', i)).text
        tree = etree.HTML(re)
        url_list = tree.xpath('//div[@class="list-item-intro"]/a/@href')
        for url_room in url_list:
保存到队列里, 这样就可以避免资源竞争,可以不用加锁
            url_queue.put(url_room)
            time.sleep(0.5)

 

从队列中取出房子URL, 向服务器发送请求得到响应, 将响应HTML保存到data队列里

def get_content(url_queue, data_queue):
    print('get_content线程的名字是---%s---' % threading.current_thread().name)
    time.sleep(20)
    while True:
        try:
            url_house = url_queue.get(True, 5)
            print('正在爬取{}'.format(url_house))
            re = requests.get(url=url_house, headers=headers).text
            data_queue.put(re)
            time.sleep(0.4)
            if url_queue.full():
                break
        except:
            print('url_queue已经空了')
            break

最后进行解析就好了,没看懂的话自己敲一下哦,这样理解的更快, 上面我截图的有,可以照着写, 也可以去我的资源包下载,我已经传资源了哦!  喜欢或者有帮助了点个赞哦!

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值