python网页抓取功能非常强大,使用urllib或者urllib2可以很轻松的抓取网页内容。但是很多时候我们要注意,可能很多网站都设置了防采集功能,不是那么轻松就能抓取到想要的内容。
爬取的网站为:stat-nbacom,本文爬取的是NBA2016-2017赛季常规赛至2017年1月7日的数据
改变url_header和url_tail即可爬取特定的其他数据。
源代码如下:
[python] view plain copy
#coding=utf-8
import sys
reload(sys)
syssetdefaultencoding('utf-8')
import requests
import time
import urllib
from bs4 import BeautifulSoup
import re
from pyExcelerator import
def getURLLists(url_header,url_tail,pages):
"""
获取所有页面的URL列表
"""
url_lists = []
url_0 = url_header+'0'+url_tail
print url_0
url_listsappend(url_0)
for i in range(1,pages+1):
url_temp = url_header+str(i)+url_tail
url_listsappend(url_temp)
return url_lists
def getNBAAllData(url_lists):
"""
获取所有2017赛季NBA常规赛数据
"""
datasets = ['']
for item in url_lists:
data1 = getNBASingleData(item)
datasetsextend(data1)
#去掉数据里的空元素
for item in datasets[:]:
if len(item) == 0:
datasetsremove(item)
return datasets
def getNBASingleData(url):
"""
获取1个页面NBA常规赛数据
"""
QueryType=game&order=1&crtcol=date_out&GameType=season&PageNum=3000&Season0=2016&Season1=2017'
# html = requestsget(url)text
html = urlliburlopen(url)read()
# print html
soup = BeautifulSoup(html)
data = souphtmlbodyfind('tbody')text
list_data = datasplit('\n')
# with open('nba_datatxt','a') as fp:
# fpwrite(data)
# for item in list_data[:]:
# if len(item) == 0:
# list_dataremove(item)
return list_data
def saveDataToExcel(datasets,sheetname,filename):
book = Workbook()
sheet = bookadd_sheet(sheetname)
sheetwrite(0,0,u'序号')
sheetwrite(0,1,u'球队')
sheetwrite(0,2,u'时间')
sheetwrite(0,3,u'结果')
sheetwrite(0,4,u'主客')
sheetwrite(0,5,u'比赛')
sheetwrite(0,6,u'投篮命中率')
sheetwrite(0,7,u'命中数')
sheetwrite(0,8,u'出手数')
sheetwrite(0,9,u'三分命中率')
sheetwrite(0,10,u'三分命中数')
sheetwrite(0,11,u'三分出手数')
sheetwrite(0,12,u'罚球命中率')
sheetwrite(0,13,u'罚球命中数')
sheetwrite(0,14,u'罚球出手数')
sheetwrite(0,15,u'篮板')
sheetwrite(0,16,u'前场篮板')
sheetwrite(0,17,u'后场篮板')
sheetwrite(0,18,u'助攻')
sheetwrite(0,19,u'抢断')
sheetwrite(0,20,u'盖帽')
sheetwrite(0,21,u'失误')
sheetwrite(0,22,u'犯规')
sheetwrite(0,23,u'得分')
num = 24
row_cnt = 0
data_cnt = 0
data_len = len(datasets)
print 'data_len:',data_len
while(data_cnt< data_len):
row_cnt += 1
print '序号:',row_cnt
for col in range(num):
# print col
sheetwrite(row_cnt,col,datasets[data_cnt])
data_cnt += 1
booksave(filename)
def writeDataToTxt(datasets):
fp = open('nba_datatxt','w')
line_cnt = 1
for i in range(len(datasets)-1):
#球队名称对齐的 *** 作:如果球队名字过短或者为76人队是 球队名字后面加两个table 否则加1个table
if line_cnt % 24 == 2 and len(datasets[i]) < 5 or datasets[i] == u'费城76人':
fpwrite(datasets[i]+'\t\t')
else:
fpwrite(datasets[i]+'\t')
line_cnt += 1
if line_cnt % 24 == 1:
fpwrite('\n')
fpclose()
if __name__ == "__main__":
pages = int(1132/150)
url_header = 'hppage='
url_tail = '&QueryType=game&order=1&crtcol=date_out&GameType=season&PageNum=3000&Season0=2016&Season1=2017#label_show_result'
url_lists = getURLLists(url_header,url_tail,pages)
datasets = getNBAAllData(url_lists)
writeDataToTxt(datasets)
sheetname = 'nba normal data 2016-2017'
str_time = timestrftime('%Y-%m-%d',timelocaltime(timetime()))
filename = 'nba_normal_data'+str_time+'xls'
saveDataToExcel(datasets,sheetname,filename)
试试这样
header = {
"content-type": "application/json",
"a": jsondumps({"b": "b_value"}),
"some_param": jsondumps({"some_key_value": "some_string"})
}
也就是说用jsondumps把多余的嵌套变成字符串
程序如下:
#!/usr/bin/env python
#coding=utf-8
#读取pcap文件,解析相应的信息,为了在记事本中显示的方便,把二进制的信息
import struct
fpcap = open('testpcap','rb')
ftxt = open('resulttxt','w')
string_data = fpcapread()
#pcap文件包头解析
pcap_header = {}
pcap_header['magic_number'] = string_data[0:4]
pcap_header['version_major'] = string_data[4:6]
pcap_header['version_minor'] = string_data[6:8]
pcap_header['thiszone'] = string_data[8:12]
pcap_header['sigfigs'] = string_data[12:16]
pcap_header['snaplen'] = string_data[16:20]
pcap_header['linktype'] = string_data[20:24]
#把pacp文件头信息写入resulttxt
ftxtwrite("Pcap文件的包头内容如下: \n")
for key in ['magic_number','version_major','version_minor','thiszone',
'sigfigs','snaplen','linktype']:
ftxtwrite(key+ " : " + repr(pcap_header[key])+'\n')
#pcap文件的数据包解析
step = 0
packet_num = 0
packet_data = []
pcap_packet_header = {}
i =24
while(i<len(string_data)):
#数据包头各个字段
pcap_packet_header['GMTtime'] = string_data[i:i+4]
pcap_packet_header['MicroTime'] = string_data[i+4:i+8]
pcap_packet_header['caplen'] = string_data[i+8:i+12]
pcap_packet_header['len'] = string_data[i+12:i+16]
#求出此包的包长len
packet_len = structunpack('I',pcap_packet_header['len'])[0]
#写入此包数据
packet_dataappend(string_data[i+16:i+16+packet_len])
i = i+ packet_len+16
packet_num+=1
#把pacp文件里的数据包信息写入resulttxt
for i in range(packet_num):
#先写每一包的包头
ftxtwrite("这是第"+str(i)+"包数据的包头和数据:"+'\n')
for key in ['GMTtime','MicroTime','caplen','len']:
ftxtwrite(key+' : '+repr(pcap_packet_header[key])+'\n')
#再写数据部分
ftxtwrite('此包的数据内容'+repr(packet_data[i])+'\n')
ftxtwrite('一共有'+str(packet_num)+"包数据"+'\n')
ftxtclose()
fpcapclose()
最终得到的result文件如下所示:字段显示的都是十六进制,其中的数据部分和wireshark打开,显示的十六进制窗口一样。
1、首先链家网二手房主页最多只显示100页的房源数据,所以在收集二手房房源信息页面URL地址时会收集不全,导致最后只能采集到部分数据;解决方法是解决措施:将所有二手房数据分区域地进行爬取,100页最多能够显示3000套房,该区域房源少于3000套时可以直接爬取,如果该区域房源超过3000套可以再分成更小的区域。
2、其次爬虫程序如果运行过快,会在采集到两、三千条数据时触发链家网的反爬虫机制,所有的请求会被重定向到链家的人机鉴定页面,从而会导致后面的爬取失败;解决方法是为程序中每次>
以上就是关于request库用python3怎么伪装header爬取知乎全部的内容,包括:request库用python3怎么伪装header爬取知乎、如何用python爬取nba数据中心的数据、Python中用request添加headers发送请求,headers中数据只能是str或bytes吗,里面还有字典dict格式怎么办等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)