Python爬虫技术

爬虫概述

1.爬虫技术概述

爬虫,即网络爬虫,是通过递归访问网络资源,抓取网络中信息的技术。
互联网中也有大量的有价值的信息数据,手动下载效率非常低下,爬虫就是自动化爬取下载些有价值的信息的技术。
互联网中的页面往往不是独立存在的,而是通过超链接连接成了一个网络,爬虫程序就像一 只蜘蛛一样,通过访问超链接在这张网络中移动 ,并下载需要的信息,理论上可以将爬取到整个互联网的绝大部分数据。
爬虫技术最开始来源于搜索引擎技术,是搜索引擎的基础,目前已经普及开成为了非常常用的通用技术。

2.爬虫的实现

很多语言都可以用来开发爬虫,理论上只要有访问网络能力的语言都可以用来开发爬虫。 但目前主流的爬虫开发用的主要是python语言,python语言简单 清晰高效开发的特点特别适合于爬虫这种需要根据不同页面灵活高效开发不同处理程序的场景。

Python爬虫基础之Urllib库

1.案例1:访问url读取返回结果

import urllib2
response = urllib2.urlopen("http://www.baidu.com")
print response.read()

说明:
urlopen(url, data, timeout)
第一个参数url即为URL,第二个参数data是访问URL时要传送的数据,第三个timeout是设置超时时间。
第二三个参数是可以不传送的,data默认为空None,timeout默认为 socket.
_GLOBAL_DEFAULT_TIMEOUT
第一个参数URL是必须要传送的,在这个例子里面我们传送了百度的URL,执行urlopen方法之后,返回一个response对象,返回信息便保存在这里面

2.案例2:构造request访问url读取返回结果

import urllib2
request = urllib2.Request("http://www.baidu.com");
response = urllib2.urlopen(request)
print response.read()

说明:
运行结果是完全一样的,只不过中间多了一个request对象,更加面向对象

3.案例3:Get提交

import urllib
import urllib2
data = urllib.urlencode({"username":"张三","psw":"123"}) 
request = urllib2.Request("http://www.baidu.com?"+data) r
esponse = urllib2.urlopen(request)
print response.read()

此处通过urlencode方法对请求参数实现URL编码操作

4.案例4:Post提交

import urllib
import urllib2
data = urllib.urlencode({"username":"park","password":"123"})
request = urllib2.Request("https://www.baidu.com",data) 
response = urllib2.urlopen(request)
print response.read()

5.案例5:设置Headers

import urllib
import urllib2
url = 'http://www.baidu.com'
data = urllib.urlencode({"username":"park","password":"123"})
headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3559.6 Safari/537.36'}
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
print response.read()

有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性。

6.案例6:代理设置

urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy。
假如一个网站它会检测某一段时间某个IP 的访问次数,如果访问次数过多,它会禁止访问。
则可以设置一些代理服务器,每隔一段时间换一个代理,以此绕过ip检测。

import urllib2	
enable_proxy = True
proxy_handler = urllib2.ProxyHandler({"http" : 'http://127.0.0.1:1080'}) null_proxy_handler = urllib2.ProxyHandler({})
if enable_proxy:
     opener = urllib2.build_opener(proxy_handler)
else:
    opener = urllib2.build_opener(null_proxy_handler) urllib2.install_opener(opener)

7.案例7:超时时间设置

import urllib2
response = urllib2.urlopen('http://www.baidu.com', timeout=10)
或
import urllib2
response = urllib2.urlopen('http://www.baidu.com',data, 10)

8.案例8:开启调试模式

可以通过下面的方法把 Debug Log 打开,这样收发包的内容就会在屏幕上打印出来,方便调试

import urllib2
httpHandler = urllib2.HTTPHandler(debuglevel=1) httpsHandler  =  urllib2.HTTPSHandler(debuglevel=1) opener = urllib2.build_opener(httpHandler, httpsHandler) urllib2.install_opener(opener)
response = urllib2.urlopen('http://www.baidu.com')

9.案例9:使用cookie

当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例)。在前面,我们都是使用的默认的opener,也就是urlopen。它是一个特殊的opener,可以理解成opener的一个特殊 实例,传入的参数仅仅是url,data,timeout。
如果我们需要用到Cookie,只用这个opener是不能达到目的的,所以我们需要创建更一般的
opener来实现对Cookie的设置。

import cookielib
import urllib2
#设置保存cookie的文件,同级目录下的cookie.txt
filename = 'cookie.txt'
#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie = cookielib.MozillaCookieJar(filename)
#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler = urllib2.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener = urllib2.build_opener(handler) #创建一个请求,原理同urllib2的urlopen
response = opener.open("http://www.baidu.com")
#保存cookie到文件
#ignore_discard的意思是即使cookies将被丢弃也将它保存下来,ignore_expires的意思是如果在该文件中cookies已经存在,则覆盖原 文件写入,在这里,我们将这两个全部设置为True。
cookie.save(ignore_discard=True, ignore_expires=True)

import cookielib
import urllib2
#创建MozillaCookieJar实例对象
cookie = cookielib.MozillaCookieJar()
#从文件中读取cookie内容到变量
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
#创建请求的request
req = urllib2.Request("http://www.baidu.com") #利用urllib2的build_opener方法创建一个opener
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open(req)
print response.read()

Python爬虫框架

1.Python爬虫框架介绍

利用Python的基础网络包开发爬虫是比较麻烦的,市面上有很多基于这套API开发的爬虫框架,大大的简化了Python爬虫的开发
比较知名的是Scrapy 和PySpider。
PySpider上手更简单,操作更加简便,增加了 WEB 界面,开发效率高,集成了phantomjs,可以用来处理复杂的js渲染的页面。
Scrapy自定义程度高,比PySpider更底层一些,适合学习研究,需要学习的相关知识多,不过自己拿来研究分布式和多线程等等是非常合适的。

2.PySplider安装配置

a.安装pip
pip是python的包管理工具 类似RedHat里面的yum 通过pip可以快速下载安装python 软件 隐藏了背后复杂的下载安装的过程
访问https://pypi.python.org/pypi/pip#downloads
下载pip安装包
解压pip-9.0.1.tar.gz
在该目录下执行 python setup.py install
将python安装目录下的Scripts配置到PATH环境变量

b.安装phantomjs
phantomjs是一个浏览器内核程序,可以在爬虫开发过程中,模拟浏览器运行js,简化js处理过程
访问http://phantomjs.org/download.html
下载对应版本phantomjs
解压phantomjs-2.1.1-windows.zip 将其bin目录配置到PATH环境变量中

c.使用pip安装pyspider
pip install pyspider

d.运行pyspider
pyspider all

e.通过浏览器访问pyspider http://localhost:5000

3.PySpider的使用PySpider语法

http://docs.pyspider.org/en/latest/

4.案例:爬去豆瓣电影经典电影前100名信息
a.经过分析,得到了豆瓣电影的一个访问地址,可以获取电影相关数据的json串,只要访

问该地址,解析该json就可以得到电影基本信息
https://movie.douban.com/j/search_subjects?type=movie&tag=经典 &sort=rank&page_limit=100&page_start=0
b.创建PySpider项目,爬取该地址

#!/usr/bin/env  python # -*- encoding: utf-8 -*-
#Created on 2018-11-29 15:50:57
#Project: DBDY_01

from pyspider.libs.base_handler import * import os;

class Handler(BaseHandler): base_dir = "C:\\park\\DBDY"

crawl_config = {
}

@every(minutes=24 * 60) def on_start(self):
self.crawl('https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%BB%8F%E5%85% B8&sort=rank&page_limit=30&page_start=0'
,validate_cert=False
, callback=self.index_page)

@config(age=10 * 24 * 60 * 60) def index_page(self, response):
marr = response.json["subjects"] for m in marr:
self.crawl(m["url"],validate_cert=False, callback=self.mv_page)

@config(age=10 * 24 * 60 * 60) def mv_page(self, response):
#电影名
mv_name = response.doc("h1 > span").text().encode("gbk") #电影描述
mv_desc = response.doc("#info").text().encode("gbk") #电影图片地址
mv_img_url = response.doc("#mainpic img").attr.src;

#创建该电影的文件夹
mv_dir = self.base_dir+"\\"+mv_name
if not os.path.exists(mv_dir):
os.makedirs(mv_dir)
#创建文本文件保存电影描述
mv_file = open(mv_dir+"\\"+mv_name+".txt","w")

mv_file.write(mv_desc) mv_file.flush() mv_file.close()
#下载封面图片
###封面图片存储路径
mv_img_path = mv_dir+"\\"+mv_img_url.split("/")[-1] ###爬取封面图片self.crawl(mv_img_url,validate_cert=False,
callback=self.mv_img_down,save={"mv_img_path":mv_img_path}) #爬取剧照页面
mv_photos_url = response.doc(".related-pic .pl > a:nth-child(4)").attr.href self.crawl(mv_photos_url,validate_cert=False,
callback=self.mv_photos_page,save={"mv_dir":mv_dir})

@config(age=10 * 24 * 60 * 60)
def mv_photos_page(self, response):
photoAncrArr = response.doc(".article li a").items() for photoAncr in photoAncrArr:
self.crawl(photoAncr.attr.href,validate_cert=False, callback=self.mv_photo_page,save=response.save)

@config(age=10 * 24 * 60 * 60)
def mv_photo_page(self, response): #存储位置
photos_path=response.save["mv_dir"]+"\\photo" if not os.path.exists(photos_path):
os.makedirs(photos_path) #图片url
img_url = response.doc(".mainphoto > img").attr.src self.crawl(img_url,validate_cert=False,
callback=self.mv_img_down,save={"mv_img_path":photos_path+"\\"+img_url.split("/")[-1]})

@config(age=10 * 24 * 60 * 60) def mv_img_down(self, response):
img_data = response.content
img_file = open(response.save["mv_img_path"],"wb") img_file.write(img_data)
img_file.flush() img_file.close()

你可能感兴趣的:(大数据)