平安银行(000001)资金流向 _ 数据中心 _ 东方财富网 (eastmoney.com)
#导包
import requests
from bs4 import BeautifulSoup
import pandas as pd
【第一步】下载页面的HTML
构造函数download_all_htmls,下载页面的HTML
1、用requests.get函数获取html网页(构造一个向服务器请求资源的url对象,返回的是一个包含服务器资源的Response对象)
2、r.status_code返回http请求的返回状态:200表示连接成功,返回418表示爬取的网站有反爬虫机制,要向服务器发出爬虫请求,需要添加请求头headers
3、htmls.append(r.text)添加url对应的页面内容到列表htmls
def download_all_htmls():
htmls=[]
url=f"http://data.eastmoney.com/zjlx/000001.html"
print(url)
r=requests.get(url)
if r.status_code!=200:
raise Exception("error")
print(r)
htmls.append(r.text)
return htmls
【第二步】解析HTML得到数据
构造函数parse_single_html,用于解析单个html得到数据
import re
def parse_single_html(html):
soup=BeautifulSoup(html,'html.parser') #构建BeautifulSoup实例(第一个参数是要匹配的内容;第二个参数是要采用的模块,即规则)
items=(
soup.find("div",class_="main")
.find("div",class_="main-content")
.find("div",class_="framecontent")
.find("div",class_="sinstock-filter-wrap")
.find("table",class_="tab")
.find_all("td") #获取每一条信息,返回列表items
)
datas=[]
for item in items:
item=str(item) #先把每条原始信息转化成字符串,以便后续处理
if re.findall(r'<a href="(.*)">', item)!=[]: #网址内容不为空的情况
link=re.findall(r'a href="(.*)">', item)[0] #获取网址
title=re.findall(r'[\u4e00-\u9fa5]+', item)[0] #获取标题名称
datas.append({
"网址":link,
"名称":title
}) #每条信息存成字典,作为列表datas的一个元素
return datas
【第三步】DataFrame数据导入MySQL
import sqlalchemy
from sqlalchemy import create_engine
#建立连接
conn = create_engine('mysql+pymysql://root:123@localhost:3306/crawl?charset=utf8')
#写入数据,‘replace’表示如果同名表存在就替换掉
df.to_sql(name='df_1', con=conn,if_exists='replace',index=False,index_label='排名',
dtype={'网址': sqlalchemy.types.String(length=40),
'名称': sqlalchemy.types.String(length=20),
})
print('ok')
【完整代码】
import requests
from bs4 import BeautifulSoup
import pandas as pd
def download_all_htmls():
htmls=[]
url=f"http://data.eastmoney.com/zjlx/000001.html"
print(url)
r=requests.get(url)
if r.status_code!=200:
raise Exception("error")
print(r)
htmls.append(r.text)
return htmls
htmls=download_all_htmls()
import re
def parse_single_html(html):
soup=BeautifulSoup(html,'html.parser')
items=(
soup.find("div",class_="main")
.find("div",class_="main-content")
.find("div",class_="framecontent")
.find("div",class_="sinstock-filter-wrap")
.find("table",class_="tab")
.find_all("td")
)
datas=[]
for item in items:
item=str(item)
if re.findall(r'<a href="(.*)">', item)!=[]:
link=re.findall(r'a href="(.*)">', item)[0] #获取网址
title=re.findall(r'[\u4e00-\u9fa5]+', item)[0] #获取标题名称
datas.append({
"网址":link,
"名称":title
})
return datas
data=[]
data.extend(parse_single_html(htmls[0]))
print(data)
df=pd.DataFrame(data)
import sqlalchemy
from sqlalchemy import create_engine
#建立连接
conn = create_engine('mysql+pymysql://root:123@localhost:3306/crawl?charset=utf8')
#写入数据,‘replace’表示如果同名表存在就替换掉
df.to_sql(name='df_1', con=conn,if_exists='replace',index=False,index_label='排名',
dtype={'网址': sqlalchemy.types.String(length=40),
'名称': sqlalchemy.types.String(length=20),
})
print('ok')
|