美文网首页
多线程+代理池如何爬取新闻数据

多线程+代理池如何爬取新闻数据

作者: SunY7 | 来源:发表于2023-06-25 16:01 被阅读0次

说到数据爬取,大部分人都会想到使用Scrapy工具,但是仅仅停留在会使用的阶段。但是要真正的成为技术大牛,需要学会更多的爬虫技术,对于爬虫来说突破各种网站的反爬机制也是需要技术能力的。所以今天为了增加对目标网站爬虫机制的理解,我们可以通过手动实现多线程的爬虫过程,同时,引入IP代理池进行基本的反爬操作。

本次使用腾讯新闻网进行爬虫,该网站具有反爬机制,同时数量足够大,多线程效果较为明显。

需要使用到的技术如下

  • IP代理池
  • 多线程
  • 爬虫与反爬

首先,开始分析新闻网的一些数据。经过抓包分析,可知:.https://new.qq.com/d/cd/包含所有新闻数据同时,该地址具有反爬机制,多次访问将会失败的情况。

分析完目标网站的网的数据后,搭建IP代理池,用于反爬作用。由于使用的代理商提供了参考demo,所以本代码里面直接使用的是代理商提供的代码。搭建完IP代理池后,我们开始着手多线程爬取数据的工作。一旦使用多线程,则需要考虑到数据的读写顺序问题。这里使用python中的队列queue进行存储新闻代码,不同线程分别从这个queue中获取新闻代码,并访问指定新闻的数据。由于queue的读取和写入是阻塞的,所以可以确保该过程不会出现读取重复和读取丢失新闻代码的,实现过程如下:
import asyncio
import aiohttp
import threading
from collections import Counter

定义一个全局变量,用于存储分类结果

categories = Counter()

定义一个函数,用于根据文本内容进行分类

def classify(text):
# 这里可以使用任何文本分类的方法,例如正则表达式、机器学习等
# 这里为了简单起见,只使用了简单的字符串匹配
if "Python" in text:
return "Python"
elif "Java" in text:
return "Java"
elif "C++" in text:
return "C++"
else:
return "Other"

async def fetch_page(url, proxy):
# 创建一个 aiohttp 的 ClientSession 对象,并指定代理IP和端口
async with aiohttp.ClientSession(proxy=proxy) as session:
# 使用 session.get 方法发送请求,并获取响应对象
async with session.get(url) as response:
# 返回响应的文本内容
return await response.text()

async def main():
urls = ["https://www.baidu.com/s?wd=" + str(i) for i in range(10)] # 生成十个百度搜索网址

# 假设有一个文件 16yun.txt,每行存储一个代理host和端口,例如 www.16yun.cn:3333
# 读取文件中的所有代理,并存储在一个列表中
with open("16yun.txt") as f:
    proxies = [line.strip() for line in f]

tasks = [] # 创建一个空列表,用于存储 task 对象

# 遍历 urls 和 proxies 列表,为每个 url 配对一个 proxy,并创建 task 对象
for url, proxy in zip(urls, proxies):
    task = asyncio.create_task(fetch_page(url, proxy))
    tasks.append(task)

results = await asyncio.gather(*tasks) # 同时运行所有 task 并获取结果

# 创建一个线程池,用于执行分类任务
pool = threading.ThreadPoolExecutor(max_workers=4)

for result in results:
    print(result[:100]) # 打印每个网页的前 100 个字符
    
    # 使用线程池提交一个分类任务,并更新全局变量 categories
    category = pool.submit(classify, result).result()
    categories[category] += 1

# 关闭线程池并等待所有任务完成
pool.shutdown(wait=True)

# 打印最终的分类结果
print(categories)

asyncio.run(main()) # 运行主协程

相关文章

  • Python多线程爬取王者荣耀COS小姐姐图片集

    多线程爬取数据,主要是用Python的线程池ThreadPoolExecutor。主要代码如下: 爬取到的资源如下...

  • 爬虫系列(1)--ip代理池的爬取

    代理池IP爬取 网络上提供免费代理的网站: 快代理 国内代理 以上述两家代理为例。一般网站的代理数据均以表格样式展...

  • 爬虫(2)--- 构建简单代理IP池

    目录 1. 何为代理IP池?2. 代理IP池构建2.1 浏览器伪装2.2 代理IP爬取2.3 代理IP验证2.4 ...

  • 行业垂直搜索引擎的构建

    1 项目的功能 爬取新闻(爬取网站可配置,精准爬取需要内容); 抽取新闻内容,存入数据库(精准抽取); 建立索引(...

  • Python 学习——每天写点小东西-6

    今天的爬虫是爬取某网站的所有链接,涉及到了MongoDB及其简单的操作,和多线程,虽然爬取的数据简单,但是能爬取这...

  • Python爬虫:如何爬取分页数据?

    上一篇文章《产品经理学Python:如何爬取单页数据?》中说了爬取单页数据的方法,这篇文章详细解释如何爬取多页数据...

  • js逆向之全网代理IP的爬取

    之前搭建IP代理池的时候爬取过全网代理IP,全网代理IP免费的代理虽然只有首页的20个代理,但是可用程度非常高,可...

  • Python爬取免费代理搭建代理池

    我们在做爬虫的过程中经常会遇到这样的情况:最初爬虫正常运行,正常抓取数据,一切看起来都是那么美好,然而一杯茶的功夫...

  • 如何成为一个合格的代理池

    其实,在github上我们可以找到好多代理池,说白了都不知道是第几手数据了,都是爬取多个网站然后进行数据清洗,或r...

  • 2019-03-06

    最近在爬取淘宝,安居客上的数据的时候,遇到各种问题,最终我才发现,预备代理池迫在眉睫。 所以今天我准备写个系列,从...

网友评论

      本文标题:多线程+代理池如何爬取新闻数据

      本文链接:https://www.haomeiwen.com/subject/hdwiydtx.html