赞
踩
古人说:成功的关键在于坚持不懈,所以小编晚上跟着B站一起学习了,并写出了这篇文章,学习在于努力
本文获取的是携程旅游网站中不同景点的评论数据,
1.导入相应的模块
- import requests
- import json
- import csv
2.定义postUrl变量为携程网站评论数据请求的URL。接着定义urls列表,包含不同景点的poiId和名称
- postUrl = "https://m.ctrip.com/restapi/soa2/13444/json/getCommentCollapseList"
-
- # 将景点poiId和名称添加到此处
- urls = [
- ['76865', '星海广场'],
- ['75628', '棒棰岛'],
- ['75633', '大连森林动物园'],
- ['60514877', '三寰牧场'],
- ['75635', '劳动公园'],
- ['23035466', '东港音乐喷泉广场'],
- ['79494', '海之韵广场'],
- ['87618', '金石滩度假区'],
- ['87748', '滨海路'],
- ['87647', '滨海国家地质公园'],
- ['24845945', '莲花山观景台'],
- ['92196', '白玉山景区'],
- ['13301914', '大连天门山国家森林公园'],
- ]
3.遍历urls列表,对于每个景点,首先定义data_pre变量,包含评论数据请求的参数,其中poiId为当前景点的poiId
- for id in urls:
- print("正在爬取景点:", id[1])
- # 通过返回值判断总评论数,每页9条,计算出总页数,对大于2000条的数据只爬取两千条
- data_pre = {
- "arg": {
- "channelType": 2,
- "collapseType": 0,
- "commentTagId": 0,
- "pageIndex": 1,
- "pageSize": 10,
- "poiId": id[0],
- "sourceType": 1,
- "sortType": 3,
- "starType": 0
- },
- "head": {
- "cid": "09031069112760102754",
- "ctok": "",
- "cver": "1.0",
- "lang": "01",
- "sid": "8888",
- "syscode": "09",
- "auth": "",
- "xsid": "",
- "extension": []
- }
- }
4.发送post请求获取该景点评论的总页数,将返回的数据解析为json格式,从中获取评论总数,计算出总页数total_page。如果总页数大于300,则将total_page设置为300。接着遍历1到total_page,对于每一页,定义data变量,包含评论数据请求的参数,其中pageIndex为当前页数。
- html = requests.post(postUrl, data=json.dumps(data_pre)).text
- html = json.loads(html)
-
- # 确定总页数总页数
- total_page = int(html['result']['totalCount'] / 10)
- if total_page > 300:
- total_page = 300
- # 遍历查询评论
- print("总页数:", total_page, "爬取中")
5.发送post请求获取评论数据,将返回的数据解析为json格式,从中获取每条评论的内容result,并将其保存到csv文件中。最后输出该景点的名称和爬取完成的提示信息。
- # 创建写入csv文件
- path = '景点数据.csv'
- xuhao = 0
- with open(path, 'w', newline='', encoding='utf-8') as f:
- file = csv.writer(f)
- file.writerow(['序号', '景区ID', '景区名称', '评论'])
- for page in range(1, int(total_page) + 1):
- data = {
- "arg": {
- "channelType": 2,
- "collapseType": 0,
- "commentTagId": 0,
- "pageIndex": page,
- "pageSize": 10,
- "poiId": id[0],
- "sourceType": 1,
- "sortType": 3,
- "starType": 0
- },
- "head": {
- "cid": "09031069112760102754",
- "ctok": "",
- "cver": "1.0",
- "lang": "01",
- "sid": "8888",
- "syscode": "09",
- "auth": "",
- "xsid": "",
- "extension": []
- }
- }
- html = requests.post(postUrl, data=json.dumps(data)).text
- html = json.loads(html)
- # 获取评论
- for j in range(10):
- result = html['result']['items'][j]['content']
- file.writerow([xuhao, id[0], id[1], result])
- print([xuhao, id[0], id[1], result])
- xuhao += 1
- print(id[1], "爬取完成")
常用的获取数据工具包括Scrapy、BeautifulSoup、Selenium等。Scrapy是一个Python编写的开源网络爬虫框架,可以快速高效地进行数据爬取,支持多线程、分布式爬取等功能。BeautifulSoup是一个Python库,可以快速解析HTML和XML文档,提取需要的信息。Selenium是一个自动化测试工具,可以模拟人类操作浏览器,对于一些需要登录或滑动验证码的网站爬取非常有用。
除了工具,还有一些常用的技巧可以提高数据爬取的效率。例如,设置合适的请求头可以避免被网站反爬虫机制拦截;使用代理IP可以避免频繁访问同一网站被封禁IP;使用多线程或异步IO可以提高爬取速度等等。同时,还需要注意遵守网站的robots协议和法律法规,不进行恶意爬取和侵犯隐私等行为。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。