爬虫学习一

什么是网络爬虫:

  通俗理解: 爬虫是一个模拟人类请求网站行为的程序,可以自动请求网页、并数据抓取下来,然后使用一定的规则提取有价值的数据。

通用爬虫和聚焦爬虫:

  1.通用爬虫:通用爬虫是搜索引擎抓取系统(百度、谷歌、搜狗等)的重要组成部分,主要试讲互联网上的网页下载到本地,形成一个互联网内容的备份。

  2.聚焦爬虫: 是面向特定需求的一种网络爬虫程序,他与 爬虫的区别在与;聚焦爬虫在实施网页抓取的时候对内容进行筛选和处理,尽量保证只抓取雨需求相关的网页信息、

 

urllib库

  Urllib是python内置的HTTP请求库
  包括以下模块
  urllib.request 请求模块
  urllib.error 异常处理模块
  urllib.parse url解析模块
  urllib.robotparser robots.txt解析模块

  urlopen函数:

  在Python3 的 urllib库中,所有和网络请求相关的方法,都被聚到 urllib.request 模块下面,来看下urlopen 函数的用法:

import urllib.request

response = urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))
print(response.getcode())#请求的状态码

  urlopen后面跟的参数:

            urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None):

            常用的有(url: 请求的url

                data:请求的 data ,如果设置这个值,那么僵变成 POST请求

                timeout:在某些网络情况不好或者服务器端异常的情况会出现请求慢的情况,或者请求异常,所以这个时候我们需要给
                    请求设置一个超时时间,而不是让程序一直在等待结果。

                )

  urlretrieve函数:

    这个函数可以方便将网页上的一个文件保存在本地,也可以下载图片等。

1 from urllib import request
2 
3 
4 request.urlretrieve('https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/w%3D268%3Bg%3D0/sign=50e7ccb8573d26972ed30f5b6dc0d5c6/241f95cad1c8a786391cbb7c6109c93d70cf508a.jpg', '鲁班.jpg')

 

  urlencode函数:

    用浏览器发请求的时候,如果rul中含有中文或者其他特殊字符,那么浏览器会自动给我们进行编码,如果使用代码发请求,那么就要手动的进行编码,这是就要用到urlencode 函数来实现

from urllib import parse  #编码导入parse模块


data = {'name': '张三', 'age': 18, 'greet': 'Hello world'}
result = parse.urlencode(data)
print(result)

结果:
  name=%E5%BC%A0%E4%B8%89&age=18&greet=Hello+world

url = 'http://www.baidu.com/s'
parses = {"wd": '刘德华'}
qs = parse.urlencode(parses)
url = url +'?'+ qs
resp = request.urlopen(url)
print(resp.readlines())

  parse_qs函数:

    可以将经过编码后的url参数进行解码。

data = {'name': '张三', 'age': 18, 'greet': 'Hello world'}
result = parse.urlencode(data) #编码
print(result)
qs = parse.parse_qs(result)  #解码
print(qs)

结果:
    name=%E5%BC%A0%E4%B8%89&age=18&greet=Hello+world
    {'name': ['张三'], 'age': ['18'], 'greet': ['Hello world']}

 

  urlparse和urlsplit函数:

    有时候拿到一个 url ,想要读这个url 中的各个组成部分进行分割,那么这个时候我们可以使用 urlparse 或者是urlsplit 来进行分割,urlsplit  没有params 如下:

from urllib import parse, request

url = 'https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd=Python3#1'

result = parse.urlparse(url)
print(result)
print('scheme:', result.scheme)
print('netloc:', result.netloc)
print('path:', result.path)
print('query:', result.query)
print('fragment:', result.fragment)

结果:
ParseResult(scheme='https', netloc='www.baidu.com', path='/baidu', params='', query='tn=monline_3_dg&ie=utf-8&wd=Python3', fragment='1')
scheme: https
netloc: www.baidu.com
path: /baidu
query: tn=monline_3_dg&ie=utf-8&wd=Python3
fragment: 1

  request.Reques类:

  如果想要在请求时候增加一些请求头,那么必须使用request.Request 类来实现。 比如增加一个User+Agen,如下:

 爬取拉钩网的招聘信息:

from urllib import request, parse

url = 'https://www.lagou.com/jobs/4500619.html'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
    'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
}
data = {
    'first': 'true',
    'pn': 1,
    'kd': 'python'
}

ret = request.Request(url, headers=headers, data=parse.urlencode(data).encode('utf-8'), method="POST")

reps = request.urlopen(ret)
print(reps.read().decode('utf-8'))

  ProxyHandler  处理器(代理设置):

    很多网站检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正常人,它会禁止这个IP的访问,所以我们可以设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取。

  常用的代理有:

    西刺免费代理IP:http://www.xicidaili.com/

    快代理:http://www.kuaidaili.com/

    代理云:http://www.dailiyun.com/

  ProxyHandler处理器

    1. 代理的原理: 在请求目的网站之前,先请求代理服务器,然后代理服务器去请求目的网站, 代理服务器拿到目的网站的数据后,在转发我们代码。

    2.http://httpbin.org: 这个网站可以方便的查看http请求的一下参数。

    3.在代码中使用代理:

  •       使用 ' urllib.request.ProxyHandler',传入一个代理,这个代理是一个字典,字典的key依赖代理服务器能够接受的类型,一般是‘http’ 或者 ‘ https’, 值是 ‘IP:port ’。
  •       使用上一步骤创建的 'handler ’, 以及 ‘request.build_opener’ 创建一个 ‘opener’对象。
  •       使用上一步创建的 ‘opener’, 调用 ‘open’ 函数,发起请求。

     4.代码如下:

 1 from urllib import request
 2 
 3 # 没有用代理的
 4 url = 'http://httpbin.org/ip'
 5 reps = request.urlopen(url)
 6 print(reps.read())
 7 结果:
 8 b'{\n  "origin": "111.203.45.2, 111.203.45.2"\n}\n'
 9 
10 # 使用代理
11 url = 'http://httpbin.org/ip'
12 # 1. 使用 ProxyHandler 传入代理构建一个Handler
13 handler = request.ProxyHandler({"http": "121.232.148.162:9000"})
14 # 2. 使用上面的创建一个opener
15 opener = request.build_opener(handler)
16 # 3. 使用opener发送一个请求
17 resp = opener.open(url)
18 print(resp.read().decode('utf-8'))
19 结果:
20 {
21   "origin": "121.232.148.162, 121.232.148.162"
22 }

********************后续查看爬虫学习二************************

  

 

              

 

posted @ 2019-04-30 16:28  QQmini  阅读(186)  评论(0编辑  收藏  举报