import requests
from bs4 import BeautifulSoup
import pprint
import json
?导入爬虫所需要的包
def download_all_htmls():
htmls=[]
for idx in range(1):
url=f"http://data.eastmoney.com/zjlx/00000{idx+1}.html"
print("craw html:",url)
r=requests.get(url)
if r.status_code!=200:
raise Exception("error")
htmls.append(r.text)
return htmls
我们需要访问需要爬虫的页面,因此我们应在jupyter中将所需要的网页下载下来。定义一个函数,在其中通过for循环将我们所需的全部页面都访问,如果r.status_code跟200不等时报错,否则将页面全部下载(r.status_code==200这是一个HTTP状态代码,意思是“OK”(例如:服务器成功地响应了HTTP请求))将其返回,以便后面的调用。
htmls=download_all_htmls()
将页面全部显示
import re
def parse_single_html(html):
soup=BeautifulSoup(html,'html.parser')
a1=soup.find_all("body")
datas1=[]
datas2=[]
for body in a1:
title_node=(
body
.find("div",class_="sinstock-filter-wrap")
)
title=title_node.get_text()
title1=title.replace('\n',',')
t1=title1[4:]
t2=t1[:-4]
t3=t2.split(',')
del t3[10:12]
title_lianjie=(
body
.find("div",class_="sinstock-filter-wrap")
.find("tbody")
.find_all("a")
)
a1=[]
for i in range(20):
link=title_lianjie[i]["href"]
i=i+1
a1.append(link)
datas1.append(a1)
datas2.append(t3)
return (datas1)
这一步的目的是通过函数访问tbody的title和链接(其中会遇到的问题:1.输出的title是字符串,而且有很多“\n”不方便后续的操作,对此我的操作是首先将所有的“\n”替换为‘’,”,此时之前的字符串变成了列表,会发现还是有一些没有用的元素,通过索引操作将其剔除,得到你要的列表),返回时我建议分开返回,否则后续会报错。
all_datas1=[]
for html in htmls:
all_datas1.extend(parse_single_html(htmls[0]))
打印所有页面返回的内容,并将其装到all_datas1中
import pandas as pd
import numpy as np
data1= pd.DataFrame(data=all_datas1,dtype=np.float64)
导入包并将all_datas1转化为DataFrame并将其存储到data1
from sqlalchemy import create_engine
import pymysql
import pandas as pd
from sqlalchemy import create_engine
##将数据写入mysql的数据库,但需要先通过sqlalchemy.create_engine建立连接,且字符编码设置为utf8,否则有些latin字符不能处理
yconnect = create_engine('mysql+pymysql://root:root@localhost:3306/test?charset=utf8')
pd.io.sql.to_sql(data1,'test2', yconnect, schema='test', if_exists='append')
将data1输出结果存入mysql。
|