python多线程爬取药品信息

news/2024/12/23 20:53:30 标签: python, 开发语言

多线程爬取药品信息

利用多线程来获取药品信息可以实现高效的爬取,方便我们自己对药品的名称、价格以及功效进行了解和掌握

导入需要使用到的包

python">from concurrent.futures.thread import ThreadPoolExecutor
from lxml import etree
import requests
import random
import csv 

目标网站

39药品通

这个网站提供的药品信息非常全,本身网站做的也很简洁明了,标签规整,非常适合信息爬取

以皮肤用药为例,我们可以利用xpath定位来定位我们想要获取到的元素

在这里插入图片描述

分别是名称,适用症状以及药品参考价格

知道这些信息之后开始写代码

  1. 首先我们利用文件管理以及csv的writer构造我们要使用的写入文件对象
python">fp = open('../dataset/druginfo.csv', 'a+', encoding='utf-8', newline='')
writer = csv.writer(fp)
  1. 之后再构造headers和代理池(如果有购买就用你购买的)防止ip封锁反爬
python">headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1660.57",
}

proxies_pool = [
    {'http': '114.231.109.88:8088'},
    {'http': '114.231.42.23:8808'},
    {'http': '113.223.215.204:8080'},
    {'http': '117.69.136.23:8009'},
    ]
  1. 接着定义一个download函数用来接收我们传入的url并对数据进行解析和下载
python">def download(url):
    proxies = random.choice(proxies_pool)
    response = requests.get(url=url, headers=headers, proxies=proxies)
    content = response.text
    tree = etree.HTML(content)  # IMPORTANT:调用etree解析页面源码
    namelst = tree.xpath('//div[@class="drugs-brief"]/p/a/@title')  # TIPS:获取药品名称
    efficacylst = tree.xpath('//div[@class="drugs-brief"]/p[2]/text()')  # TIPS:药品功效概述
    pricelst = tree.xpath('//div[@class="drugs-brief"]/p[4]/span/text()')  # TIPS:药品价格
    for i in range(len(namelst)):
        name = namelst[i].strip()
        efficacy = efficacylst[i].strip()
        try:
            price = pricelst[i].strip()
        except IndexError:
            price = ' '
        infolst = [name, efficacy, price]
        # tips:当然这里还可以用拼接字符串的写法
        print(infolst)
        writer.writerow(infolst)

注意上面代码写了一处异常处理,因为爬取的时候报错了,然后我发现后面有些页面的药品是没有标注价格的!!!
在这里插入图片描述

  1. 接下来构造主函数
python">if __name__ == '__main__':
    with ThreadPoolExecutor(10) as t:  # important:开启大小为20的线程池
        for j in range(1, 80):
            url = f'https://ypk.39.net/pifu/p{j}/'
            t.submit(download, url)

由于皮肤用药大概有88页,所以在主函数中设置到80页看看效果
在这里插入图片描述

注意:

  • 我们在主函数中开启了线程池,大小指定为10,构造循环遍历页码然后利用.submit将url作为参数传入到我们写的download函数中去让它来处理传入的url,对其进行解析并获取我们要爬取的信息,然后写入到csv文件当中
运行结果

在这里插入图片描述
获取了1200多条数据,而且因为开启了多线程,运行速度很快

如果本文对你使用多线程爬取有帮助,请点赞收藏,您的鼓励是我创作的动力
请添加图片描述


http://www.niftyadmin.cn/n/5796987.html

相关文章

C++面试八股文:指针与引用的区别

引言 这也是一道C开发工程师在面试中经常被问到的题目,本文将从指针和引用的几方面区别和各自的常用用途展开讲解,助力各位在面试中大放异彩。 指针和引用的区别 1、指针是一个变量,储存的是一个地址,通过该地址可以操作内存中…

List反转的方法

1.list循环 List<String> strsnew ArrayList<>();for (int i 0; i <100 ; i) {strs.add("a"i);}List<String> fzstrsnew ArrayList<>();for (int i strs.size()-1; i >0 ; i--) {fzstrs.add(strs.get(i));}System.out.println(fzstr…

微服务详细教程之nacos和sentinel实战

前言 上一篇文章中已经介绍了java的高并发编程中的问题&#xff0c;现在主要介绍微服相关的问题&#xff0c;其中在网上面经中经常出现的几个微服问题。这也是我们工作中经常遇到的几个问题。 一.微服务有哪些好处&#xff1f; 微服务优点很多&#xff0c;但是我们通常说一个东…

Elasticsearch:什么是查询语言?

查询语言定义 查询语言包括数据库查询语言 (database query language - DQL)&#xff0c;是一种用于查询和从数据库检索信息的专用计算机语言。它充当用户和数据库之间的接口&#xff0c;使用户能够管理来自数据库管理系统 (database management system - DBMS) 的数据。 最广…

使用开源在线聊天工具Fiora轻松搭建个性化聊天平台在线交流

文章目录 前言1.关于Fiora2.安装Docker3.本地部署Fiora4.使用Fiora5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 今天给大家介绍一款免费开源的在线聊天工具——Fiora。它不仅是一款功能强大的即时通讯软件&#xff0c;更是开发者们展现创造…

Scala学习记录 如何打印输出

在Scala中&#xff0c;打印输出可以通过多种方式实现&#xff0c;以下是一些常见的打印输出方法&#xff1a; 1.使用printf()方法&#xff1a; 这是一种传统的C语言风格的打印方式&#xff0c;通过格式化字符串来控制输出的格式。例如&#xff0c;printf("整数&#xff1a…

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证3)

根据参考文献1中JWT Token的组成及计算方式&#xff0c;对照参考文献2中的界面&#xff0c;实现简单的JWT Token解析及验证程序&#xff0c;主要功能包括&#xff1a;   1&#xff09;拆分Token字符串&#xff0c;将前两段使用Base64UrlEncoder类解码并转为UTF8字符串&#x…

NestJS中使用DynamicModule实现模块动态加载

1. 介绍 在NestJS中&#xff0c;模块是组织代码的基本单元&#xff0c;它将相关的服务和控制器组织在一起。然而&#xff0c;在某些情况下&#xff0c;我们可能需要根据不同的条件动态加载模块&#xff0c;以满足不同的业务需求。这时&#xff0c;就可以使用DynamicModule了。…