Python爬虫入门

一、Request库

1、request库安装

①同时按下win+R,输入cmd,打开命令行。

②输入pip install requests。

③输入python,启动python,再输入import requests。若不报错则安装成功。

2、Requests库的7个主要方法

requests.request():构造一个请求,支撑一下各方法的基础方法。

requests.get():获取html网页的主要方法,对应于http的get。

requests.head():获取html网页头信息的方法,对应于http的head。

requests.post():向html网页提交post请求的方法,对应于http的post。

requests.put():向html网页提交put请求的方法,对应于http的put。

requests.patch():向html网页提交patch请求的方法,对应于http的patch。

requests.delete():向html页面提交删除请求,对应于http的DELETE。

3、Response对象的属性

r.status_code:http请求的返回状态,200表示连接成功,404表示失败,。

r.text:http响应内容的字符串形式,即url对应的页面内容。

r.encoding:从http header中猜测的相应内容编码方式

r.apprent_encoding:从内容中分析出的响应内容编码方式(备选编码方式)。

r.content:http响应内容的二进制形式。

4、Requests库异常

requests.ConnectionError:网络连接错误异常,如DNS查询失败、拒绝连接等。

requests.HTTPError:HTTP错误异常。

requests.URLRequired:URL缺失异常。

requests.TooManyRedirects:超过最大重定向次数,产生重定向异常。

requests.ConnectTimeout:连接远程服务器超时异常。

requests.Timeout:请求URL超时,产生超时异常。

5、理解Requests库的异常

r.raise_for_status():如果不是200,产生异常requests.HTTPError。

6、http协议

URL格式:http://host[:port][path]

host:合法的Internet主机域名或IP地址。

port:端口号,可不写,默认为80。

path:请求资源的路径。

二、Beautiful Soup库

1、安装

打开cmd,输入pip install beautifulsoup4。

2、使用

from bs4 import BeautifulSoup

soup=BeautifulSoup(data,'html.parser')

其中data为爬取的网页源代码,html.parser为对data的解释器。

3、基本元素

bs4库的理解

bs4库是解析、遍历、维护“标签树”的功能书。

<p class="title">..</p>

<p>..</p>是以p为名称的标签类型。

class=“title”是该标签的属性域,是一个键值对。

引用方式

from bs4 import BeautifulSoup

import bs4

解析器

bs4的HTML解析器:BeautifulSoup(mk,'html.parser') 需安装bs4库。

lxml的HTML解析器:BeautifulSoup(mk,'lxml')需pip install lxml。

lxml的XML解析器:BeautifulSoup(mk,'xml')需pip install lxml。

html5lib的解析器:BeautifulSoup(mk,'html5lib')需pip install html5lib。

BeautifulSoup类的基本元素

Tag:标签,最基本的信息组织单元,分别用<>和</>标明开头或结尾。

Name:标签的名字,<p>...</p>的名字是p,格式:<tag>.name。

Attributes:标签的属性,字典形式组织,格式:<tag>.attrs

NavigableString:标签内非属性字符串,<>...</>中字符串,格式为<tag>.string。

Comment:标签内字符串的注释部分,一种特殊的Comment类型。

4、基于bs4库的HTML内容遍历方法

标签树下行遍历

.contents:子节点的列表,将<tag>所有儿子节点存入列表。

.children:子节点的迭代类型,与.content类似,用于循环遍历儿子节点。

.descendants:子孙节点的迭代类型,包含所有子孙节点,用于循环遍历。

标签树的上行遍历

.parent:节点的父亲标签

.parents:节点先辈(不止父亲)标签的迭代类型,用于循环遍历先辈节点。

标签树的平行遍历

.next_sibling:返回按照html文本顺序的下一个平行节点标签。

.previous_sibling:返回按照html文本顺序的上一个平行节点标签。

.next_siblings:迭代类型,返回按照html文本顺序的后续所有平行节点标签。

.previous_siblings:迭代类型,返回按照html文本顺序的前序所有平行节点标签。

遍历后续节点

for sibling in soup.a.next_siblings:

print(sibling)

遍历前序节点

for sibling in soup.a.previous_siblings:

print(sibling)

#迭代类型只能用在循环中!!!

基于bs4库的HTML格式化和编码

格式化

.prettify():为标签添加换行符。

编码:UTF-8,支持中文。

基于bs4库的HTML内容查找方法

.find_all(name,attrs,recursive,string,**kwargs)

name:对标签名称的检索字符串。

attrs:对标签属性值的检索字符串,可标注属性检索。

recursive:是否对子孙所有节点进行搜索,默认为true。

string:<>...</>中字符串区域的检索字符串。

简写:

<tag>(...)等价于<tag>.find_all(...)

soup(...)等价于soup.find_all(...)

扩展方法

<>.find():搜索且只返回一个结果,字符串类型,同.find_all()参数。

<>.find_parents():在先辈节点中搜索,返回列表类型,同.find_all()参数。

<>.find_parent():在先辈节点中返回一个结果,字符串类型,同.find()参数。

<>.find_next_siblings():在后续平行节点中搜索,返回列表类型,同.find_all()参数。

<>.find_next_sibling():在后续平行节点中返回一个结果,字符串类型,同.find()参数。

<>.find_previous_siblings():在前序平行节点中搜索,返回列表类型,同.find_all()参数。

<>.find_previous_sibling():在前序平行节点中返回一个结果,字符串类型,同.find()参数。

三、正则表达式

1、正则表达式的概念

用来表达字符串的简洁方式。

通用的字符串表达框架。

字符串匹配。

2、正则表达式的语法

正则表达式长常用操作符

.:表示任何单个字符。

[]:字符集,对单个字符给出取值范围。[abc]表示a,b,c,[a-z]表示a到z的单个字符。

[^ ]:非字符集,对单个字符给出排除范围。[^abc]表示非a或非b或非c的单个字符。

*:前一个字符出现0次或无限次扩展。abc*表示ab,abc,abcc,abccc等。

+:前一个字符1次或无限次扩展。abc+表示abc,abcc,abcc等

?:前一个字符0次或1次扩展。abc?表示ab、abc。

|:左右表达式任意一个。abc|def表示abc、def。

{m}:表示扩展前一个字符m次。ab{2}c表示abbc。

{m,n}:扩展前一个字符m至n次(含n),ab{1,2}c表示abc、abbc。

^:匹配字符串开头。^abc表示abc且在一个字符串的开头。

$:匹配字符串结尾。abc$表示abc且在一个字符串的结尾。

():分组标记,内部只能使用|操作符。(abc)表示abc,(abc|def)表示abc、def。

\d:数字,等价于[0-9]。

\w:单词字符,等价于[A-za-z0-9_]。

#匹配中文字符串:[\u4e00-\u9fa5]

匹配IP地址的正则表达式

IP地址分4段,每段0-255。

(([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]).){3}([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])

3、Re库的基本使用

Re库介绍

Re库是python标准库,主要用于字符串的匹配。

调用方式:import re

正则表达式的表示类型

raw string类型(原生字符串类型)

用法:r''。即在字符串前面加一个r。

原生字符串:不含转义符\的字符串。

string类型

即不加r,是平时用的字符串,更繁琐。

需用\\来表示\。

Re库主要功能函数

re.search(pattern,string,flags=0)

在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象。

pattern:正则表达式的字符串或原生字符串表示。

string:待匹配字符串。

flags:使用时的控制标记。

re.I | re.IGNORECASE:忽略正则表达式的大小写,[A-Z]能够匹配小写字符。

re.M | re.MULTILINE:正则表达式种的^操作符能够将给定字符串的每行当作匹配开始。

re.S | re.DOTALL:正则表达式种的.操作符能够匹配所有字符,默认匹配除换行外的所有字符。

re.match(pattern,string,flags=0)

从一个字符串的开始位置起匹配正则表达式,返回match对象。

参数含义同re.search。

re.findall(pattern,string,flags=0)

搜索字符串,以列表类型返回全部能匹配的字串。

参数含义同re.search。

re.splite(pattern,string,maxsplit=0,flags=0)

将一个字符串按照正则表达式匹配结果进行分割,返回列表类型。

参数含义同re.search。

maxsplit:最大分割数,剩余部分作为最后一个元素输出。

re.finditer(pattern,string,flags=0)

搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象。

参数含义同re.search。

re.sub(pattern,repl,string,count=0,flags=0)

在一个字符串中替换所有匹配正则表达式的子串,返回替换后的子串。

参数含义同re.search。

repl:替换匹配字符串的字符串。

count:匹配的最大替换次数。

#re.compile:面向对象。

rst=re.search(r'[1-9]\d{5},'BIT 100081")

等价于

pat=re.compile(r'[1-9]\d{5}')

rst=pat.search('BIT 100081')

#re.compile(pattern,flags=0)

将正则表达式的字符串形式编译成正则表达式对象。

4、Re库的match对象

Match对象的属性

.string:待匹配的文本。

.re:匹配时使用的pattern对象(正则表达式)。

.pos:正则表达式搜索文本的开始位置。

.endpos:正则表达式搜索文本的结束位置。

Match对象的方法

.group(0):获得匹配后的字符串。

.start():匹配字符串在原始字符串的开始位置。

.end():匹配字符串在原始字符串的结束位置。

.span():返回(.start(),.end())

5、Re库的贪婪匹配和最小匹配

贪婪匹配

Re库默认采用贪婪匹配,即输出匹配最长的子串。

最小匹配操作符

*?:前一个字符0次或无限次扩展,最小匹配。

+?:前一个字符1次或无限次扩展,最小匹配。

??:前一个字符0次或1次,最小匹配。

{m,n}?:扩展前一个字符m至n次(含n),最小匹配。

四、Scrapy框架

1、Scrapy库安装

打开cmd输入pip install scrapy

2、Scrapy爬虫框架结构

5+2结构、数据流

3、Scarpy爬虫框架解析

ENGINE:

控制所有模块之间的数据流。

根据条件触发事件。

不需要用户修改。

DOWNLOADER:

根据请求下载网页。

不需要修改。

SCHEDULER:

对所有爬取请求进行调度管理。

不需要用户修改

DOWNLOADER MIDDLEWARE

downloader和engine两个模块之间的中间键。

目的:实施Engine、Scheduler和Downloader之间进行用户可配置的控制。

功能:修改、丢弃、新增请求或响应。

用户可以编写代码修改。

Spider:

解析Downloader返回的响应(Response)。

产生爬取项(scraped item)。

产生额外的爬取请求(Request)。

需要用户编写配置代码。

Item Pipelines:

以流水线方式处理Spider产生的爬取项。

由一组操作顺序组成,类似流水线,每个操作是一个Item Pipeline类型。

可能操作包括:清理、检验和查重爬取项中的HTML数据、将数据存储到数据库。

需要用户编写配置代码。

Spider Middleware

Spider和Engine之间的中间键。

目的:对请求和爬取项的再处理。

功能:修改、丢弃、新增请求或爬取项。

用户可以编写配置代码。

4、Scrapy爬虫的常用命令

Scrapy命令行(cmd)

startproject

创建一个新工程。

scrapy startproject<name>[dir]

genspider

创建一个爬虫。

scrapy genspider[options]<name><domain>

settings

获得爬虫配置信息。

scrapy settings[options]

crawl

运行一个爬虫。

scrapy crawl<spider>

list

列出工程中所有爬虫。

scrapy list

shell

启动url调试命令行。

scrapy shell[url]

操作步骤

1、建立一个Scrapy爬虫工程

①、打开命令行,切换到自己希望存储的目录。

②、输入scrapy startproject 文件名

③、生成工程目录

文件夹:外层目录

scrapy.cfg:部署scrapy爬虫的配置文件。

文件夹:scrapy框架的用户自定义python代码。

_init_.py:初始化脚本

item.py:Items代码模板(继承类)

middlewares.py:Middlewares代码模板(继承类)

pipelines.py:pipelines代码模板(继承类)

settings.py:scrapy爬虫的配置文件

spiders/:spiders代码模板目录(继承类)

_init_.py:初始文件,无需修改。

_pycache_/:缓存目录,无需修改。

2、在工程中产生一个Scrapy爬虫

命令行中输入scrapy genspider 文件名 爬取网站网址

3、配置产生的spider爬虫

#例子
import scrapy
​
​
class DemoSpider(scrapy.Spider):
    name = 'demo'
    #allowed_domains = ['python123.io']
    start_urls = ['http://python123.io/ws/demo.html']
​
    def parse(self, response):
        fname=response.url.split('/')[-1]
        with open(fname,'wb') as f:
            f.write(response.body)
        self.log('Saved file %s.' % name)
        pass

4、运行爬虫,获取网页

5、yield关键词使用

yeild<-->生成器

1、生成器是一个不断产生值的函数。

2、包含yield语句的函数是一个生成器。

3、生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值。

实例

生成器写法

def gen(n):
    for j in range(n):
        yield j**2
#产生所有小于n的数的平方值,运行到yield这一行时,运算i**2的值并返回,然后函数被冻结。
for i in gen(5):
    print(i, " ", end="")
#>>>输出结果:0  1  4  9  16
#这块儿只可意会不可言传,大概解释一下就是,进入主函数的for循环的时候,先运行gen(5),此时进入gen函数,第一次走gen里的循环,j=0,经过yield,返回0给i,此时i为0。第一次i循环结束。走第二次,再次调用gen,此时gen里的j=1,重复上述。按我的说法就是,yield是一个有记录状态功能的return。

6、Scrapy爬虫的基本使用

Scrapy爬虫的使用步骤:

1、创建一个工程和Spider模板

2、编写Spider

3、编写Item Pipeline

4、优化配置策略

Scrapy爬虫的数据类型:

Request类

class scrapy.http.Request()

Request对象表示一个HTTP请求。

由Spider生成,由Downloader执行。

属性或方法:

.url:Request对应的请求URL地址。

.method:对应的请求方法,'GET''POST'等。

.headers:字典类型风格的请求头。

.body:请求内容主体,字符串类型。

.meta:用户添加的扩展信息,在Scrapy内部模块间传递信息使用。

.copy():复制该请求。

Response类

class scrapy.http.Response()

Response对象表示一个HTTP响应。

由Downloader生成,由Spider处理。

属性或方法:

.url:Response对应的url地址。

.status:HTTP状态码,200、404、403……

.headers:Response对应的头部信息。

.body:Response对应的内容信息,字符串类型。

.flags:一组标记。

.request:产生Response类型对应的Request对象。

.copy():复制该响应。

Item类

class scrapy.item.Item()

Item对象表示一个从HTML页面中提取的信息内容。

由Spider生成,由Item Pipeline处理。

Item类似字典类型,可以按照字典类型操作。

Scrapy爬虫支持的HTML信息提取方法

Beautiful Soup

lxml

re

XPath Selector

CSS Selector

使用格式:<html>.css('a::attr(href)').extract()

其中,a为标签名称,href是标签属性。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值