写爬虫遇到坑和总结

本文分享了使用Scrapy爬虫过程中的经验教训,包括如何精简请求头避免无效负载,解析并绕过网站前端JS加密策略的方法,通过两次解密获取关键参数,最终成功爬取目标数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一直在使用scrapy编写各种爬虫,遇到一些坑,下面来总结一下,以免下次遇到又花费很多时间

(1)

我们在请求前拼接headers时,并不需要把所有request headers都拼接上,可以使用在线http请求,如http://coolaf.com/去测试比如下面refer只要截取前面就可以,后面参数可能是动态生成的,对每次请求都一一对应的,只能适用一次请求,所以一次要爬取很多页面就把它去掉
这里写图片描述

(2)

有时候我们请求,即使把所有参数带上返回还是空
这里写图片描述
这种情况可能被加密了,可以看到参数eleven的值是64位无规律字符串,这就是网站在前端用js加密的key
这里写图片描述
我们可以找到网站js解密方法

这里写图片描述
解密步骤:解密使用普通js方法,去掉方法头尾在页面Console跑一次,会返回js方法,然后又去掉该js方法头尾再跑一次,这次就返回我们需要的密码了

代码解决方法
跟爬虫类似,根据url请求返回我们需要的加密js代码,去掉方法头
这里写图片描述

 url = 'http://hotels.ctrip.com/international/Tool/cas-ocanball.aspx?callback=%s&_=%s' % (n, t)
                headers = {'User-Agent': random.choice(user_agent_list),
                           'Referer': 'http://hotels.ctrip.com/international/%s.html?isFull=F' % hotel_id,
                           'Host': 'hotels.ctrip.com',
                           'Accept-Language': 'zh-CN,zh;q=0.9',
                           'Accept-Encoding': 'gzip, deflate'}
                # content = requests.get(url, headers=headers, proxies={'http': proxy}).content
                content = requests.get(url, headers=headers).content
                content = content.replace('eval', '')
                key = self.ec.jiemi_2(content, n, headers["Refe````````````
er"])

从代码看出,拿到一次解密返回的js代码,也就是上面的content,再进行第二次解密

 def jiemi_2(cls, js, callback, local):
        eval_js = cls.execute_script('return ' + js)
        index = eval_js.index('new Function')
        result = re.findall('\+\s([a-zA-Z0-9_]+)\s+\+', eval_js[index:])[0]
        index = eval_js.index(callback)
        eval_js = eval_js[14: index]
        eval_js = eval_js.replace('window.location.href', '"%s"' % local)
        key = cls.execute_script(eval_js + '; return ' + result)
        return key

第二次就是返回我们想要的key了
最后我们在scpray中间件,去调用我们的解密方法,拿到eleven密码,然后拼接参数就可以爬取我们想要的数据了

 eleven = self.js.jiemi_1(id)
 url = request.meta.get('target_url')
 request._set_url(url + ('&eleven=%s' % eleven))
<think>我们正在回答用户关于如何启动pyspider爬虫的问题。根据引用[1][2][3][5]中的信息,pyspider可以通过命令行启动,并且通常需要先创建一个项目,然后编爬虫脚本,最后运行爬虫。启动pyspider通常有两种方式:通过命令行直接启动,或者通过pyspider自带的Web界面进行操作。步骤:1.安装pyspider:确保已经正确安装pyspider。如果安装遇到问题,可以参考引用[4]中的避指南。2.创建项目(可选):如果是新项目,可以使用`pyspidercreate`命令创建,但通常我们也可以直接编脚本。3.编爬虫脚本:在项目中编爬虫脚本(通常是一个Python文件)。4.启动爬虫:使用`pyspider`命令启动爬虫。详细说明:根据引用[1][2]:-通过命令行创建一个新的爬虫项目:`pyspidercreateproject_name`-然后进入项目目录,编爬虫脚本。但是,实际上pyspider启动爬虫的方式是运行`pyspider`命令,然后通过Web界面来管理爬虫项目(包括创建、编辑、运行等)。也可以直接运行单个爬虫脚本(使用`pyspiderrun`命令)。引用[5]提到在CentOS上搭建PySpider爬虫服务,其中安装依赖库后,可以直接运行`pyspider`命令启动。因此,启动pyspider爬虫的常用方法:1.启动pyspider服务(包括Web界面):在命令行输入:pyspiderall这样会启动pyspider的各个组件(包括调度器、抓取器、Web界面等),然后可以通过Web界面(默认端口5000)来管理爬虫项目。2.通过Web界面操作:在浏览器中访问:http://localhost:5000然后可以创建项目、编脚本、运行爬虫。3.直接运行单个爬虫脚本(不通过Web界面):也可以使用以下命令直接运行一个爬虫脚本:pyspiderrun[options]<spider_script>注意:在运行之前,请确保已经正确安装了pyspider。如果安装过程中出现问题(如引用[4]中提到的错误),需要先解决安装问题。另外,引用[3]提供了项目地址,用户可以参考官方文档获取更多信息。总结启动步骤:方法一(推荐使用Web界面):步骤1:在命令行运行`pyspiderall`步骤2:打开浏览器,访问http://localhost:5000步骤3:在Web界面中创建项目、编爬虫脚本,然后点击“Run”按钮运行爬虫。方法二(命令行直接运行):步骤1:编爬虫脚本,例如:my_spider.py步骤2:在命令行运行`pyspiderrun-cconfig.jsonmy_spider.py`(其中config.json是配置文件,可选)注意事项:-如果遇到端口冲突,可以使用`--port`参数指定其他端口,例如:`pyspiderall--port5010`-如果需要后台运行,可以使用`nohup`命令(Linux)或将其作为服务运行。根据引用[5],在CentOS系统中,可能需要先安装依赖库。因此,我们给出如下回答:</think>### 启动PySpider爬虫的方法与指南 PySpider启动主要通过命令行操作,以下是详细步骤: #### 一、基础启动流程 1. **启动PySpider服务** 在终端执行: ```bash pyspider all ``` * 这会同时启动调度器(Scheduler)、抓取器(Fetcher)、处理器(Processor)结果处理器(Result Worker) * 默认Web UI监听端口:`http://localhost:5000` 2. **访问Web控制台** 浏览器打开 `http://localhost:5000` 可: - 创建/管理爬虫项目 - 实时监控任务状态 - 看抓取结果日志 3. **启动单个爬虫** 对已有爬虫项目执行: ```bash pyspider -c config.json [project_name] ``` * `config.json` 为配置文件(可选) * `project_name` 需替换为实际项目名 #### 二、关键配置项 常用启动参数: ```bash pyspider all \ --port 5010 # 修改Web UI端口 --phantomjs-proxy 127.0.0.1:25555 # 设置PhantomJS代理 --queue-maxsize 500 # 调整任务队列容量 --debug # 调试模式 ``` #### 三、生产环境部署 1. **后台运行** 使用 `nohup` 保持服务持续运行: ```bash nohup pyspider all > pyspider.log 2>&1 & ``` 2. **分布式部署** 在多台机器分别启动不同组件: ```bash # 调度器节点 pyspider scheduler --database mysql://user:pass@host/db # 抓取器节点 pyspider fetcher --proc-per-worker 10 # 结果处理器 pyspider result_worker ``` #### 四、常见问题解决 - **端口冲突**: 使用 `--port` 指定新端口,例如 `pyspider all --port 5010` - **依赖缺失**: 确保安装必要库(参考安装文档[^5]): ```bash pip install pyspider phantomjs mysql-connector ``` - **Windows启动错误**: 若遇 `Fatal error in launcher`,尝试: ```bash python -m pyspider all # 使用模块方式启动 ``` #### 五、操作示例 1. 创建新项目: ```bash pyspider create --project my_crawler ``` 2. 编辑脚本 `my_crawler.py` 后,通过Web UI或命令行启动: ```bash pyspider run my_crawler.py ``` > **提示**:建议结合 `crontab` 或 `systemd` 实现开机自启进程守护,详细配置参考官方文档[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值