心血来潮去爬了一下深交所的部分数据(http://www.szse.cn/main/disclosure/jgxxgk/djggfbd/)
在爬的过程中发现,该网页跳转页码,但网址却一直不变,通过查看网页的post数据,发现有个控制页码的项
只要修改该项的值再post给网页就能实现页码的跳转,在网上查找具体方法后,改写了代码,能实现爬取任意页码的数据了
我的代码
# -*- coding:utf-8 -*-
import urllib.request, urllib.parse
from bs4 import BeautifulSoup
import time
def get_info(start=1,end=1):
info = {} #储存目标数据
url = 'http://www.szse.cn/main/disclosure/jgxxgk/djggfbd/' #目标链接
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36',
}
#爬取所选取页数区间数据,该网页跳转页码,网址不变
# 通过分析,post的数据中'tab1PAGENUM'是用来控制页码的,通过改变该键的值,来实现页码跳转
for i in range(start,end+1):
post_data = urllib.parse.urlencode({'tab1PAGENUM': i}).encode(encoding='UTF8') #需post的数据
#req = urllib.request.Request(url, headers=headers)
res = urllib.request.urlopen(url, post_data) #为data参数赋值
time.sleep(2) #防止访问太频繁
soup = BeautifulSoup(res, 'lxml')
titles = soup.find_all('td', class_='cls-data-th') #标题行
datas = soup.find_all('td', class_='cls-data-td') #数据行
num = int(len(datas) / len(titles)) #数据行数
#将数据写入本地文件
with open('/Users/zorro/Desktop/test1.txt', 'a') as fs:
for j in range(num):
for title, data in zip(titles, datas[12 * j:12 * (j + 1)]):
info[title.get_text()] = data.get_text()
s = str(info)
fs.writelines(s)
fs.writelines('\n')
print('Done!')
get_info(1,100) #爬取前一百页数据
总结
1.爬取过程不是很难,该网页无需用到headers即可爬取;
2.遇到的问题是页码变动但网址不变动,只要找到控制页码变动的项,把该值post给网页就能实现了;
3.问题解决过程中,查找了很多资料,也学到了很多,攻克每一个新遇到的问题,就是对自己的一次肯定,能提高自信,也能提高学习兴趣。