前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python多线程爬虫,主播信息资料爬取采集

Python多线程爬虫,主播信息资料爬取采集

作者头像
二爷
发布2020-07-22 14:38:16
7670
发布2020-07-22 14:38:16
举报
文章被收录于专栏:二爷记二爷记

头榜,一个集合主播信息及资讯的网站,内容比较齐全,现今直播火热,想要找寻各种播主信息,这类网站可以搜集到相关热门主播信息。

目标网址:

http://www.toubang.tv/baike/list/20.html

列表页,而且暂时没有发现列表页规律,加密了?

http://www.toubang.tv/baike/list/20.html?p=hJvm3qMpTkj7J/RNmtAVNw==

http://www.toubang.tv/baike/list/20.html?p=rjaUfcMsOOYXKBBBp5YUUA==

很明显,p后面所带的参数就是页码,但是搞不明白是如何实现的一串字符串,目测没有明显的页码规律。

没有过多的研究,霸王硬上弓,硬搞吧!

直接把所有列表页上遍历一遍,获取到页码链接,这里我简单的使用了递归函数

获得所有列表页的集合,至于去重,这里直接使用了set(),直接将集合转化为set

递归代码

def get_apgeurls(apgeurls):
    page_urls=[]
    for apgeurl in apgeurls:
        page_url=get_pageurl(apgeurl)
        page_urls.extend(page_url)


    page_urls=set(page_urls)
    #print(len(page_urls))


    if len(page_urls) < 66:
        return get_apgeurls(page_urls) #链轮
    else:
        return page_url

好在分页数不多,算是一个比较笨的实现方法,注意return的使用,递归函数调用函数本身,return会返回None,这里通过百度查询相关资料获取到解决方案。

其他的一些获取内容,都是正常操作,这里就不再阐述了!

提一下多线程吧!

def get_urllists(urls):
    threads = []
    for url in urls:
        t=threading.Thread(target=get_urllist,args=(url,))
        threads.append(t)
    for i in threads:
        i.start()
    for i in threads:
        i.join()


    print('>>> 获取采集链接完毕!')

这里需要注意一个参数的调用的时候,args=(url,),同时多线程的使用,采集报错是一个很头疼的问题,基本都是服务器反应不过来,难道还是得采用Scrapy框架,大范围抓取。

运行效果:

采集效果:

附源码参考:

#www.toubang.tv/
#20200606 by WX:huguo00289

# -*- coding: utf-8 -*-
from fake_useragent import UserAgent
import requests,time,os
from lxml import etree
import threading  #多线程


def ua():
    ua=UserAgent()
    headers={'User-Agent':ua.random}
    return headers

def get_pageurl(url):
    pageurl=[]
    html=requests.get(url,headers=ua()).content.decode('utf-8')
    time.sleep(1)
    req=etree.HTML(html)
    pagelists=req.xpath('//div[@class="row-page tc"]/a/@href')
    for pagelist in pagelists:
        if "baike" in pagelist:
            pagelist=f"http://www.toubang.tv{pagelist}"
            pageurl.append(pagelist)

    #print(len(pageurl))
    return pageurl


def get_apgeurls(apgeurls):
    page_urls=[]
    for apgeurl in apgeurls:
        page_url=get_pageurl(apgeurl)
        page_urls.extend(page_url)

    page_urls=set(page_urls)
    #print(len(page_urls))

    if len(page_urls) < 5:
    #if len(page_urls) < 65:
        return get_apgeurls(page_urls) #链轮
    else:
        return page_urls


def get_urllist(url):
    html = requests.get(url, headers=ua()).content.decode('utf-8')
    time.sleep(1)
    req = etree.HTML(html)
    hrefs=req.xpath('//div[@class="h5 ellipsis"]/a/@href')
    print(hrefs)
    for href in hrefs:
        href=f'http://www.toubang.tv{href}'
        get_info(href)




def get_urllists(urls):
    threads = []
    for url in urls:
        t=threading.Thread(target=get_urllist,args=(url,))
        threads.append(t)
    for i in threads:
        i.start()
    for i in threads:
        i.join()

    print('>>> 获取采集链接完毕!')


def get_info(url):
    html = requests.get(url, headers=ua()).content.decode('utf-8')
    time.sleep(1)
    req = etree.HTML(html)
    name=req.xpath('//div[@class="h3 ellipsis"]/span[@class="title"]/text()')[0]
    os.makedirs(f'{name}/', exist_ok=True)  # 创建目录
    briefs=req.xpath('//dl[@class="game-tag clearfix"]/dd/span//text()')
    brief_img=req.xpath('//div[@class="i-img fl mr20"]/img/@src')[0].split('=')[1]
    print(name)
    print(briefs)
    print(brief_img)
    down_img(brief_img, name)
    informations=req.xpath('//table[@class="table-fixed table-hover hot-search-play"]/tbody/tr[@class="baike-bar"]/td//text()')
    for information in informations:
        if '\r' and '\n' and '\t' not in information:
            print(information)

    text=req.xpath('//div[@class="text-d"]/p//text()')
    print(text)
    text_imgs=req.xpath('//div[@id="wrapBox1"]/ul[@id="count1"]/li/a[@class="img_wrap"]/@href')
    print(text_imgs)
    threads=[]
    for text_img in text_imgs:
        t=threading.Thread(target=down_img,args=(text_img,name))
        threads.append(t)

    for i in threads:
        i.start()
    for i in threads:
        i.join()

    print("图片下载完成!")



def down_img(img_url,name):
    img_name=img_url.split('/')[-1]
    r=requests.get(img_url,headers=ua(),timeout=8)
    time.sleep(2)
    with open(f'{name}/{img_name}','wb') as f:
        f.write(r.content)
    print(f'>>>保存{img_name}图片成功!')



def main():
    url = "http://www.toubang.tv/baike/list/20.html?p=hJvm3qMpTkjm8Rev+NDBTw=="
    apgeurls = [url]
    page_urls = get_apgeurls(apgeurls)
    print(page_urls)
    get_urllists(page_urls)



if __name__=='__main__':
    main()

微信公众号:二爷记

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与SEO学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档