今天闲着无聊的时候逛qq群,看到有个教python的qq群里有个老师在爬这个网站http://www.endata.com.cn
看到是请求数据后返回的是json数据,比用xpath解析简单多了,于是乎,爬!!!
下面是全部代码,还有些细节可以优化的。。。。用得到的话自己优化下吧。
import requests
import time
import json
import csv
headers={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3722.400 QQBrowser/10.5.3751.400',
}
with open('text111.csv', 'a+', newline='', encoding='utf-8')as ff: # 给表的第一行加上表头
csw = csv.writer(ff, dialect='excel')
csw.writerow(['排名','ID','电影名','英文名称','上映年份','票房'])
# 保存为csv文件定义函数
def write(a,b,c,d,e,f):
with open('text111.csv','a+',newline='',encoding='utf-8')as ff:
csw=csv.writer(ff,dialect='excel')
csw.writerow([a,b,c,d,e,f])
# 我把构造post请求的from表单和requests写在一起了,看着有点乱。。。
def main(xx):
time.sleep(0.8) # 每一条暂停0.8s,防止被封ip,我的代理池1星期没有维护了,代理ip都失效了。。。。
n=1
for page in range(1,xx):
data = {
'areaId': '50',
'typeId': '0',
'year': '0',
# 'initial': ,
'pageIndex': f'{page}', # ajax 通过post表单改变来提交获取数据,所以这里需要变化
'pageSize': '10',
'MethodName': 'BoxOffice_GetMovieData_List'
}
try: # 错误捕捉,保证发生错误也会继续的爬下去,
url='http://www.endata.com.cn/API/GetData.ashx'
html=requests.post(url,headers=headers,data=data)
a=json.loads(html.text) # 用json 转化成本地的字典
q=a['Data']['Table']
for x in q:
no=x['rowNum'] # 对字典的处理部分
id=x['ID']
name=x['MovieName']
MovieEnName=x['MovieEnName']
releaseYear=x['releaseYear']
amount=x['amount']
write(no,id,name,MovieEnName,releaseYear,amount)
print('写入完成','第',n,'页')
n+=1
except Exception as e:
print('出错了',e) # 异常捕捉
continue
if __name__ == '__main__':
main(100) # 调用函数 里面填写的数值为需要爬取的页数 1页十条数据
-
-
files.write(codecs.BOM_UTF8)
-
files.write(",".join("%s" % v for v in csv_header))
我打开csv文件查看后发现乱码,因为windows是gbk的
用上面第二行代码可以解决乱码问题
好了,结束