Lobolang 发表于 2019-8-14 21:03

多线程爬取某贴吧帖子

本帖最后由 Lobolang 于 2019-8-14 22:24 编辑

由于刚学没多久,技术有限,有不少错误望各位师兄师姐多多指点..{:1_907:}
import requests
import threading
from lxml import etree
from queue import Queue

headers={'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Mobile Safari/537.36'}

class TiebaSpider:
    def __init__(self):
      self.url='http://tieba.baidu.com/f?&kw=lol&pn={}'   #本代码以lol为例子,lol可更换为其他贴吧的吧名
      self.url_queen = Queue()
      self.response_queen = Queue()

    def get_urllist(self):
      for i in range(0,5):
            self.url_queen.put(self.url.format(i*30))

    def get_response(self):
      while True:
            url = self.url_queen.get()
            response=requests.get(url,headers=headers)
            self.response_queen.put(response.content.decode())
            self.url_queen.task_done()

    def get_info(self):
      while True:
            html = etree.HTML(self.response_queen.get())
            title=html.xpath('//div[@class="ti_title"]/span/text()')
            title_url=html.xpath('//ul[@class="threads_list"]//a/@href')
            str='http://tieba.baidu.com'
            url=
            count=0
            while count<len(title):
                print('标题:%s 地址:%s' %(title,url))
                count+=1
            self.response_queen.task_done()

    def run(self):
      thread_list=[]
      for i in range(1):                   #获取页码的线程数:1   线程数可根据自己喜好更改
            t_list=threading.Thread(target=self.get_urllist)
            thread_list.append(t_list)
      for i in range(10):                #获取响应的线程数:10
            t_response=threading.Thread(target=self.get_response)
            thread_list.append(t_response)
      for i in range(3):                  #采集数据的线程数:3
            t_info=threading.Thread(target=self.get_info)
            thread_list.append(t_info)

      for t in thread_list:
            t.setDaemon(True)
            t.start()

      for p in (self.url_queen,self.response_queen):
            p.join()                                       #设置主线程等待其他线程结束再结束

      print("\33[36m获取结束")

if __name__ == '__main__':
    q=TiebaSpider()
    q.run()

Lobolang 发表于 2019-8-14 21:06

xpath使用不太了解,有时候遇到只有图片没有title内容的帖子就获取不到标题,然后后面标题和网址就乱了,或者就列表溢出{:1_907:},,,,经排查发现是获取title的xpath中的span标签为空,,,我也不知道这个怎么写,望有师兄师姐指点指点{:301_1004:}

JavaSB 发表于 2019-8-14 21:17

谢谢分享

逆向学习 发表于 2019-8-14 21:18

感谢分享

夏橙M兮 发表于 2019-8-14 21:36

谢谢分享。

天气敷和 发表于 2019-8-14 22:39

感谢热心分享!
页: [1]
查看完整版本: 多线程爬取某贴吧帖子