文章目录
python爬虫五部曲:
-
第一步:安装requests库
-
第二步:获取爬虫所需的header和cookie
-
第三步:获取网页
-
第四步:解析网页
-
第五步:分析得到的Json数据
1. 第一步:安装requests库
在程序中引用两个库的书写是这样的:
import requests
以pycharm为例,在pycharm上安装这个库的方法。在菜单【文件】–>【设置】->【项目】–>【Python解释器】中,在所选框中,点击软件包上的+号就可以进行查询插件安装了。有过编译器插件安装的hxd估计会比较好入手。具体情况就如下图所示。
2. 第二步:获取爬虫所需的header和cookie
以爬取 巨潮网 公司年报 的爬虫程序为例。获取header和cookie是一个爬虫程序必须的,它直接决定了爬虫程序能不能准确的找到网页位置进行爬取。
- 首先通过浏览器,打开 巨潮网,
打开 巨潮网 http://www.cninfo.com.cn/new/index
输入自己关注的股票,找到公告相关信息,选择:更多
- [x]按下F12,就会出现网页的js语言设计部分,找到网页上的Network部分。并选中“放大镜(过滤)”,如下图所示:
- 然后按下ctrl+R刷新页面,此时发现右边 NetWork 部分出现很多信息。(如果进入后就有所需要的信息,就不用刷新了),当然刷新了也没啥问题。
- 在选中放大镜后的输入框中,输入其中一个关注的信息,比如:中信建投,通过 放大镜 搜索 功能,搜索自己关注的信息,并点击 ”刷新按钮“,就会在Search 结果中,显示相关的信息
双击选中上述查询结果中的某一条数据(上图中 红色框的部分),此时会发现右下部分 网络信息 也会同步自动选中某一行信息,如下图所示:
-
也可以通过 Network --> Filter 功能,搜索网址中的关键信息 的方式进行过滤
在 Network --> Filter 中,依据网页中的关键信息进行过滤,如输入: 中信建投,但本例中并没有信息显示
-
拷贝其 cURL 信息
在 Network --> Filter 中,关键信息进行过滤后,我们浏览Name这部分,找到我们想要爬取的文件(网络信息),鼠标右键,选择copy,复制下网页的URL。
过滤后,有效信息会少很多,如下所示。选中所需的条目,右键 --> Copy --> Copy as cURL
curl 'http://www.cninfo.com.cn/new/hisAnnouncement/query' \
-H 'Accept: application/json, text/javascript, */*; q=0.01' \
-H 'Accept-Language: zh-CN,zh;q=0.9' \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
-H 'Cookie: JSESSIONID=EF5F553523A7F57931788215EEA38C23; SF_cookie_4=17470996; insert_cookie=37836164; _sp_ses.2141=*; routeId=.uc2; _sp_id.2141=97e243ce-8c09-4be7-8850-ec31fc55deb6.1713703123.1.1713703185.1713703123.8e5a815e-52a3-4f02-880b-4bbd541f9bb6; SID=8fe2c8b0-1f78-4be2-8c4a-c780f514fd6c; cninfo_user_browse=300229,9900016933,%E6%8B%93%E5%B0%94%E6%80%9D' \
-H 'Origin: http://www.cninfo.com.cn' \
-H 'Proxy-Connection: keep-alive' \
-H 'Referer: http://www.cninfo.com.cn/new/disclosure/stock?orgId=9900016933&stockCode=300229' \
-H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' \
-H 'X-Requested-With: XMLHttpRequest' \
--data-raw 'stock=300229%2C9900016933&tabName=fulltext&pageSize=30&pageNum=1&column=szse&category=&plate=sz&seDate=&searchkey=&secid=&sortName=&sortType=&isHLtitle=true' \
--compressed \
--insecure
- 利用工具 Convert curl commands to code https://curlconverter.com/python/ 进行转换
转换后信息如下图所示,选择【Copy to clipboard】,并黏贴到Pycharm开发环境中即可直接使用:
转换后信息如下图所示,请关注:header 中的 传输格式为: Json
选择【Copy to clipboard】,并黏贴到Pycharm开发环境中即可直接使用:
选择【Copy to clipboard】, 拷贝到 pycharm 中,可直接作为源代码使用:
import requests
cookies = {
'JSESSIONID': 'EF5F553523A7F57931788215EEA38C23',
'SF_cookie_4': '17470996',
'insert_cookie': '37836164',
'_sp_ses.2141': '*',
'routeId': '.uc2',
'_sp_id.2141': '97e243ce-8c09-4be7-8850-ec31fc55deb6.1713703123.1.1713703185.1713703123.8e5a815e-52a3-4f02-880b-4bbd541f9bb6',
'SID': '8fe2c8b0-1f78-4be2-8c4a-c780f514fd6c',
'cninfo_user_browse': '300229,9900016933,%E6%8B%93%E5%B0%94%E6%80%9D',
}
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
# 'Cookie': 'JSESSIONID=EF5F553523A7F57931788215EEA38C23; SF_cookie_4=17470996; insert_cookie=37836164; _sp_ses.2141=*; routeId=.uc2; _sp_id.2141=97e243ce-8c09-4be7-8850-ec31fc55deb6.1713703123.1.1713703185.1713703123.8e5a815e-52a3-4f02-880b-4bbd541f9bb6; SID=8fe2c8b0-1f78-4be2-8c4a-c780f514fd6c; cninfo_user_browse=300229,9900016933,%E6%8B%93%E5%B0%94%E6%80%9D',
'Origin': 'http://www.cninfo.com.cn',
'Proxy-Connection': 'keep-alive',
'Referer': 'http://www.cninfo.com.cn/new/disclosure/stock?orgId=9900016933&stockCode=300229',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
data = {
'stock': '300229,9900016933',
'tabName': 'fulltext',
'pageSize': '30',
'pageNum': '1',
'column': 'szse',
'category': '',
'plate': 'sz',
'seDate': '',
'searchkey': '',
'secid': '',
'sortName': '',
'sortType': '',
'isHLtitle': 'true',
}
response = requests.post(
'http://www.cninfo.com.cn/new/hisAnnouncement/query',
cookies=cookies,
headers=headers,
data=data,
verify=False,
)
print(f'response= {response}')
print(f'response.text= {response.text}')
print(f'response.json= {response.json()}')
3. 第三步:获取网页
通过requests.get() 即可获取网页内容:
response = requests.post(
'http://www.cninfo.com.cn/new/hisAnnouncement/query',
cookies=cookies,
headers=headers,
data=data,
verify=False,
)
print(f'response= {response}')
print(f'response.text= {response.text}')
4. 第四步:解析网页
由于 get 的结果,就是 json 数据,所以后续只需要针对 json格式进行解析即可:
格式化后应答数据内容如下:
5. 第五步:解析 json 结构数据体
json_content = response.json()
print(f'json_content.totalSecurities = {json_content["totalSecurities"]}')
print(f'json_content.totalRecordNum = {json_content["totalRecordNum"]}')
print(f'json_content.totalpages = {json_content["totalpages"]}')
print(f'json_content.data.announcements.size() = {json_content["announcements"]}.size()')
for item in json_content["announcements"]:
print(f'secCode = {item["secCode"]}, '
f'secName = {item["secName"]}, '
f'announcementTitle = {item["announcementTitle"]}')
6. 代码实例以及结果展示
import requests
cookies = {
'JSESSIONID': 'EF5F553523A7F57931788215EEA38C23',
'SF_cookie_4': '17470996',
'insert_cookie': '37836164',
'_sp_ses.2141': '*',
'routeId': '.uc2',
'_sp_id.2141': '97e243ce-8c09-4be7-8850-ec31fc55deb6.1713703123.1.1713703185.1713703123.8e5a815e-52a3-4f02-880b-4bbd541f9bb6',
'SID': '8fe2c8b0-1f78-4be2-8c4a-c780f514fd6c',
'cninfo_user_browse': '300229,9900016933,%E6%8B%93%E5%B0%94%E6%80%9D',
}
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
# 'Cookie': 'JSESSIONID=EF5F553523A7F57931788215EEA38C23; SF_cookie_4=17470996; insert_cookie=37836164; _sp_ses.2141=*; routeId=.uc2; _sp_id.2141=97e243ce-8c09-4be7-8850-ec31fc55deb6.1713703123.1.1713703185.1713703123.8e5a815e-52a3-4f02-880b-4bbd541f9bb6; SID=8fe2c8b0-1f78-4be2-8c4a-c780f514fd6c; cninfo_user_browse=300229,9900016933,%E6%8B%93%E5%B0%94%E6%80%9D',
'Origin': 'http://www.cninfo.com.cn',
'Proxy-Connection': 'keep-alive',
'Referer': 'http://www.cninfo.com.cn/new/disclosure/stock?orgId=9900016933&stockCode=300229',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
data = {
'stock': '300229,9900016933',
'tabName': 'fulltext',
'pageSize': '30',
'pageNum': '1',
'column': 'szse',
'category': '',
'plate': 'sz',
'seDate': '',
'searchkey': '',
'secid': '',
'sortName': '',
'sortType': '',
'isHLtitle': 'true',
}
response = requests.post(
'http://www.cninfo.com.cn/new/hisAnnouncement/query',
cookies=cookies,
headers=headers,
data=data,
verify=False,
)
print(f'response= {response}')
print(f'response.text= {response.text}')
# print(f'response.json= {response.json()}')
json_content = response.json()
print(f'json_content.totalSecurities = {json_content["totalSecurities"]}')
print(f'json_content.totalRecordNum = {json_content["totalRecordNum"]}')
print(f'json_content.totalpages = {json_content["totalpages"]}')
print(f'json_content.data.announcements.size() = {json_content["announcements"]}.size()')
for item in json_content["announcements"]:
print(f'secCode = {item["secCode"]}, '
f'secName = {item["secName"]}, '
f'announcementTitle = {item["announcementTitle"]}')
运行结果: