赞
踩
学习爬虫有一段时间了,对遇到的一些问题进行一下总结。
爬虫流程可大致分为:请求网页(request),获取响应(response),解析(parse),保存(save)。
下面分别说下这几个过程中可以出现的问题:
一、请求网页:向网站服务器发送请求
你可以这样理解,你在浏览器输入xxjpg.com,告诉这个网站,我想看你的内容,然后网站服务器收到这个请求后,会分析这个请求是否是允许的,如果是,则返回内容给你的浏览器,以源码形式呈现。
可能存在的问题:
网络请求不成功
分析:
a.本地网络不稳定
b.网站本身服务器问题(维护,升级balabala...)
c.被封IP啦
针对网络请求可能出现的问题,建议都进行异常处理。因为俗话说的好,网络连接有风险,异常处理很重要。针对网络不好的情况,建议设置timeout。
被封IP的问题,建议使用IP代理池。免费的网上也有,不过稳定性不是很好,可以用来个人学习。如果爬取数据是商用,建议使用收费的。
二、获取网页响应
发送请求成功,服务器也正常得到了响应,我们就可以看下得到的源码了。
可能存在的问题:
1.无法正常显示中文或乱码
分析:编码的问题
修改编码encoding="utf-8’可以解决问题。当然,如果你用pycharm之类的IDE,如果IDE内没有正确设置encoding,同样会出现无 法显示中文的问题,不过这时候你就不单单是爬虫爬取网页不显示中文的问题,你所有运行的程序输出都不能正常显示中文。
2.返回的源代码为空
分析:
a. 网站请求失败了(参见本文第一个过程)
b. 网站采取了反爬虫手段(大部分是这个原因)
一些常见的网站反爬措施包括审查请求头,我遇到较多的是审查User-Agent(确定是否是浏览器的行为),Referer(防止图片盗链)的,最郁闷的一次是刚开始学爬虫的时候下载了几百张叮当猫(擦....)。这两种解决方法比较简单,在请求头中伪装一下就好。
有一些网站,如果爬虫爬取速度过快,会封IP。建议使用IP代理池,限制爬取速度。另外还有一些网站会对cookie进行审查,如果不需要登录就能爬取的网站,考虑禁止cookie。当然,还有些网站复杂点的,要求登录验证,可以采取多个账号登录,形成一个cookie池。不过值得注意的是,cookie都是有期限的。
还有一种网站会用的反爬手段,就是验证码。简单的字符识别,考虑用ocr。滑动验证,考虑用selenium模拟人的动作。再复杂点的验证,真正的人都很难看清的那种。作为一个python爬虫,是不应该怕这个的,迎难而上,解决这种验证码的方法,就是,就是,求助人工打码平台(捂头。。别打脸)。当然,有人会说了,这个复杂的验证码问题自己都不能解决,太水了。其实,万物都有两面性,简单的验证码,用户体验会更好,但是安全性相对来说差一些。复杂的验证码,就正好相反了。你是不是曾经有过这样的经历,看个网站让输验证码,输来输去都是错的,让人想砸键盘。所以说,万事无绝对,爬虫也是如此。
当然,对于爬取难度很高的网页,还有其他的迂回路线。比如,你这个www的网站真鸡儿难爬,我就找找m站啊,wap站啊。或者有没有PC端啊,或者app啊,说不定更简单呢。
三、解析
很重要的一个阶段,我们最终需要的数据都需要从这里面产生,什么文本啦,图片啦,音频啦...等等。
可能存在的问题:解析出来的内容为空
a.童鞋,你确定你正则表达式写对了么,我这里正则表达式18式,500块一本要不要
b.妹纸,你确定css选择器写对了么,我这里有css速成指南,免费送你要不要。。诶,别走啊
c.骚年,你确定xpath写对了么,我这里。。
。。。好了,开个玩笑,其实这些东西写错是很正常的,特别是在网页dom超级恶心复杂的时候,多尝试就好。
如果确定表达式写的没问题,那么可能是响应(response)的问题。
n.获取到网页源代码并没有包含需要提取的元素,网页是js动态加载的,而这些数据在动态加载的过程中生成
举个例子,刷微博的时候,看到某一条微博评论数上千,但是点进去查看评论只有几十条。把评论拉到最下面,过几秒,又加载了一部分出来。这就是一个动态加载的过程。针对这种情况在请求网页的时候加上响应的参数即可。可以使用chrome浏览器F12来查看参数,也可以使用firefox的firebug插件来查看。对于参数加密的,可以考虑强行破解或者selenium模拟的方式来突破。
四、保存
将解析出来的结构化数据存储到本地磁盘或者数据库。
可能存在的问题:各种异常
分析:主要涉及的是各种IO操作,包括文件读写和数据库操作,可能出现的问题也来自于这些。做好异常处理,再有问题,google。
好了,本次基本总结就到这里。不过这都是粗略的思路。具体实现限于篇幅也没法具体展开。以后有机会再具体补充。
原创文章,转载请注明出处,谢谢!
2018-06-15
Python3爬虫----爬取网页内的图片
无聊把公司内网爬了一遍. https://github.com/gig886/Python/tree/master/爬虫
node:爬虫爬取网页图片
代码地址如下:http://www.demodashi.com/demo/13845.html 前言 周末自己在家闲着没事,刷着微信,玩着手机,发现自己的微信头像该换了,就去网上找了一下头像,看着图片 ...
erlang 爬虫——爬取网页图片
说起爬虫,大家第一印象就是想到了python来做爬虫.其实,服务端语言好些都可以来实现这个东东. 在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌 ...
【Python】python3 正则爬取网页输出中文乱码解决
爬取网页时候print输出的时候有中文输出乱码 例如: \xe4\xb8\xad\xe5\x8d\x8e\xe4\xb9\xa6\xe5\xb1\x80 #爬取https:// ...
python3爬虫爬取猫眼电影TOP100(含详细爬取思路)
待爬取的网页地址为https://maoyan.com/board/4,本次以requests.BeautifulSoup css selector为路线进行爬取,最终目的是把影片排名.图片.名称.演 ...
python3 爬虫---爬取糗事百科
这次爬取的网站是糗事百科,网址是:http://www.qiushibaike.com/hot/page/1 分析网址,参数''指的是页数,第二页就是'/page/2',以此类推... 一.分析网页 ...
python3 爬虫---爬取豆瓣电影TOP250
第一次爬取的网站就是豆瓣电影 Top 250,网址是:https://movie.douban.com/top250?start=0&filter= 分析网址'?'符号后的参数,第一个参数's ...
python3 爬虫爬取深圳公租房轮候库(深圳房网)
深圳公租房轮候库已经朝着几十万人的规模前进了,这是截至16年10月之前的数据了,贴上来大家体会下 所以17年已更新妥妥的10W+ 今天就拿这个作为爬虫的练手项目 1.环境准备: 操作系统:win10 ...
python3爬虫-爬取58同城上所有城市的租房信息
from fake_useragent import UserAgent from lxml import etree import requests, os import time, re, dat ...
随机推荐
16.检查是否为BST
题目描述 请实现一个函数,检查一棵二叉树是否为二叉查找树. 给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树 import java.util.*; /* ...
Unity Networking API文档翻译(一):Networking概述
写在翻译前的话: 我使用过Photon,研究过Ulink这些Unity提供的多人在线游戏服务器组件,这些商业组件虽然很好很强大.但是对于一个独立开发者来说,4000多软妹币还是点多.总想找一 ...
ubuntu修改文件访问权限
遇到“bash .....权限不够”的问题时, 从控制台进入到那个文件夹 chmod 777 * -R 全部子目录及文件权限改为 777
二十种实战调优MySQL性能优化的经验
二十种实战调优MySQL性能优化的经验 发布时间:2012 年 2 月 15 日 发布者: OurMySQL 来源:web大本营 才被阅读:3,354 次 消灭0评论 本文将为大家介 ...
Myeclipse2014配置JSF环境
首先创建一个普通的webproject,然后看官网教程喽 https://www.genuitec.com/products/myeclipse/learning-center/web/myeclip ...
vim 多行注释
多行注释: 1. 进入命令行模式,按ctrl + v进入 visual block模式,然后按j, 或者k选中多行,把需要注释的行标记起来 2. 按大写字母I,再插入注释符,例如// 3. 按esc键 ...
git pull error
在图形界面中,执行拉取操作时,出现下面的错误. You asked to pull from the remote 'origin', but did not specifya branch. Bec ...
【Nginx】启动,重启,关闭命令
原文地址 https://github.com/zhongxia245/blog/issues/18欢迎 star nginx启动,重启,关闭命令 时间:2016-09-23 16:52:22 启动 ...
body中相关标签
一.字体标签 字体标签包含:h1~h6......
48位MAC转化为唯一的128位IPV6地址
根据EUI_64规范,一个MAC地址生成唯一的一个IPV6地址. ①.反转MAC的第七位为1. ②.在24bit后加入FFFE. ③.在最前面加上FE80::. 示例:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。