最新适合零基础 Python爬虫数据采集的4种方式

结果:1,从头到尾匹配字符,直到找到一个匹配,需要.group才能获取到匹配到的值。re.serach()和re.match()的区别,re.search()将匹配所有的字符,re.match只匹配字符串的开头,如果开头不符合规则,则返回None。

(3)re.complie() re.finder() 返回迭代器 re.sub() :替换

re.sub(pattern, repl, string, count,flag)

import re
str1='12s3asdfa'
mathch1 = re.sub("[0-9]",'|',str1)
print(mathch1)

结果:||s|asdfa;用后面的字符替换前面的符合规则的字符。

利用最常用的方法compile()和findall()结合获取数据

html = res.text
p=re.compile('<div class="movie-item-info">.*?<a href="/films/.*?title="(.*?)".*?<p class="star">\s+(.*?)\s+</p>.*?<p class="releasetime">(.*?)</p>',re.S)
result=re.findall(p,html)

注意观察compile()方法中的.?和(.?)

而(.?)就是我们要获取的信息,.?是省略掉的信息

例如:

html=“abcdabcd” p=re.compile(‘ab.*?<(.*?)>’) result=re.findall(p,html)

此时result中的 内容就是hello world。

需要注意的是result是列表信息,就是说我们可以保存多个数据(也就是说模板中可以有多个(.*?)),而且只要html中符合模板中空缺的数据,都会全部保存下来。

这个方法的基本思想是利用compile()构造出一个模板然后利用findall()将构造的模板去跟我们爬取的数据对比,找出我们需要的数据,也就是我们自己设置的模板中的(.*?)

补充:构建模板

  • 找到你爬取的网页,点击f12,查看网页原码
  • 找到你要爬取的信息在源码中的位置
  • 把那部分源码复制下来,观察你所需要的 信息,合理利用.?以及(.?)即可获取到你自己想要的信息

案例:

# 拿到页面源代码, requests
# 通过re来提取想要的有效信息 re
import csv
 
import requests
import re
 
# 伪装头
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
 
# 目标网址
url = "https://movie.douban.com/top250"
 
# 发送请求,获取响应
resp = requests.get(url, headers=headers)
page_content = resp.text
 
# print(page_content)
# 解析数据
obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)'
                 r'</span>.*?<p class="">.*?<br>(?P<year>.*?)&nbsp.*?<span '
                 r'class="rating_num" property="v:average">(?P<score>.*?)</span>.*?'
                 r'<span>(?P<num>.*?)人评价</span>', re.S)
# 开始匹配 + 本地保存
result = obj.finditer(page_content)
f = open("data.csv", mode="w", encoding="utf8")
csvwriter = csv.writer(f)
for it in result:
    # print(it.group("name"))
    # print(it.group("score"))
    # print(it.group("num"))
    # print(it.group("year").strip())
    dic = it.groupdict()
    dic['year'] = dic['year'].strip()
    csvwriter.writerow(dic.values())
 
f.close()
print("over!")

2、bs4 的使用

使用 pip 安装即可

 pip install beautifulsoup4

beautifulsoup导包:

from bs4 import BeautifulSoup

  • find 方法返回一个解析完毕的对象
  • findall 方法返回的是解析列表list
  • select 方法返回的是解析列表list
  • 获取属性的方法: get(‘属性名字’)
  • 和获取文本的方法: get_text()
  • 需要知道使用bs4时,需要指明解析器 一般是lxml
#创建 Beautiful Soup 对象
# soup = BeautifulSoup(html)

#打开本地 HTML 文件的方式来创建对象
#soup = BeautifulSoup(open('index.html'))
soup = BeautifulSoup(html_str, 'lxml')   # 常用的方式

#格式化输出 soup 对象的内容
result = soup.prettify()

常用方法如下:

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

CSS选择器

(1)通过标签选择器查找
print soup.select('title') 
#[<title>The Dormouse's story</title>]

(2)通过类选择器查找
print soup.select('.sister')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

(3)通过 id 选择器查找
print soup.select('#link1')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

(4)层级选择器 查找
print soup.select('p #link1')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

(5)通过属性选择器查找
print soup.select('a[href="http://example.com/elsie"]')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

(6) 获取文本内容 get_text()
soup = BeautifulSoup(html, 'lxml')
print type(soup.select('title'))
print soup.select('title')[0].get_text()

for title in soup.select('title'):
    print title.get_text()
    
(7) 获取属性 get('属性的名字')
soup = BeautifulSoup(html, 'lxml')
print type(soup.select('a'))
print soup.select('a')[0].get('href')

3、xpath的使用

一般与lxml 一起使用;

平日里最常用到的是xpath,因为xpath这种数据解析的通用性比较强,不止在Python中可以使用xpath,在其它的编程语言中也会使用。

xml库的安装

pip install lxml

lxml的导包

from lxml import etree

lxml转换解析类型的方法:etree.HTML(text)

lxml解析数据的方法:data.xpath(“//div/text()”)

需要注意lxml提取完毕数据的数据类型都是列表类型;

如果数据比较复杂:

先提取大节点,在遍历小节点操作,把转化后的element对象转化为字符串,返回bytes类型结果 etree.tostring(element)

返回的是element对象可以继续使用xpath方法,对此我们可以在后面的数据提取过程中:先根据某个标签进行分组,分组之后再进行数据的提取。

发现结果是一个element对象,这个对象能够继续使用xpath方法:要注意的是 xpath的语法就变成了在此element的路径进行下一步的匹配 使用 ./ (点斜杠) 表示当前路径。

xpath的节点关系:根节点,子节点,父节点,兄弟节点,子节点,后代节点
xpath的重点语法获取任意节点://
xpath的重点语法根据属性获取节点:标签[@属性 = ‘值’]
xpath的获取节点属性值:@属性值
xpath的获取节点文本值:text()
xpath的使用方法: 如果没有取到想要的结果,再去看他的父元素,一直往上找。

属性匹配

匹配时可以用@符号进行属性过滤,例如匹配li下属性class为item-5的内容

//li[@class="item-5"]

文本获取

有两种方法:一是获取文本所在节点后直接获取文本,二是使用 //。

第二种方法会获取到补全代码时换行产生的特殊字符,推荐使用第一种方法,可以保证获取的结果是整洁的。

# 第一种
from lxml import etree

html_data = html.xpath('//li[@class="item-1"]/a/text()')
print(html_data)
# 第二种
html_data = html.xpath('//li[@class="item-1"]//text()')
print(html_data)

属性获取

@符号相当于过滤器,可以直接获取节点的属性值

result = html.xpath('//li/a/@href')
print(result)
# 运行结果:['https://s1.bdstatic.com/', 'https://s2.bdstatic.com/', 'https://s3.bdstatic.com/', 'https://s4.bdstatic.com/', 'https://s5.bdstatic.com/', 'https://s6.bdstatic.com/']

属性多值匹配

某些节点的某个属性可能有多个值:

from lxml import etree

text = '''
<li class="zxc  asd  wer"><a href="https://s2.bdstatic.com/">1 item</a></li>
<li class="ddd  asd  eee"><a href="https://s3.bdstatic.com/">2 item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "asd")]/a/text()')
print(result)

# 运行结果:['1 item', '2 item']

多属性匹配

当前节点有多个属性时,需要同时进行匹配:

from lxml import etree

text = '''
<li class="zxc  asd  wer" name="222"><a href="https://s2.bdstatic.com/">1 item</a></li>
<li class="ddd  zxc  eee" name="111"><a href="https://s3.bdstatic.com/">2 item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "zxc") and @name="111"]/a/text()')
print(result)

# 运行结果:['2 item']

4、什么是PyQuery?

PyQuery是类似于jQuery的网页解析工具,是仿照 jQuery 实现的,语法与 jQuery 几乎相同。

使用jQuery的风格来遍历xml文档,它使用lxml操作html的xml文档,和解析库xpath与Beautiful Soup比起来更加灵活简便,且增加了添加类和移除节点的操作,这些操作有时会为提取信息带来极大的便利。

在使用之前,请先安装好qyquery库;

使用如下终端命令安装

pip install pyquery

安装完成后导包

from pyquery import PyQuery as pq

初始化

和Beautiul Soup一样,在初始化pyquery的时候,也需要传入html文本来初始化一个pyquery对象。

初始化的时候一般有三种传入方式:传入字符串、传入URL、传入html文件;最常用的初始化方式还是以字符串的形式传递。

  • 字符串初始化
html = '''
<div>
    <ul>
        <li class="item-0">first-item</li>
        <li class="item-1"><a href="link2.html">second item</a></li>
        <li class="item=-0 active"><a href="link3.html"><span class=""bold>third item</span></a></li>
        <li class="item-1 active"><a href="link4.html">fourth item</a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>        
    </ul>
</div>
'''
 
from pyquery import PyQuery as pq
 
 
doc = pq(html)
print(doc)
print(type(doc))
print(doc('li'))

首先引入PyQuery对象,取名为pq。然后声明一个长HTML字符串,并将其当作参数传给PyQuery类,这样就成功的进行了初始化。

接下来将css选择器作为参数传入初始化对象,在这个示例中我们传入li节点,这样就可以选择所有的li节点.。

  • URL初始化

将URL作为参数传入初始化对象;

from pyquery import PyQuery as pq
 
 
doc = pq('https://www.baidu.com', encoding='utf-8')
print(doc)
print(type(doc))
print(doc('title'))

运行上面的代码你会发现,我们成功的获取到了百度的title节点和网页信息。

PyQuery对象会先请求这个URL,然后用得到的HTML内容完成初始化,这其实就相当于网页源代码以字符串的形式传递给初始化对象。

  • 文件初始化

传递本地文件名,将参数指定为filename即可。

from pyquery import PyQuery as pq
 
 
doc = pq(filename='baidu.html')
print(doc)
print(type(doc))
print(doc('title'))

一般来说,在网页里面我们需要获取的信息有两类:一类是文本内容,另一类是节点属性值。

  • 获取属性

获取到某个PyQuery类型的节点之后,就可以通过attr()方法来获取属性。

from pyquery import PyQuery as pq
 
 
doc = pq(html)
a = doc('.list .item-0.active a')
print(a.attr('href'))

先获取class为list下面的class为item-0 active的节点下的a节点,这时变量a是PyQuery类型,再调用attr()方法并传入属性值href。

也可以通过调用attr属性来获取属性,输出结果与上面的代码是一样的;



现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。



分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

![](https://img-blog.csdnimg.cn/img_convert/21b2604bd33c4b6713f686ddd3fe5aff.png)



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值