25 岁以上的程序员,认识不了几个中药材的。Python 爬虫小课 9-9

「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战

中药材在橡皮擦眼中,只有 马钱子、决明子、苍耳子、还有莲子、黄药子、苦豆子、川楝子、我要面子,这是少时从《本草纲目》学来的。 其余的也就知道个枸杞、三七、藿香正气水、板蓝根了,为了摆脱不认识中药材的困境,我决定要爬取一下中药材数据存储在本地,这就是本文的写作背景。

首先把 刚才提到的中药材在贴出图片来,认识一下吧(还真认出来一个,小时候在地里走路会沾到腿上的一个苍耳子)。

25 岁以上的程序员,认识不了几个中药材的。Python 爬虫小课 9-9

爬取前的分析工作

本次的目标网站为:www.zhongyaocai.com/,打开中药材库发现合计 752 页数据,每页大概 12 条数据,将近 10000 种药材,咱们今天的目标就是存储这些数据。

25 岁以上的程序员,认识不了几个中药材的。Python 爬虫小课 9-9

正则表达式部分单独获取即可,具体待匹配部分的 HTML 源码如下:

<div class="poem-head">
  <a class="poem-title" href="https://www.zhongyaocai.com/zyc/gelifen_2542.htm"
    >蛤蜊粉</a
  >
  <div class="poem-handler"></div>
</div>

<div class="poem-body">
  <div class="poem-sub">
    <span class="list_span">原形态:</span
    ><span>四角蛤蜊,贝壳略呈四角形,质坚,壳长36-48mm,壳......</span>
  </div>
  <div class="poem-sub">
    <span class="list_span">性味:</span><span>味咸;性寒</span>
  </div>
  <div class="poem-sub">
    <span class="list_span">用法用量:</span
    ><span>内服:煎汤,50-100g;或入丸、散,3-10g。.....</span>
  </div>
  <div class="poem-sub">
    <span class="list_span">功能主治:</span
    ><span>清热;化痰利湿;软坚。.....</span>
  </div>
</div>
复制代码

正则表达式部分如下:

    pattern = re.compile(
        r'<div class="poem-head"><a class="poem-title" href="(.*?)">(.*?)</a>')
    title_url = pattern.findall(html)
    xing = re.findall(
        r'<span class="list_span">原形态:</span><span>(.*?)</span>', html)
    wei = re.findall(
        r'<span class="list_span">性味:</span><span>(.*?)</span>', html)
    liang = re.findall(
        r'<span class="list_span">用法用量:</span><span>(.*?)</span>', html)
    zhi = re.findall(
        r'<span class="list_span">功能主治:</span><span>(.*?)</span>', html)
    items = []
复制代码

数据匹配成功之后,本次将数据存储到本地,格式为 JSON 格式,主要避免存储成 Excel 中间因为 <br> 符号导致的乱版问题,当然直接存储到数据库就不会存在该问题了。

编码时间

本案例作为爬虫小课的第 9 讲,内容非常简单,对于现在的你非常简单,开启多线程之后直接爬取即可。

import requests
import re
import json
import threading
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"}

flag_page = 0

def anay(html):
    pattern = re.compile(
        r'<div class="poem-head"><a class="poem-title" href="(.*?)">(.*?)</a>')
    title_url = pattern.findall(html)
    xing = re.findall(
        r'<span class="list_span">原形态:</span><span>(.*?)</span>', html)
    wei = re.findall(
        r'<span class="list_span">性味:</span><span>(.*?)</span>', html)
    liang = re.findall(
        r'<span class="list_span">用法用量:</span><span>(.*?)</span>', html)
    zhi = re.findall(
        r'<span class="list_span">功能主治:</span><span>(.*?)</span>', html)
    items = []
    for i in range(0, len(title_url)):
        dict_item = {
            "name": title_url[i][1],
            "url": title_url[i][0],
            "xing": xing[i],
            "wei": wei[i],
            "liang": liang[i],
            "zhi": zhi[i]
        }
        items.append(dict_item)
    return items

def save(json_data):
    with open(f"./data1/one.json", "a+", encoding="utf-8") as f:
        f.write(json_data+"\n")

def get_list():
    global flag_page
    while flag_page < 752:
        flag_page += 1
        url = f"https://www.zhongyaocai.com/zyc_p{flag_page}.htm"
        print(url)
        r = requests.get(url=url, headers=headers)
        r.encoding = "utf-8"
        data = anay(r.text)
        json_data = json.dumps({"yaos": data}, ensure_ascii=False)
        save(json_data)

if __name__ == "__main__":
    for i in range(1, 6):
        t = threading.Thread(target=get_list)
        t.setName(f't{i}')
        t.start()
复制代码

数据存储到本地,格式如下图所示,每页一行数据,每行都是 JSON 格式,读取之后可以任意操作。

25 岁以上的程序员,认识不了几个中药材的。Python 爬虫小课 9-9

爬虫小课整体总结时间

本系列课程主要为大家分享了 requests 库的基础知识,希望大家在 9 次课程之后对该库有一个相对全面的认识,其他未涉及的知识点随着你学习编程时间的延长而自动【学会】,该学习方式已经有很多“云学长”给出了相同的答案。

requests 库中最重要的就是发送请求,获取数据。其中核心的方法有 getpost、以及两个常见的属性 textcontent,其他内容都属于扩展部分知识。

爬虫小课之 requests 库,到此结束。

25 岁以上的程序员,认识不了几个中药材的。Python 爬虫小课 9-9


今天是持续写作的第 1/100 天。 如果你有想要交流的想法、技术,欢迎在评论区留言。

Guess you like

Origin juejin.im/post/7031523109781897229