网络爬虫

1.爬虫流程图

2.requests库

1.1  requests简介

Requests库是网络爬虫的一种主要手段,通过get,post,delete,put,patch和patch向目标服务器发出http请求获取数据或进行某种操作。

安装:

pip install requests

       以get方法为例:

try:
    r = requests.get(url, timeout=50)
    r.raise_for_status() # 如果状态不是200,跑出异常
   
r.encoding = r.apparent_encoding
    return r.text
except:
    return '产生异常'

列出几个重要的属性:

理解requests库的异常,网络连接有风险,异常很有可能发生。

下面为requests可能发生的异常类型:

Response的异常,通过调用r.raise_for_status()方法,如果相应状态码为200,则正常执行,否则抛出异常。

参数详解:

l  url:请求地址

l  **kwargs:请求控制参数,共13个

l  params:能够增加到url中的参数

r = requests.get('http://www.baidu.com',   params = { 'key1': 'value1'})   ->本质是改变url地址。

r.url ='http://www.baidu.com?key1=value1'

  • data:   data={'key1':'value1'}
  • json:  {'key1':'value1'}
  • heanders: http头  {'user-agent':'chrome/10'}
  • cookies:
  • auth:元组,http认证
  • files:文件  file = {'file1':open('file.txt',rb)}
  • timeout:超时时间
  • proxies:字典类型,设定访问代理服务器,可以增加登录认证(伪装自己的ip)
  • allow_redirects: True,False,默认为True,允许重定向
  • stream:True,False,默认为True,对获取的数据是否下载
  • verify:True,False,默认True,热证SSL证书开关
  • cert:本地SSL位置

这六种方法的底层都是使用requests.request(method, url, **kwargs)方法实现的,也就是说通过request方法,可以实现上述的六种方法:将method参数设置get,post,put等,其他的参数一样。

--python2

import urllib2

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

3.中文乱码处理

requests :  设置编码

r.encoding = r.apparent_encoding
# coding:utf-8
import re  
# import requests  
import sys  
import codecs
#python2
import urllib2

#设置编码  
reload(sys)  
sys.setdefaultencoding('utf-8')  
#获得系统编码格式  
type = sys.getfilesystemencoding()  

# response = urllib2.urlopen("http://www.baidu.com")
req=urllib2.Request("http://www.baidu.com")
response=urllib2.urlopen(req)
html = response.read().decode('utf-8').encode(type)  
print(html)

4.  伪装请求【伪装成浏览器】User-Agent头

# coding:utf-8

import sys
import urllib2
# 设置编码  
reload(sys)  
sys.setdefaultencoding('utf-8')  
# 获得系统编码格式  
type = sys.getfilesystemencoding()  

url = "http://www.baidu.com"
user_agent = "Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0;"

headers={
    'User-Agent':user_agent
}
req=urllib2.Request(url,headers=headers)
response = urllib2.urlopen(req)
html=response.read().decode("utf-8").encode(type)
print(html)

5.正则表达式

5.1 re.match(pattern, string, flag=0)

  re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

  flag:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

  匹配成功re.match方法返回一个匹配的对象,否则返回None。

  我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

5.2 re.search(parttern, string, flag=0)

  re.search 扫描整个字符串并返回第一个成功的匹配。

创建正则表达式对象:pattern = re.comple(' d+.d+ ', re.S)  

默认匹配没一行

re.S  整个文档

import re

pattern = re.compile("d+.d+")

s1="1.234 dsa frwr 4235.324 432423"
rs = pattern.findall(s1)
print(rs)

r"dsadsfsd"  将转义字符当做普通字符处理

6. DOM解析【bs4】

  解析实例:

<!DOCTYPE html>
<html xmlns=http://www.w3.org/1999/xhtml>
    <head>
        <title>我的标题</title>
        <meta charset="utf-8" />
    </head>
    <body>
    <p><b>hello p</b>123</p>
    <p id="p2">hello p ,666<span>this is a span</span></p>
    <div>
        this is div
        <a class="classA" href="http://www.baidu.com">百度一下</a>
        <a class="classB" href="http://www.google.com">谷歌</a>
    </div>
    </body>
</html>
index.html

1.2 bs4简介

Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree)。 它提供简单又常用的导航(navigating),搜索以及修改剖析树的操作。它可以大大节省你的编程时间。 对于Ruby,使用Rubyful Soup。

安装bs4:

pip install beautifulSoup4

BeautifulSoup默认支持Python的标准HTML解析库,但是它也支持一些第三方的解析库:

创建对象:

from bs4 import BeautifulSoup   

import requests

url='http://www.baidu.com'

resp=requests.get(url)

html=resp.read()

bs=BeautifulSoup(html)     #实例化对象

print bs.prettify()  #格式化输出

对象种类:

l  Tag:相当于HTML的标签。

Tag的常用属性:

name:标签名。

attrs:标签的属性。

l  NavigableString:标签的string属性,指的是标签内的字符串,可以跨越多层标签。

soup = BeautifulSoup(open('index.html','rb'), "html.parser")
# print(soup.prettify())
print(soup.title) #<title>...</title>
print(soup.a)
print(soup.a.name)
print(soup.a.parent.name)
# print(soup.a.parent.parent.parent.parent.parent.name)
print(soup.a.attrs)
print(soup.a.attrs['class'])
print(soup.a.attrs['href'])
print(soup.a.string)   # NavigableString
print(soup.p.string)   # 跨越多个标签层次

print(soup.body.contents)
print(soup.find('p',id='p2').get_text())
print(soup.find('p',id='p2').string)
print(soup.find('div').get_text())
print(len(soup.body.contents))   #body字标签

# find
print(soup.findAll('a'))
View Code
搜索文档树

find_all( name , attrs , recursive , text , **kwargs )

find ( name , attrs , recursive , text , **kwargs )

  • Name:标签名。
  • Attrs:属性约束。
  • Recursive:是一个布尔参数(默认为True),用于指定Beautiful Soup遍历整个剖析树, 还是只查找当前的子标签或者剖析对象
  • Text:是一个用于搜索NavigableString对象的参数。 它的值可以是字符串,一个正则表达式, 一个list或dictionary,True或None。
BeautifulSoup之CSS选择器

       BeautifulSoup支持大部分的CSS选择器,其语法为:向tag或soup对象的.select()方法中传入字符串参数,选择的结果以列表形式返回。

       Tag.get_text():获取标签的所有字符串,包括字标签内的字符串。

原文地址:https://www.cnblogs.com/zhuxiang1633/p/8970919.html