爬取恩芝数据

今天闲着无聊的时候逛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页十条数据
  1. files = open(path,"w")
  2. files.write(codecs.BOM_UTF8)
  3. files.write(",".join("%s" % v for v in csv_header))
    我打开csv文件查看后发现乱码,因为windows是gbk的
    用上面第二行代码可以解决乱码问题
好了,结束
搜索