文档章节

爬虫问题总结

o
 osc_mervd488
发布于 2018/04/21 23:32
字数 2224
阅读 11
收藏 0

精选30+云产品,助力企业轻松上云!>>>

本文档对日常学习中用 python 做数据爬取时所遇到的一些问题做简要记录,以便日后查阅,部分问题可能因为认识不到位会存在一些误解,敬请告知,万分感谢,共同进步。

估算网站规模

该小节主要针对于整站爬取的情况。
爬取整站之前,肯定是要先对一个网站的规模进行估计。这是可以使用google搜索查看大概有多少个网址,这里使用到google搜索的一个小技巧。


     
     
site:url地址

有的时候可查看网站的sitemap.xml,但它有时候会过期或者滞后,不是很准确。

识别网站所用技术

要爬的网站使用的技术会影响到我们所写的代码中的处理手段。
推荐使用builtwith这个第三方包,可以使用pip来安装。
简单使用如下:


     
     
In [ 1]: import builtwith
In [ 2]: builtwith.parse( ‘http://example.webscraping.com/’)
Out[ 2]:
{ u’javascript-frameworks’: [ u’jQuery’, u’Modernizr’, u’jQuery UI’],
u’programming-languages’: [ u’Python’],
u’web-frameworks’: [ u’Web2py’, u’Twitter Bootstrap’],
u’web-servers’: [ u’Nginx’]}

伪装成浏览器

UA,即 User-Agent,是Http协议的一部分,属于头域的组成部分,发送 http 请求时,请求头中会有 User-Agent字段。服务器通过该字段来分辨发送请求的浏览器类型、版本、内核以及操作系统信息等。
在浏览器 console 可用如下命令来获得该浏览器的 UA 标识


     
     
navigator .userAgent

部分网站不想被爬虫爬取就会检查 http 请求头的该字段内容, 所以在用爬虫做抓取时,通常要在请求头加上该字段,以把自己伪装成浏览器。有时候通过手机浏览器访问得到的页面会更加简洁,更容易抓取,所以伪装成手机浏览器也是一种好方法。
网上有很多整理的不同浏览器的 UA ,比如各种浏览器UserAgent一览表
浏览器野史 UserAgent列传(上)浏览器野史 UserAgent列传(下),这两篇文章细说了 UA 的来龙去脉,去感受下当时波澜壮阔的“浏览器之战”。

防盗链

部分服务器会检查 http 请求头的 Referer 字段来判断你是否是从指定页面跳转而来的,以达到防盗链的作用。因此在伪装请求头部的时候,该字段也是不容忽视的。

url 编码

我们发现,URL 中有时候存在中文,这是就需要对 url 进行编码。
可以先将中文转换成 utf-8 编码,然后使用 urllib2.quote 方法对参数进行 url 编码后传递。


     
     
import urllib
param = u’你好’
param = param.encode( ‘utf-8’)
param = urllib.quote(param)

对于 url 来说,之所以要进行编码,是因为 url 中有些字符会引起歧义。
同理使用 unquote 可以解码。

动态加载问题

经常会遇到这样情况:将网页拖到底部会自动往下加载新的数据,或者有加载更多这样的按钮,这里说的就是 AJAX 了。

AJAX 是 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)的缩写。它通过使用原有的 web 标准组件,实现了在不重新加载整个页面的情况下,与服务器进行数据交互。例如在新浪微博中,你可以展开一条微博的评论,而不需要重新加载,或者打开一个新的页面。但是这些内容并不是一开始就在页面中的(这样页面就太大了),而是在你点击的时候被加载进来的。这就导致了你抓取这个页面的时候,并不能获得这些评论信息(因为你没有『展开』)。

AJAX 一般是通过 XMLHttpRequest 对象接口发送请求的,XMLHttpRequest 一般被缩写为 XHR。

通过审查元素找请求的 js 地址

这些 js 的名字通常看起来与其他的不太一样。
澎湃网举个栗子,这才是发送请求获得文章的真正地址,


AJAX 的一种 常见用法是使用 AJAX 加载 JSON 数据,然后在浏览器端渲染。
这种情况很好处理,因为 python 自带的处理 json 的库,举个栗子:
豌豆荚安卓游戏排行榜,每次点击更多会加载新的数据。在审查元素里,可以看到每次点击 查看更多,都会返回一个包含应用数据详细信息的数据。


查看请求 json 数据的地址
http://apps.wandoujia.com/api/v1/apps?type=weeklytopgame&max=12&start=60
max 参数的值表示这一次请求返回多少个 app 信息, start 参数的值表示从第几个 app 开始,start 从 0 开始。

另外,在构建请求头时,应该加上这个参数 ‘X-Requested-With’: ‘XMLHttpRequest’,当使用 XHR 发送 AJAX 请求时 Header 会带上这个字段,常被用于判断是不是 AJAX 请求。

Selenium+PhantomJS

Selenium 是一个强大的网络数据采集工具,最初是为网站自动测试而开发的。它可以让浏览器自动加载页面,获取所需要的数据,甚至页面截屏,或者判断网站上某些动作事都发生。

对应的 python 库,可以用 pip 安装。
PhantomJS 是一个 headless browser,它会把网站加载到内存并执行页面上的 JavaScript,但是不会向用户展示网页的图形界面。它不是python库,需要单独下载(喏,你要的官网)。
写一个简单的栗子:


   
   
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.PhantomJS(executable_path= ‘<Path to PhantomJs>’)
driver.get( “http://www.python.org”)
assert “Python” in driver.title
elem = driver.find_element_by_name( “q”)
elem.clear()
elem.send_keys( “pycon”)
elem.send_keys(Keys.RETURN)
assert “No results found.” not in driver.page_source
driver.close()

Path to PhantomJs 处 需要指定位置,如果该路径已经加入到了环境变量中,那么可以不加这个参数。
这里只是个简单的介绍,后续会对 Selenium 的 python 版 API 的使用做单独介绍。

代理问题

部分网站对 ip 进行了限制,导致我们无法爬到想要的数据,这个时候可以用代理来做。
使用 requests 这个第三方库,可以轻松地设置代理。
再举个栗子:


    
    
import requests
proxies = {
‘http’: ‘http://10.10.1.10:3128’,
‘https’: ‘http://10.10.1.10:1080’,
}
requests.get( ‘http://example.org’, proxies=proxies)

发送 http 请求

虽然自带的 urllib 和 urllib2 库可以满足需求,但是不推荐使用。为什么?因为它们的操作太繁琐,尤其在处理一些复杂情况时,这不符合 python 的设计哲学,所以放手抛弃它们吧。
推荐使用 requests这个第三方库,正如它标榜的那样–Requests: HTTP for Humans,同时也支持 py3。
使用 requests 库发送请求是如此的优雅,


    
    
import requests
r = requests.get( ‘https://api.github.com/events’)
print r.text

具体使用方法可以看官方 API。

解析页面

既然获取到了请求页面的源码,那么接下来要做的就是解析工作,一般来说,有下面三个库用得是最多的:lxml库, bs4库,以及正则
lxml 解析速度要比 bs4 快,据说快好几倍,正则是个终结技,只是写起来有点麻烦。另外, bs4 不支持 xpath,而lxml 支持,总之,视自己的情况选择了。
前几天还接触过一个库,名字叫 pyquery,它是 jQuery 的 python 实现,可以用于解析 html 网页内容,熟悉 jQuery 语法童鞋的福音。

另:bs4 库解析遇到的一个问题

前几天遇到一个问题,问题是这样的,html 页面的数据经过Beautiful Soup库的解析后,部分html源码丢失,找不到想要的数据了,问题代码如下:


    
    
#! /usr/bin/env python
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
url = ‘http://product.pconline.com.cn/mobile/’
res = requests.get(url)
html = res.text
# print html
soup = BeautifulSoup(html, ‘lxml’)
site = soup.findAll( ‘img’, class_= ‘pic’)
print site

输出结果为空,没有想要的数据。查看官方文档,bs 库支持的解析库有 lxml, html5lib 和 html.parser。用的最多的是 lxml,因为它的解析速度快,并且容错能力强,默认也是使用该解析器。
出现解析后源码丢失的可能原因有 2 个:

  • BeautifulSoup 有时候会遇到非法的,不支持的 html 源码而导致无法解析或无法正常解析 html;
  • 处理的文档太大,而处理的解析器缓存不够造成的信息丢失。
    这里换一个解析器,换成 html.parser 就可以了。

编码问题

将编码设置为 utf-8


    
    
import sys
reload(sys)
sys.setdefaultencoding( ‘utf-8’)

总之,py2 中的编码问题很烦人,只要解码与编码不一致就会出现乱码。对 unicode 可以 编码,其他编码 decode 成 unicode。
要注意‘hello’u’hello’ 的区别。

多线程爬取

验证码处理

模拟登录

To be continued…


本文出自
https://vonalex.github.io/2016/05/29/%E7%88%AC%E8%99%AB%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93/

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
零基础爬虫学习全记录2:今日头条指定搜索内容下的所有图集图片保存——图片采集小程序

零基础爬虫学习全记录 无论仅仅有多少基础,都不该在徘徊和犹豫中浪费! 只有放弃幻想,用行动促进思考,才能最快找到想要的路。 背景: 没有任何编程基础的金融学专业学生,C语言都没接触过...

无小意丶
2017/10/27
0
0
php爬虫框架选用什么

php爬虫框架选用什么 一、总结 一句话总结:phpspider:官方下载地址:https://github.com/owner888/phpspider 1、phpspider能够帮我们解决哪些问题? 如何进行运行前测试? 如何实现模拟登录...

osc_88djj30s
2018/10/18
3
0
博客园目录

table标签中thead、tbody、tfoot的作用http://www.cnblogs.com/zhouxinfei/p/8001510.html python selenium模拟滑动操作http://www.cnblogs.com/zhouxinfei/p/8001506.html Selenium webdriv......

_周小董
2017/12/09
0
0
5-15~5-17 七牛工作总结:足球爬虫

周末回到宿舍就凌晨两三点了,因此周一回来状态很差也没做什么工作就只是查了查关于足球点球的可以爬的网站,周二和周三就开始做爬虫了,但是因为之前没做过,做的进度很慢。 周二下午开始做...

harry_128
03/31
0
0
Python爬虫 监控进程

一:前言 python 语言具有良好的垃圾回收功能,但是实际运用爬虫的时候还是会出现内存逐渐增大的现象,包括数据库服务占用的内存也会不断增加。这样服务器或者电脑就会收到一定的影响。这次的...

布咯咯_rieuse
2017/11/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如果你失明了,你怎么编程? - How can you program if you're blind?

问题: Sight is one of the senses most programmers take for granted. 视觉是大多数程序员认为理所当然的感官之一。 Most programmers would spend hours looking at a computer monitor......

技术盛宴
52分钟前
16
0
如何删除使用Python的easy_install安装的软件包? - How do I remove packages installed with Python's easy_install?

问题: Python's easy_install makes installing new packages extremely convenient. Python的easy_install使安装新包非常方便。 However, as far as I can tell, it doesn't implement th......

fyin1314
今天
11
0
如何将逗号分隔的字符串转换为数组? - How to convert a comma separated string to an array?

问题: I have a comma separated string that I want to convert into an array, so I can loop through it. 我有一个逗号分隔的字符串,我想将其转换成数组,因此可以循环遍历它。 Is the...

富含淀粉
今天
13
0
深源恒际:担心个人身份被冒用?不存在!

本文作者:c****t 近日,苟晶被冒名顶替身份参加高考的事件在社会各界掀起广泛热议。事件调查结果公布后,舆论风向逆转,吃瓜群众认为当事人夸大其词消费了公众情绪,一边对当事人所遭遇的不...

百度开发者中心
昨天
5
0
CKEditor 5 + SpringBoot实战(三):SpringData JPA数据持久化

在本系列的文章中,我将介绍如何在Spring Boot Application中使用CKEditor编辑器。介绍的内容包括基本环境的搭建,文件上传,SpringData JPA数据持久化,CKEditor5的安装,CKEditor图片上传,...

树下魅狐
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部