学习爬虫有一段时间了,对遇到的一些问题进行一下总结。

  爬虫流程可大致分为:请求网页(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爬虫爬取网页思路及常见问题(原创)的更多相关文章

  1. Python3爬虫----爬取网页内的图片

    无聊把公司内网爬了一遍. https://github.com/gig886/Python/tree/master/爬虫

  2. node:爬虫爬取网页图片

    代码地址如下:http://www.demodashi.com/demo/13845.html 前言 周末自己在家闲着没事,刷着微信,玩着手机,发现自己的微信头像该换了,就去网上找了一下头像,看着图片 ...

  3. erlang 爬虫——爬取网页图片

    说起爬虫,大家第一印象就是想到了python来做爬虫.其实,服务端语言好些都可以来实现这个东东. 在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌 ...

  4. 【Python】python3 正则爬取网页输出中文乱码解决

    爬取网页时候print输出的时候有中文输出乱码 例如: \\xe4\\xb8\\xad\\xe5\\x8d\\x8e\\xe4\\xb9\\xa6\\xe5\\xb1\\x80 #爬取https:// ...

  5. python3爬虫爬取猫眼电影TOP100(含详细爬取思路)

    待爬取的网页地址为https://maoyan.com/board/4,本次以requests.BeautifulSoup css selector为路线进行爬取,最终目的是把影片排名.图片.名称.演 ...

  6. python3 爬虫---爬取糗事百科

    这次爬取的网站是糗事百科,网址是:http://www.qiushibaike.com/hot/page/1 分析网址,参数''指的是页数,第二页就是'/page/2',以此类推... 一.分析网页 ...

  7. python3 爬虫---爬取豆瓣电影TOP250

    第一次爬取的网站就是豆瓣电影 Top 250,网址是:https://movie.douban.com/top250?start=0&filter= 分析网址'?'符号后的参数,第一个参数's ...

  8. python3 爬虫爬取深圳公租房轮候库(深圳房网)

    深圳公租房轮候库已经朝着几十万人的规模前进了,这是截至16年10月之前的数据了,贴上来大家体会下 所以17年已更新妥妥的10W+ 今天就拿这个作为爬虫的练手项目 1.环境准备: 操作系统:win10 ...

  9. python3爬虫-爬取58同城上所有城市的租房信息

    from fake_useragent import UserAgent from lxml import etree import requests, os import time, re, dat ...

随机推荐

  1. 浅析JavaScript的垃圾回收机制

    JavaScript语言是一门优秀的脚本语言.其中包含脚本语言的灵活性外还拥有许多高级语言的特性.例如充许构建和实例化一个对象,垃圾回收机制(GC:Garbage Collecation).通常我们使 ...

  2. Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) D

    D. Bear and Two Paths time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  3. POJ2699:The Maximum Number of Strong Kings(枚举+贪心+最大流)

    The Maximum Number of Strong Kings Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2488 ...

  4. E. Sonya and Ice Cream(开拓思维)

    E. Sonya and Ice Cream time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  5. System l类arraycopy的用法

    package org.springframework; /** * @author 秦林森 */ public class Test { public static void main(String ...

  6. 7月20号day12总结

    今天学习过程和小结 先进行了复习,主要 1,hive导入数据的方式有 本地导入  load data [local] inpath 'hdfs-dir' into table tablename; s ...

  7. white-space——处理元素内的空白

      定义和用法 white-space 属性设置如何处理元素内的空白.这个属性声明建立布局过程中如何处理元素中的空白符.值 pre-wrap 和 pre-line 是 CSS 2.1 中新增的. 默认 ...

  8. Java之戳中痛点 - (3)三目运算符的两个操作数类型尽量一致

    先看一个例子: package com.test; public class TernaryOperator { public static void main(String[] args) { in ...

  9. SQL优化单表案例

    数据准备: -- 创建数据库 mysql> create database db_index_case; Query OK, row affected (0.00 sec) -- 查看数据库 m ...

  10. Linux下文件解压命令

    1.压缩命令: 命令格式:tar -zcvf 压缩文件名.tar.gz 被压缩文件名 可先切换到当前目录下.压缩文件名和被压缩文件名都可加入路径. 2.解压缩命令: 命令格式:tar -zxvf 压缩 ...