当前位置: 首页 > news >正文

化学药品购买网站app软件开发

化学药品购买网站,app软件开发,记事本做的网站链接怎么装饰,网站制作视频教程全文章目录 1 第三方库2 爬取2.1 初始化函数2.2 结束时关闭数据库2.3 生成header2.4 获取请求body2.5 解析异步json数据2.6 使用BS4的find方法解析2.7 写入口函数2.8 调用 3 完整代码 1 第三方库 获取随机UA pip install fake-useragent连接数据库 $ pip3 install PyMySQL发起…

文章目录

  • 1 第三方库
  • 2 爬取
    • 2.1 初始化函数
    • 2.2 结束时关闭数据库
    • 2.3 生成header
    • 2.4 获取请求body
    • 2.5 解析异步json数据
    • 2.6 使用BS4的find方法解析
    • 2.7 写入口函数
    • 2.8 调用
  • 3 完整代码

1 第三方库

  • 获取随机UA
pip install fake-useragent
  • 连接数据库
$ pip3 install PyMySQL
  • 发起请求
pip install requests
  • 解析页面
pip install beautifulsoup4
  • 进度条
pip install tqdm

2 爬取

2.1 初始化函数

  • 新建爬虫类
class mySpider:
  • 创建数据库连接和初始化url
# 初始化urldef __init__(self, url):self.url = url# 计数,请求一个页面的次数,初始值为1self.count = 1# 数据库连接对象self.db = pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='test')# 创建游标对象self.cursor = self.db.cursor()

2.2 结束时关闭数据库

  • 关闭数据库释放资源,方法运行完后调用。
# 结束断开数据库连接def __del__(self):self.cursor.close()self.db.close()print("关闭数据库!")

2.3 生成header

  • 使用第三方库fake-useragent生成随机UA
# 获取一个headerdef getHeader(self):# 实例化ua对象ua = UserAgent()# 随机获取一个uaheaders = {'User-Agent': ua.random}return headers

2.4 获取请求body

  • 注意有返回值的递归,要把返回值返回,回调时加return
def getBody(self, url, send_type, data):# 每次请求都随机停顿一些时间# time.sleep(random.randint(1, 2))# 在超时时间内,对于失败页面尝试请求三次if self.count <= 3:try:if send_type == 'get':res = requests.get(url=url, headers=self.getHeader(), params=data, timeout=2)elif send_type == 'post':res = requests.post(url=url, headers=self.getHeader(), data=data, timeout=2)else:print("未输入send_type,直接返回None")res = Nonereturn resexcept Exception as e:print(e)self.count += 1print(f"第{self.count}次,发起请求")# 再次调用自己,并把值返回,(注意要加return)return self.getBody(url, send_type, data)

2.5 解析异步json数据

  • 解析异步json数据
def parseData(self, dataList):# 循环查看详情for row in tqdm(dataList, desc='爬取进度'):# 请求详情页urlurlDetail = f"https://www.baidu.com/CTMDS/pub/PUB010100.do?method=handle04&compId={row['companyId']}"# 发起请求# 每次请求都初始化一次self.countself.count = 1res = self.getBody(url=urlDetail, send_type='get', data={})if res is not None:# 解析htmlself.parseHtml(row=row, htmlText=res.text)else:print(f"{urlDetail}请求失败!")

2.6 使用BS4的find方法解析

  • find_all() 方法用来搜索当前 tag 的所有子节点,并判断这些节点是否符合过滤条件,最后以列表形式将符合条件的内容返回,语法格式如下
    find_all( name , attrs , recursive , text , limit )
  • 参数说明
  • name:查找所有名字为 name 的 tag 标签,字符串对象会被自动忽略。
  • attrs:按照属性名和属性值搜索 tag 标签,注意由于 class 是 Python 的关键字吗,所以要使用 “class_”。
  • recursive:find_all() 会搜索 tag 的所有子孙节点,设置 recursive=False 可以只搜索 tag 的直接子节点。
  • text:用来搜文档中的字符串内容,该参数可以接受字符串 、正则表达式 、列表、True。
  • limit:由于 find_all() 会返回所有的搜索结果,这样会影响执行效率,通过 limit 参数可以限制返回结果的数量。
def parseHtml(self, row, htmlText):soup = BeautifulSoup(htmlText, 'html.parser')# 获取备案信息divList = soup.find_all('div', class_=['col-md-8'])divtextList = [re.sub(r'\s+', '', div.text) for div in divList]# 获取其他机构地址divListOther = soup.find_all('div', class_=['col-sm-8'])divtextListOther = [re.sub(r'\s+', '', div.text) for div in divListOther]otherOrgAdd = ','.join(divtextListOther)# 插入数据库companyId = row['companyId']linkTel = row['linkTel']recordNo = row['recordNo']areaName = row['areaName']linkMan = row['linkMan']address = row['address']compName = row['compName']recordStatus = row['recordStatus']cancelRecordTime = row.get('cancelRecordTime', '')compLevel = divtextList[2]recordTime = divtextList[6]sql1 = "insert INTO medical_register(company_id,area_name,record_no,comp_name,address,link_man,link_tel,record_status,comp_level,record_time,cancel_record_time,other_org_add) "sql2 = f"values('{companyId}','{areaName}','{recordNo}','{compName}','{address}','{linkMan}','{linkTel}','{recordStatus}','{compLevel}','{recordTime}','{cancelRecordTime}','{otherOrgAdd}')"sql3 = sql1 + sql2# 执行sqlself.cursor.execute(sql3)# 提交self.db.commit()# 获取备案专业和主要研究者信息tbody = soup.find('tbody')trList = tbody.find_all('tr')# 对tr循环获取tdfor tr in trList:tdList = tr.find_all('td')tdTextList = [td.text for td in tdList]tdTextList.insert(0, companyId)# print(tdTextList)# 插入数据库sql4 = "insert into medical_register_sub (company_id,professional_name,principal_investigator,job_title) values(%s,%s,%s,%s)"self.cursor.execute(sql4, tdTextList)# 提交到数据库self.db.commit()

2.7 写入口函数

  • 这里pageSize直接干到最大,懂的都懂!
def run(self):try:# 拿第一页的数据data = {'pageSize': 1350, 'curPage': 1}# 每次请求都初始化一次self.countself.count = 1res = self.getBody(url=self.url, send_type='post', data=data)if res is not None:# 加载为jsonjsonRes = json.loads(res.text)# 查看响应状态码status = jsonRes['success']# 如果状态为Trueif status == True:# 获取数据dataList = jsonRes['data']# 处理数据self.parseData(dataList=dataList)else:print(f"{self.url}请求失败")except Exception as e:print('发生错误!', e)

2.8 调用

  • 调用
if __name__ == '__main__':spider = mySpider('https://www.baidu.com/CTMDS/pub/PUB010100.do?method=handle05')spider.run()

3 完整代码

  • 完整代码
import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import time
import random
import json
import re
import pymysql
from tqdm import tqdmclass mySpider:# 初始化urldef __init__(self, url):self.url = url# 计数,请求一个页面的次数,初始值为1self.count = 1# 数据库连接对象self.db = pymysql.connect(host='localhost',port=3306,user='root',password='logicfeng',database='test2')# 创建游标对象self.cursor = self.db.cursor()# 结束断开数据库连接def __del__(self):self.cursor.close()self.db.close()print("关闭数据库!")# 获取一个headerdef getHeader(self):# 实例化ua对象ua = UserAgent()# 随机获取一个uaheaders = {'User-Agent': ua.random}return headers# 获取请求bodydef getBody(self, url, send_type, data):# 每次请求都随机停顿一些时间# time.sleep(random.randint(1, 2))# 在超时时间内,对于失败页面尝试请求三次if self.count <= 3:try:if send_type == 'get':res = requests.get(url=url, headers=self.getHeader(), params=data, timeout=2)elif send_type == 'post':res = requests.post(url=url, headers=self.getHeader(), data=data, timeout=2)else:print("未输入send_type,直接返回None")res = Nonereturn resexcept Exception as e:print(e)self.count += 1print(f"第{self.count}次,发起请求")# 再次调用自己,并把值返回,(注意要加return)return self.getBody(url, send_type, data)# 解析bodydef parseData(self, dataList):# 循环查看详情for row in tqdm(dataList, desc='爬取进度'):# 请求详情页urlurlDetail = f"https://www.baidu.com/CTMDS/pub/PUB010100.do?method=handle04&compId={row['companyId']}"# 发起请求# 每次请求都初始化一次self.countself.count = 1res = self.getBody(url=urlDetail, send_type='get', data={})if res is not None:# 解析htmlself.parseHtml(row=row, htmlText=res.text)else:print(f"{urlDetail}请求失败!")# 解析页面def parseHtml(self, row, htmlText):soup = BeautifulSoup(htmlText, 'html.parser')# 获取备案信息divList = soup.find_all('div', class_=['col-md-8'])divtextList = [re.sub(r'\s+', '', div.text) for div in divList]# 获取其他机构地址divListOther = soup.find_all('div', class_=['col-sm-8'])divtextListOther = [re.sub(r'\s+', '', div.text) for div in divListOther]otherOrgAdd = ','.join(divtextListOther)# 插入数据库companyId = row['companyId']linkTel = row['linkTel']recordNo = row['recordNo']areaName = row['areaName']linkMan = row['linkMan']address = row['address']compName = row['compName']recordStatus = row['recordStatus']cancelRecordTime = row.get('cancelRecordTime', '')compLevel = divtextList[2]recordTime = divtextList[6]sql1 = "insert INTO medical_register(company_id,area_name,record_no,comp_name,address,link_man,link_tel,record_status,comp_level,record_time,cancel_record_time,other_org_add) "sql2 = f"values('{companyId}','{areaName}','{recordNo}','{compName}','{address}','{linkMan}','{linkTel}','{recordStatus}','{compLevel}','{recordTime}','{cancelRecordTime}','{otherOrgAdd}')"sql3 = sql1 + sql2# 执行sqlself.cursor.execute(sql3)# 提交self.db.commit()# 获取备案专业和主要研究者信息tbody = soup.find('tbody')trList = tbody.find_all('tr')# 对tr循环获取tdfor tr in trList:tdList = tr.find_all('td')tdTextList = [td.text for td in tdList]tdTextList.insert(0, companyId)# print(tdTextList)# 插入数据库sql4 = "insert into medical_register_sub (company_id,professional_name,principal_investigator,job_title) values(%s,%s,%s,%s)"self.cursor.execute(sql4, tdTextList)# 提交到数据库self.db.commit()# 入口函数def run(self):try:# 拿第一页的数据data = {'pageSize': 1350, 'curPage': 1}# 每次请求都初始化一次self.countself.count = 1res = self.getBody(url=self.url, send_type='post', data=data)if res is not None:# 加载为jsonjsonRes = json.loads(res.text)# 查看响应状态码status = jsonRes['success']# 如果状态为Trueif status == True:# 获取数据dataList = jsonRes['data']# 处理数据self.parseData(dataList=dataList)else:print(f"{self.url}请求失败")except Exception as e:print('发生错误!', e)if __name__ == '__main__':spider = mySpider('https://www.百度.com/CTMDS/pub/PUB010100.do?method=handle05')spider.run()
http://www.shuangfujiaoyu.com/news/50139.html

相关文章:

  • 分享惠网站怎么做外贸营销网站制作公司
  • 简洁大气企业网站欣赏微信营销成功案例8个
  • 新手做网站起步教程海外网站推广优化专员
  • wix做的网站在国内访问不了电商运营推广
  • 青岛海诚互联做网站好吗广东广州重大新闻
  • 网站数据库转移广州现在有什么病毒感染
  • 做网站找什么公司工作宁德市有几个区几个县
  • 韩国男女真人做视频网站优化网站关键词优化
  • 音乐网站建设目标百度竞价排名正确解释
  • 临湘网站建设百度下载软件
  • 怎样建设网站内容店铺推广软文300字
  • 泉山区城乡建设局网站百度网址安全检测
  • 江门网站建设设计app拉新推广平台有哪些
  • 网站强制使用极速模式优化疫情防控 这些措施你应该知道
  • 天津网站建设服务好百度搜索关键词排名靠前
  • 中药网站模板seo分析网站
  • 大连做网站报价湖南网站托管
  • 学设计网站成都网站优化公司
  • php开发一个企业网站价格seo内容优化是什么意思
  • 怎么设置网站的关键字百度关键词搜索引擎排名优化
  • 机关网站建设管理工作自查报告网络营销策略概念
  • 选择邯郸做网站企业宣传网站
  • win7 做网站服务器网络平台怎么创建
  • vs2010做网站前台青岛网站设计公司哪家好
  • 专门做设计的网站有哪些搜外网 seo教程
  • 广州网站制作公司 番禺seo从入门到精通
  • 苏州专业网站建设的公司怎么查询百度收录情况
  • 自己搞网站做外贸google adwords关键词工具
  • 天津网站制作培训2021年中国关键词
  • wordpress前端开发上海百度seo优化