「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战」
中药材在橡皮擦眼中,只有 马钱子、决明子、苍耳子、还有莲子、黄药子、苦豆子、川楝子、我要面子,这是少时从《本草纲目》学来的。 其余的也就知道个枸杞、三七、藿香正气水、板蓝根了,为了摆脱不认识中药材的困境,我决定要爬取一下中药材数据存储在本地,这就是本文的写作背景。
首先把 刚才提到的中药材在贴出图片来,认识一下吧(还真认出来一个,小时候在地里走路会沾到腿上的一个苍耳子)。
爬取前的分析工作
本次的目标网站为:www.zhongyaocai.com/,打开中药材库发现合计 752 页数据,每页大概 12 条数据,将近 10000 种药材,咱们今天的目标就是存储这些数据。
正则表达式部分单独获取即可,具体待匹配部分的 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 格式,读取之后可以任意操作。
爬虫小课整体总结时间
本系列课程主要为大家分享了 requests
库的基础知识,希望大家在 9 次课程之后对该库有一个相对全面的认识,其他未涉及的知识点随着你学习编程时间的延长而自动【学会】,该学习方式已经有很多“云学长”给出了相同的答案。
requests
库中最重要的就是发送请求,获取数据。其中核心的方法有 get
、post
、以及两个常见的属性 text
、content
,其他内容都属于扩展部分知识。
爬虫小课之 requests
库,到此结束。
今天是持续写作的第 1/100 天。 如果你有想要交流的想法、技术,欢迎在评论区留言。