上次推文介绍了爬取新三板挂牌公司数据列表的过程和源代码。在上次推文的基础上,本篇文章将讲述如何爬取新三板挂牌公司的详细信息。
1.分析页面地址信息
在进行爬虫命令编写前,最重要的一个步骤是对数据的真实网络地址信息进行分析。首先在东方财富网数据中心→公司挂牌列表下找到挂牌公司明细,然后点击右侧的其中一家公司的公司代码链接到公司详情页,找到公司介绍栏目,发现公司介绍栏目中包含了两个子模块证券资料和公司资料,这两个子模块的内容即是要爬取的公司详细信息。以华峰动力为例,发现该挂牌公司对应的公司详细信息页面地址为http://xinsanban.eastmoney.com/F10/CompanyInfo/Introduction/873320.html,分析后发现,该地址信息包含了公司代码。在挂牌公司明细中我们点击并链接到另一家挂牌公司的详细信息,发现,该页面地址的前半部分和华峰动力完全一样,改变的知识地址信息中的公司代码部分。由此推断,公司详细信息页面地址有一串固定字符串和公司代码信息组成。查看公司详细信息页,发现源代码中包含了我们要爬取的信息。由此,确定了要爬取的真实信息地址及其构成。
2.导入需求库。
requests库:用于网络请求
csv库:用于csv文件的读取于写入
time库:用于时间管理和cpu休眠
random库:用于生成随机数
sys库:用于处理异常时退出
bs4中的BeautifulSoup模块:解析页面
import requests,csv,time,random,sys
from bs4 import BeautifulSoup as bs
3.编写实现函数
python不仅可以直接调用内置函数以及内置库中的函数,而且可以调用第三方函数,更重要的是,构造自己的函数对python来说相当简单。通过构造自己的函数,我们能够实现一些相对复杂而又特殊的功能,更重要的是构造函数非常灵活,而且能够使得程序逻辑更为简洁易懂,程序的复用性更高。因此,本文在爬取新三板挂牌公司的详细信息时通过构造几个功能各异的函数来满足要求。
请求页面函数
def get_html(url):
#请求时附加额外信息(params)
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'
}
try:
html = requests.get(url,headers=headers,timeout = 5)
return html
except Exception as e:
print(url,'不能连接服务器')
sys.exit(0)
解析页面函数
def html_parse():
html = get_html(url)
# 创建bs对象
soup = bs(html.text,'lxml')
# 获取公司信息
com_left_info = soup.find_all('span',{'class','company-page-item-left'}) #company_left_info为bs4.element.ResultSet
"""
item_left = []
for i in range(len(com_left_info)):
#print(com_left_info[i].get_text())
item_left.append(com_left_info[i].get_text())
"""
item_right =[]
com_right_info = soup.find_all('span',{'class','company-page-item-right'})
for k in range(len(com_right_info)):
#print(com_right_info[k].get_text())
item_right.append(com_right_info[k].get_text())
# 返回一个元组(a,b),也可以返回一个列表[a,b]
return item_right
写入信息函数
def write_to_csv():
print('数据写入中...')
tup = html_parse() # 返回的是元组
li = list(tup)
with open('D:/new_three/companyinfo.csv','a',newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(li)
csvfile.close()
读取公司代码函数
def read_csv():
with open('D:/new_three/新三板数据.csv','r',newline='') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
yield row[0].replace('.OC','')
生成地址函数
def com_url():
baseurl = 'http://xinsanban.eastmoney.com/F10/CompanyInfo/Introduction/'
cominfo = []
for k in read_csv():
cominfo_url = baseurl+str(k)+'.html'
cominfo.append(cominfo_url)
return cominfo #返回一个迭代
页面主体
if __name__=='__main__':
for url in com_url():
write_to_csv()
4.总结
.通过构造五个函数和页面主体,我们已经成功地实现了构造地址信息到请求网页,解析网页、写入文件的全部过程。虽然爬虫相对简单,但却非常有效,希望通过本次推文,大家对编写爬虫能够有进一步的了解。
以下奉上全部代码以供各位学习参考
import requests,csv,time,random,sys
from bs4 import BeautifulSoup as bs
def get_html(url):
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'
}
try:
html = requests.get(url,headers=headers,timeout = 5)
return html
except Exception as e:
print(url,'不能连接服务器')
sys.exit(0)
def html_parse():
html = get_html(url)
soup = bs(html.text,'lxml')
com_left_info = soup.find_all('span',{'class','company-page-item-left'}) #company_left_info为bs4.element.ResultSet
item_right =[]
com_right_info = soup.find_all('span',{'class','company-page-item-right'})
for k in range(len(com_right_info)):
item_right.append(com_right_info[k].get_text())
# 返回一个元组(a,b),也可以返回一个列表[a,b]
return item_right
def write_to_csv():
print('数据写入中...')
tup = html_parse() # 返回的是元组
li = list(tup)
with open('D:/new_three/companyinfo.csv','a',newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(li)
csvfile.close()
def read_csv():
with open('D:/new_three/新三板数据.csv','r',newline='') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
yield row[0].replace('.OC','')
def com_url():
baseurl = 'http://xinsanban.eastmoney.com/F10/CompanyInfo/Introduction/'
cominfo = []
for k in read_csv():
cominfo_url = baseurl+str(k)+'.html'
cominfo.append(cominfo_url)
return cominfo #返回一个迭代
if __name__=='__main__':
for url in com_url():
write_to_csv()