数据挖掘--爬虫--基础库

urllib

  urllib包含4个模块:

  1. request 基本的http请求模块,用来模拟发送请求。
  2. error 异常处理模块,用于捕获异常保证程序不会意外终止
  3. parse 工具模块,提供了许多URL的处理方法
  4. robotparser 主要用来识别网站中的robots.txt文件,判断哪些网页可以用来爬

request

urlopen()

API—-> urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

  1. data
    添加该参数之后,请求方法即为POST;如果其内容为字节流编码格式(bytes类型)的内容,需要通过bytes()方法进行转换

    1
    2
    3
    4
    5
    6
    import urllib.request as requset
    import urllib.parse as parse

    data = bytes(parse.urlencode({'world':'hello'}),encoding='utf-8')
    reponse = requset.urlopen('http://httpbin.org/post',data=data)
    print(reponse.read())
  2. timeout
    用于设置超时时间,单位:秒,超出这个时间没有相应,就会抛出异常,支持http、https、ftp请求

    1
    2
    3
    import urllib.request as requset

    reponse = requset.urlopen('http://httpbin.org/get',timeout=1)
  3. context
      用来指定ssl设置,必须是ssl.SSLContext类型

  4. cafile和capath
      用来指定CA证书和它的路径,在https链接时会用到
  5. cadefault
      该参数已经弃用,默认为False
Request

  如果请求中需要添加header头信息,就需要使用Request类来构建请求。

API—-> class urllib.request.Request(ur1, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

  1. url
    用于请求URL,必传参数
  2. data
    bytes(字节流)类型
  3. headers
    一个字典,也就是请求头,可以通过headers参数直接构造请求头,也可以通过请求实例的add_header()方法添加
  4. origin_req_host
    指的是请求方的host名称或者IP地址
  5. unverifiable
    标识这个请求是够是无法验证的,默认是False,也就是用户没有权限来选择接受这个请求的结果
  6. method
    指示请求使用的方法,POST、GET、PUT等
高级用法

  需要更高级的操作(Cookie处理、代理设置等)的时候,使用更加强大的工具Handler,简单的可以理解为各种处理器。
BaseHandler是其他所有Handler的父类,提供了最基本的方法。

  • HTTPDefaultErrorHandler
      用于处理HTTP响应错误
  • HTTPRedirectHandler
      用于处理重定向
  • HTTPCookieProcesser
      用于处理Cookie
  • ProxyHandler
      用于设置代理,默认代理为空
  • HTTPPasswordMgr
      用于管理密码,维护了用户名和密码的表
  • HTTPBasicAuthHandler
      用于管理认证

parse

  parse 模块,它定义了处理 URL 的标准接口,例如实现URL各部分的抽取、合并以及链接转换。 它支持如下协议的 URL 处理:file 、http、gopher、hdl、http、https、imap 、mailto、mms、news、nntp、prospero、rsync、rtsp、rtspu、sftp、sip、sips、snews、svn、svn+ssh、telnet和wais。

urlparse()

  可以实现URL的识别和分段,解析为6部分: scheme(协议)、netloc(域名)、path(访问路径)、params(参数)、query(查询条件)和fragment(锚点)。

API—-> urllib.parse.urlparse(urlstring, scheme=”, allow_fragments=True)

  1. urlstring
      必填项,待解析的URL
  2. scheme
      默认的协议,如果链接没有带协议信息,会以此作为默认协议
  3. allow_fragments
      是够忽略 fragement。设置为false,fragement部分就会被忽略,解析为path、parameters、或者query的一部分
urlunparse()

  接受一个可迭代的且长度为6的对象作为参数,构造一个URL

1
2
3
4
import urllib.parse as parse

data= ['http','www.baidu.com','index.html','user', 'a=6','comment']
print(parse.urlunparse(data))
urlsplit()

  与urlparse()类似,不过不再单独解析params部分,将其合并到path中

urlunsplit()

  与urlunparse()类似,接受一个可迭代的且长度为5的对象作为参数,构造一个URL

urljoin()

  提供一个base_url(基础链接)作为第一个参数,将新的链接作为第二个参数,该方法会分析base_url的scheme、netloc和path这3个内容并对新链接缺失的部分进行补充,最后返回结果。
  base_url提供了三项内容scheme、netloc和path。如果这3项在新的链接里不存在,就予以补充;如果新的链接存在,就使用新的链接的部分。而base_url中的params、query和fragment是不起作用的。

urlencode()

  通过序列化将字典转换为GET请求参数

parse_qs()

  通过反序列化将GET请求参数转换为字典

parse_qsl()

  将参数转化为元组组成的列表

quote()

  将内容转化为URL编码的格式

unquote()

  将URL编码格式的内容解码

robotparser

bobots协议

  Robots协议也称作爬虫协议/机器人协议,全程网络爬虫排除协议(Robots Exclusion Protocol),通常为一个robots.txt文本文件,存放于网站的根目录之下。

1
2
3
User-agent: *
Disallow: I
Allow: /public/
常见的爬虫名称
爬虫名称 名称 网站
BaiduSpider 百度 www.baidu.com
Googlebot 谷歌 www.google.com
360Spider 360搜索 www.so.com
YodaoBot 有道 www.youdao.com
ia_archiver Alexa www.alexa.cn
Scooter altavista www.altavista.com
robotparser

  一些常用方法:

  • set_url(): 用来设置robots.txt文件的链接。如果在创建RobotFileParser对象时传入了链接,那么就不需要再使用这个方法设置了 。
  • read(): 读取 robots.txt文件并进行分析。注意,这个方法执行一个读取和分析操作,如果不调用这个方法,接下来的判断都会为 False,所以一定记得调用这个方法。这个方法不会返回任何内容,但是执行了读取操作。
  • parse(): 用来解析robots.txt文件,传人的参数是robots.txt某些行的内容,它会按照 robots.txt的语法规则来分析这些内容。
  • can_fetch(): 该方法传人两个参数,第一个是 User-agent,第二个是要抓取的URL。返回的内容是该搜索引擎是否可以抓取这个URL,返回结果是True或False
  • mtime(): 返回的是上次抓取和分析robots.txt的时间,这对于长时间分析和抓取的搜索爬虫是很有必要的,你可能需要定期检查来抓取最新的robots.txt。
  • modified() :它同样对长时间分析和抓取的搜索爬虫很有帮助,将当前时间设置为上次抓取和分析robots.txt的时间 。

requests

GET请求

1
2
3
4
import requests

r = requests.get('http://httpbin.org/get')
print(r.text)

POST请求

1
2
3
4
5
import requests

data = {'name':'germey', 'age':'22'}
r = requests.post("http://httpbin.org/post", data=data)
print(r.text)

正则表达式

  详情请看另一篇文章

爬取猫眼top100

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import json
import re
from bs4 import BeautifulSoup

import requests


def get_one(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'
}
response = requests.get(url)
if response.status_code == 200:
return response.text
return None


def parse_one_page(html):
soup = BeautifulSoup(html, features='lxml')
select = soup.select('dd')
for i in select:
yield {
'index':i.select("i.board-index").pop().text,
'name': i.select('p.name').pop().text,
'star':re.sub( "[\f\r\n\t\v ]","",i.select('p.star').pop().text),
'releasetime': i.select('p.releasetime').pop().text,
'score': i.select('p.score').pop().text}


def main(offset = 0):
url = 'https://maoyan.com/board/4?offset='+str(offset)
html = get_one(url)
with open("result.txt","a+",encoding="utf-8",newline="") as f:
for i in parse_one_page(html):
f.write(json.dumps(i,ensure_ascii=False)+"\n")

if __name__ == '__main__':
for i in range(10):
main(offset=i*10)

参考资料

崔庆才大佬的《python3网络爬虫开发实战》