Python爬虫之Spider类用法简单介绍


Posted in Python onAugust 04, 2020

一、网络爬虫

网络爬虫又被称为网络蜘蛛(?️),我们可以把互联网想象成一个蜘蛛网,每一个网站都是一个节点,我们可以使用一只蜘蛛去各个网页抓取我们想要的资源。举一个最简单的例子,你在百度和谷歌中输入‘Python',会有大量和Python相关的网页被检索出来,百度和谷歌是如何从海量的网页中检索出你想要的资源,他们靠的就是派出大量蜘蛛去网页上爬取,检索关键字,建立索引数据库,经过复杂的排序算法,结果按照搜索关键字相关度的高低展现给你。

千里之行,始于足下,我们从最基础的开始学习如何写一个网络爬虫,实现语言使用Python。

二、Python如何访问互联网

想要写网络爬虫,第一步是访问互联网,Python如何访问互联网呢?

在Python中,我们使用urllib包访问互联网。(在Python3中,对这个模块做了比较大的调整,以前有urllib和urllib2,在3中对这两个模块做了统一合并,称为urllib包。包下面包含了四个模块,urllib.request,urllib.error,urllib.parse,urllib.robotparser),目前主要使用的是urllib.request。

我们首先举一个最简单的例子,如何获取获取网页的源码:

import urllib.request
response = urllib.request.urlopen('https://docs.python.org/3/')
html = response.read()
print(html.decode('utf-8'))

三、Python网络简单使用

首先我们用两个小demo练一下手,一个是使用python代码下载一张图片到本地,另一个是调用有道翻译写一个翻译小软件。

3.1根据图片链接下载图片,代码如下:

import urllib.request

response = urllib.request.urlopen('http://www.3lian.com/e/ViewImg/index.html?url=http://img16.3lian.com/gif2016/w1/3/d/61.jpg')
image = response.read()

with open('123.jpg','wb') as f:
 f.write(image)

其中response是一个对象

输入:response.geturl()
->'http://www.3lian.com/e/ViewImg/index.html?url=http://img16.3lian.com/gif2016/w1/3/d/61.jpg'

输入:response.info()
-><http.client.HTTPMessage object at 0x10591c0b8>

输入:print(response.info())
->Content-Type: text/html
Last-Modified: Mon, 27 Sep 2004 01:23:20 GMT
Accept-Ranges: bytes
ETag: "0f4b59230a4c41:0"
Server: Microsoft-IIS/8.0
Date: Sun, 14 Aug 2016 07:16:01 GMT
Connection: close
Content-Length: 2827

输入:response.getcode()
->200

3.2使用有道词典实现翻译功能

我们想实现翻译功能,我们需要拿到请求链接。首先我们需要进入有道首页,点击翻译,在翻译界面输入要翻译的内容,点击翻译按钮,就会向服务器发起一个请求,我们需要做的就是拿到请求地址和请求参数。

我在此使用谷歌浏览器实现拿到请求地址和请求参数。首先点击右键,点击检查(不同浏览器点击的选项可能不同,同一浏览器的不同版本也可能不同),进入图一所示,从中我们可以拿到请求请求地址和请求参数,在Header中的Form Data中我们可以拿到请求参数。

Python爬虫之Spider类用法简单介绍

(图一)

代码段如下:

import urllib.request
import urllib.parse

url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=dict2.index'
data = {}
data['type'] = 'AUTO'
data['i'] = 'i love you'
data['doctype'] = 'json'
data['xmlVersion'] = '1.8'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'UTF-8'
data['action'] = 'FY_BY_CLICKBUTTON'
data['typoResult'] = 'true'
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
print(html)

上述代码执行如下:

{"type":"EN2ZH_CN","errorCode":0,"elapsedTime":0,"translateResult":[[{"src":"i love you","tgt":"我爱你"}]],"smartResult":{"type":1,"entries":["","我爱你。"]}}

对于上述结果,我们可以看到是一个json串,我们可以对此解析一下,并且对代码进行完善一下:

import urllib.request
import urllib.parse
import json

url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=dict2.index'
data = {}
data['type'] = 'AUTO'
data['i'] = 'i love you'
data['doctype'] = 'json'
data['xmlVersion'] = '1.8'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'UTF-8'
data['action'] = 'FY_BY_CLICKBUTTON'
data['typoResult'] = 'true'
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
target = json.loads(html)
print(target['translateResult'][0][0]['tgt'])

四、规避风险

服务器检测出请求不是来自浏览器,可能会屏蔽掉请求,服务器判断的依据是使用‘User-Agent',我们可以修改改字段的值,来隐藏自己。代码如下:

import urllib.request
import urllib.parse
import json

url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=dict2.index'
data = {}
data['type'] = 'AUTO'
data['i'] = 'i love you'
data['doctype'] = 'json'
data['xmlVersion'] = '1.8'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'UTF-8'
data['action'] = 'FY_BY_CLICKBUTTON'
data['typoResult'] = 'true'
data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(url, data)
req.add_header('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36')
response = urllib.request.urlopen(url, data)
html = response.read().decode('utf-8')
target = json.loads(html)
print(target['translateResult'][0][0]['tgt'])

上述做法虽然可以隐藏自己,但是还有很大问题,例如一个网络爬虫下载图片软件,在短时间内大量下载图片,服务器可以可以根据IP访问次数判断是否是正常访问。所有上述做法还有很大的问题。我们可以通过两种做法解决办法,一是使用延迟,例如5秒内访问一次。另一种办法是使用代理。

延迟访问(休眠5秒,缺点是访问效率低下):

import urllib.request
import urllib.parse
import json
import time


while True:
 content = input('please input content(input q exit program):')
 if content == 'q':
  break;

 url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=dict2.index'
 data = {}
 data['type'] = 'AUTO'
 data['i'] = content
 data['doctype'] = 'json'
 data['xmlVersion'] = '1.8'
 data['keyfrom'] = 'fanyi.web'
 data['ue'] = 'UTF-8'
 data['action'] = 'FY_BY_CLICKBUTTON'
 data['typoResult'] = 'true'
 data = urllib.parse.urlencode(data).encode('utf-8')
 req = urllib.request.Request(url, data)
 req.add_header('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36')
 response = urllib.request.urlopen(url, data)
 html = response.read().decode('utf-8')
 target = json.loads(html)
 print(target['translateResult'][0][0]['tgt'])
 time.sleep(5)

代理访问:让代理访问资源,然后讲访问到的资源返回。服务器看到的是代理的IP地址,不是自己地址,服务器就没有办法对你做限制。

步骤:

1,参数是一个字典{'类型' : '代理IP:端口号' } //类型是http,https等
proxy_support = urllib.request.ProxyHandler({})

2,定制、创建一个opener
opener = urllib.request.build_opener(proxy_support)

3,安装opener(永久安装,一劳永逸)
urllib.request.install_opener(opener)

4,调用opener(调用的时候使用)
opener.open(url)

五、批量下载网络图片

图片下载来源为煎蛋网(http://jandan.net)

图片下载的关键是找到图片的规律,如找到当前页,每一页的图片链接,然后使用循环下载图片。下面是程序代码(待优化,正则表达式匹配,IP代理):

import urllib.request
import os

def url_open(url):
 req = urllib.request.Request(url)
 req.add_header('User-Agent','Mozilla/5.0')
 response = urllib.request.urlopen(req)
 html = response.read()
 return html

def get_page(url):
 html = url_open(url).decode('utf-8')
 a = html.find('current-comment-page') + 23
 b = html.find(']',a)
 return html[a:b]


def find_image(url):
 html = url_open(url).decode('utf-8')
 image_addrs = []
 a = html.find('img src=')
 while a != -1:
  b = html.find('.jpg',a,a + 150)
  if b != -1:
   image_addrs.append(html[a+9:b+4])
  else:
   b = a + 9
  a = html.find('img src=',b)
 for each in image_addrs:
  print(each)
 return image_addrs

def save_image(folder,image_addrs):
 for each in image_addrs:
  filename = each.split('/')[-1]
  with open(filename,'wb') as f:
   img = url_open(each)
   f.write(img)

def download_girls(folder = 'girlimage',pages = 20):
 os.mkdir(folder)
 os.chdir(folder)
 url = 'http://jandan.net/ooxx/'
 page_num = int(get_page(url))

 for i in range(pages):
  page_num -= i
  page_url = url + 'page-' + str(page_num) + '#comments'
  image_addrs = find_image(page_url)
  save_image(folder,image_addrs)

if __name__ == '__main__':
 download_girls()

代码运行效果如下:

Python爬虫之Spider类用法简单介绍

到此这篇关于Python爬虫之Spider类用法简单介绍的文章就介绍到这了,更多相关Python爬虫Spider类内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python3基础之输入和输出实例分析
Aug 18 Python
Python中文件操作简明介绍
Apr 13 Python
python连接字符串的方法小结
Jul 13 Python
使用matplotlib画散点图的方法
May 25 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
Nov 06 Python
对python插入数据库和生成插入sql的示例讲解
Nov 14 Python
Python 正则表达式匹配字符串中的http链接方法
Dec 25 Python
Series和DataFrame使用简单入门
Nov 13 Python
Python实现Word表格转成Excel表格的示例代码
Apr 16 Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 Python
python中scrapy处理项目数据的实例分析
Nov 22 Python
用Python selenium实现淘宝抢单机器人
Jun 18 Python
Python绘图之二维图与三维图详解
Aug 04 #Python
Python连接Impala实现步骤解析
Aug 04 #Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
Aug 04 #Python
Python如何给函数库增加日志功能
Aug 04 #Python
pycharm导入源码的具体步骤
Aug 04 #Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
Aug 03 #Python
Python 如何调试程序崩溃错误
Aug 03 #Python
You might like
真正的ZIP文件操作类(php)
2007/07/21 PHP
php错误、异常处理机制(补充)
2012/05/07 PHP
通过5个php实例细致说明传值与传引用的区别
2012/08/08 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
2015/12/24 PHP
PHP图像识别技术原理与实现
2016/10/27 PHP
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
利用js判断手机是否安装某个app的多种方案
2017/02/13 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
详解nodejs中的process进程
2017/03/19 NodeJs
Vue-cropper 图片裁剪的基本原理及思路讲解
2018/04/17 Javascript
jQuery滚动条美化插件nicescroll简单用法示例
2018/04/18 jQuery
layui 实现自动选择radio单选框(checked)的方法
2019/09/03 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
Openlayers实现地图的基本操作
2020/09/28 Javascript
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
2016/06/14 Python
使用Python进行二进制文件读写的简单方法(推荐)
2016/09/12 Python
利用Python抓取行政区划码的方法
2016/11/28 Python
python基础之包的导入和__init__.py的介绍
2018/01/08 Python
Python 实现域名解析为ip的方法
2019/02/14 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
python django中8000端口被占用的解决
2019/12/17 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
python logging.basicConfig不生效的原因及解决
2020/02/20 Python
python map比for循环快在哪
2020/09/21 Python
美国女孩洋娃娃店:American Girl
2017/10/24 全球购物
荷兰牛仔裤网上商店:Jeans Centre
2018/04/03 全球购物
台湾全方位线上课程与职能学习平台:TibaMe
2019/12/04 全球购物
实现向右循环移位
2014/07/31 面试题
铁路工务反思材料
2014/02/07 职场文书
安全责任协议书
2014/04/21 职场文书
《中国梦我的梦》小学生演讲稿
2014/08/20 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL