Python多线程爬虫,主播信息资料爬取采集
时间:2022-07-22
本文章向大家介绍Python多线程爬虫,主播信息资料爬取采集,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
头榜,一个集合主播信息及资讯的网站,内容比较齐全,现今直播火热,想要找寻各种播主信息,这类网站可以搜集到相关热门主播信息。
目标网址:
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()
微信公众号:二爷记
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- dbvis 数据库连接工具-更新数据库驱动方法示例演示,驱动与数据库版本不匹配问题:Unknown system variable ‘query_cache_size‘解决方法
- Chrome 插件开发-主动获取所有页签的tabid,background.js直接向所有页签同步传递消息
- Python 技术篇-httpClient库连接服务器发送请求解析响应实例演示,No module named ‘httplib‘问题解决方法
- Windows 技术篇-windows家庭版win+R运行搜不到gpedit.msc组策略编辑器解决方法,windows安装组策略编辑器方法
- SpringBoot中Tomcat是如何启动的
- JavaScript 技术篇-chrome浏览器读取剪切板命令document.execCommand(‘paste‘)返回false原因及解决方法
- Linux 技术篇-文件大小查看方法实例演示,查看指定文件大小,查看列表下所有文件夹和文件的大小
- Python 技术篇-判断指定路径下的文件是否处于打开状态或占用状态实例演示
- Python 爬虫进阶篇-利用beautifulsoup库爬取网页文章内容实战演示
- Windows 技术篇-cmd强制关闭端口、解除端口占用方法,cmd查询端口相关的进程pid并杀死进程实例演示
- PL/SQL 数据库连接工具的下载、安装与使用实例演示
- JavaScript 技术篇-JSON字符串在线快速格式化查看实例演示,json.cn网址格式化json字符串
- Python 技术篇-含中文编码的代码运行方法,(unicode error) ‘utf-8‘ codec can‘t decode问题原因及解决方法
- Spring Boot Actuators
- 用图机器学习探索 A 股个股相关性变化