爬虫学习笔记
分类:计算机编程

本来觉得没什么可写的,因为网上这玩意一搜一大把,不过爬虫毕竟是python的一个大亮点,不说说感觉对不起这玩意
基础点来说,python2写爬虫重点需要两个模块,urllib和urllib2,其实还有re
先介绍下模块的一些常用功能
urllib.urlopen('') #打开一个网址,只是打开,和open差不多
urllib2.Request(url) #解析网址,这个可以省略,具体不是很懂,一些功能,比如加head头什么的也需要使用这个
urllib.urlretrieve(url,filename) #下载用,把url提供的东西down下来,并用filename保存
举个蜂鸟爬图片的例子,下面上伪代码:

前言

很多人提到python,脑海中一定第一个想到爬虫。
那么爬虫有是什么呢?
爬虫是指在互联网领域,爬虫一般指抓取众多公开网站网页上数据的相关技术。
不只是python可以做爬虫,有很多语言都可以比如java
进入正题,入门python爬虫 首先要对python的知识点要有基本的掌握和一定的正则表达式的知识,和一定的html的知识,然后就可以入门python爬虫了

这是我自己在学习python 3爬虫时的小笔记,做备忘用,难免会有一些错误和疏漏,望指正~~~
Python 3 爬虫学习笔记 (二)
Python 3 爬虫学习笔记 (三)
Python 3 爬虫学习笔记 (四)
Python 3 爬虫学习笔记 (五)
Python 3 爬虫学习笔记 (六)

1、url解析
2、打开url
3、读取url,就是read()
4、使用re.findall找到所有和图片有关系的地址,这里只jpg
5、循环下载

python相关模块

在入门前我们应该首先学习爬虫相关的模块
首先需要我们了解urllib.request模块
urllib.request模块的官方文档:https://www.baidu.com/link?url=2TDSZE4Syct8V21juND6HEUUXQtU14DmmeIBrvR_uxYSAPYNpKqEQWN4XvIvxqbJED-pnZnwxLg279W1hWZKmK&wd=&eqid=ffb469a60007cd46000000025aa52e29


图片 1

获取网站代码

import urllib.request
req=urllib.request.urlopen(')
print(req)

图片 2

图片.png

我们可以发现输出的并不是我不们想要的结果,因为 url.request.urlopen()返回的是文件类对象,这时候我们需要使用read()函数
import urllib.request
req=urllib.request.urlopen(')
html=req.read()
print(html)

图片 3

输出的结果不是 我们想象中格式,这是因为输出的是‘utf-8’形式的代码,我们必须使用decode()函数将‘utf-8’代码转化为Unicode形式代码
import urllib.request
req=urllib.request.urlopen(')
html=req.read().decode('utf-8')
print(html)

图片 4

图片.png

这时候我们就得到到我们想要的结果了

〇. python 基础

先放上python 3 的官方文档:https://docs.python.org/3/ (看文档是个好习惯)
关于python 3 基础语法方面的东西,网上有很多,大家可以自行查找.

看图上,图片链接格式是src="
分析之后后面的事就好办了,下面上代码

爬取信息

这是就可以进行爬取我们想要的信息了,是不是很快☻
做爬虫前 我们要首先需要锁定想要爬取的网站和想要获取的信息
比如我想要爬取一个贴吧中的一个贴中的所有图片
那么我们打开贴子复制网址并查看贴子的源代码

图片 5

图片.png

右键点击图片,可以看到图片是代码是<img class="BDE_Image" src="" size="499541" changedsize="true" width="560" height="746">
我们想要下载图片,就要从代码中获取图片的地址,可以明显的看到该图片的地址在img标签中的src属性中

一. 最简单的爬取程序

爬取百度首页源代码:

#-*-coding:utf-8 -*-

import urllib.request

url = "http://www.baidu.com"
page_info = urllib.request.urlopen(url).read()
page_info = page_info.decode('utf-8')
print(page_info)

来看上面的代码:

  • 对于python 3来说,urllib是一个非常重要的一个模块 ,可以非常方便的模拟浏览器访问互联网,对于python 3 爬虫来说, urllib更是一个必不可少的模块,它可以帮助我们方便地处理URL.
  • urllib.request是urllib的一个子模块,可以打开和处理一些复杂的网址

The urllib.request module defines functions and classes which help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, cookies and more.

  • urllib.request.urlopen()方法实现了打开url,并返回一个 http.client.HTTPResponse对象,通过http.client.HTTPResponse的read()方法,获得response body,转码最后通过print()打印出来.

urllib.request.urlopen(url, data=None, [timeout, ]***, cafile=None, capath=None, cadefault=False, context=None)
For HTTP and HTTPS URLs, this function returns a http.client.HTTPResponse object slightly modified.
< 出自: https://docs.python.org/3/library/urllib.request.html >

  • decode('utf-8')用来将页面转换成utf-8的编码格式,否则会出现乱码
import urllib
import urllib2
import re

#处理地址,并获取页面全部的图片地址
def get_image_url(url):
  #url_format = urllib2.Request(url) #1
  url_open = urllib.urlopen(url) #2
  url_read = url_open.read() #3
  re_value = re.compile('(?<=src=").*?.jpg')
  image_url_list = re.findall(re_value,url_read) #4
  return image_url_list

#这个函数专门用来下载,前面两行是将图片连接中/前面的内容全部删除,留下后面的文件名用来保存文件的,try不说了,不清楚请翻回去看容错
def down_image(image_url):
  rev = '^.*/'
  file_name = re.sub(rev,'',image_url)
  try:
    urllib.urlretrieve(image_url,file_name)
  except:
    print 'download %s fail' %image_url
  else:
    print 'download %s successed' %image_url

if __name__ == '__main__':
  url = 'http://bbs.fengniao.com/forum/10384633.html'
  image_url_list = get_image_url(url)
  for image_url in image_url_list:
    down_image(image_url) #5

利用正则表达式来提取图片地址

import re
import urllib.request
req=urllib.request.urlopen('https://tieba.baidu.com/p/5589041856')
html=req.read().decode('utf-8')
p = r'<img class="BDE_Image" src="([^"] )'
imglist=re.findall(p,html)
for each in imglist:
print(each)

图片 6

图片.png

我们已经提出这个帖子所有img的标签中的src属性了
接下来我们需要用urll.request模块中的urlretrieve()对图片进行下载
import re
import urllib.request
req=urllib.request.urlopen('https://tieba.baidu.com/p/5589041856')
html=req.read().decode('utf-8')
p = r'<img class="BDE_Image" src="([^"] )'
imglist=re.findall(p,html)
for each in imglist:
filename=each.split("/")[-1]
urllib.request.urlretrieve(each,filename,None)

图片 7

图片.png

可以看到将图片自动下载到桌面上面去

二 模拟浏览器爬取信息

在访问某些网站的时候,网站通常会用判断访问是否带有头文件来鉴别该访问是否为爬虫,用来作为反爬取的一种策略。
先来看一下Chrome的头信息(F12打开开发者模式)如下:

Paste_Image.png

如图,访问头信息中显示了浏览器以及系统的信息(headers所含信息众多,具体可自行查询)

Python中urllib中的request模块提供了模拟浏览器访问的功能,代码如下:

from urllib import request

url = 'http://www.baidu.com'
# page = request.Request(url)
# page.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36')
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
page = request.Request(url, headers=headers)
page_info = request.urlopen(page).read().decode('utf-8')
print(page_info)

可以通过add_header(key, value) 或者直接以参数的形式和URL一起请求访问,urllib.request.Request()

urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

其中headers是一个字典,通过这种方式可以将爬虫模拟成浏览器对网站进行访问。(https://docs.python.org/3/library/urllib.request.html?highlight=request#module-urllib.request )

困死,睡觉去。。。。。有时间再说说翻页什么的,就能爬网站了

req.add_header()

有时候我们运行次数过多贴吧会识别出是python环境而不是浏览器打开帖子下载图片
那么我应该怎么办呢?
python urllib.request模块中有能有模拟浏览器的一个函数 这个函数就是req.add_header()
但是我们使用前需要对前面的代码进行部分改动
将urllib.request.urlopen('https://tieba.baidu.com/p/5589041856')
改为
req=urllib.request.Request('https://tieba.baidu.com/p/5589041856')
reqs=urllib.request.urlopen(req)
其实这两者并无差别
urll.request.urlopen()既可以接受地址 也可以是接受Request对象
当接受的地址时自动将其转化为Request对象
现在我们就可以时候req.add_header()函数了
打开浏览器的控制台随便打开一个get

图片 8

图片.png

可以看到User-Agent
这时候复制下来
将这段代码
req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64; rv:58.0) Gecko/20100101 Firefox/58.0")
放在urlopen函数的下面

为了更好的不被检测出为爬虫,我们可以引入 time模块
在每次下载图片的时候 利用time.sleep(1)进行停顿一秒

接下来我们需要勤加练习打好基础更加熟悉urllib.request模块

 

想要更深入的学习爬虫我们就需要学习python爬虫的相关模块和http协议等

python爬虫经常用到的模块

Beautifulsoup4 用于更快提取网页中我们想要的信息
官方文档地址:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#id1
request 模块(与urllib.requset不同) 官方文档地址:http://docs.python-requests.org/en/master/

希望对你有所帮助

本文由pc28.am发布于计算机编程,转载请注明出处:爬虫学习笔记

上一篇:查实居民身份证 下一篇:没有了
猜你喜欢
热门排行
精彩图文