吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5190|回复: 42
收起左侧

[Python 转载] 爬虫第二天!扶我起来,我还有头发!!!

[复制链接]
王大哈哈 发表于 2021-1-7 12:30
大家好,在领导的压迫之下,我还是偷摸总结了以下我上午所学的知识!


昨天学习了 urllib.request()函数来请求网站并且适当的伪装了那么一下下。
今天就将昨天所爬取到的数据进行提炼,把需要的数据呢,进行提取出来。


在上一篇帖子中,我们爬取了网页的源代码,但是我发现,源代码中虽然有我需要的数据吧!
可是,你给我的没用的东西太多了。我要你那么多html标签干啥。又不能当饭吃,也不能当钱花。
更生气的是,我还不能有脾气!!!!谁让规矩是死的呢!
既然你不给我现成的,那我就只能自己去找我想要得了!


在这么多数据中,想要靠自己去找我们需要的数据,简直就是大海捞针。
那么,在word中有查找功能,是不是python也有一些可以查找功能的库。
然后,我就学习了 re库 和 bs4库中的BeautifulSoup()


这两个吧可气的是都能查找一定的数据,
But,我们总要选择一个合适的吧,
这时!正则表达式闪亮登场!!


其实学过java python 等等的编程语言的hxd们都知道正则表达式,学会了它,好多语言都通用


正则表达式:“老子通杀!!!!”

使用正则表达式了,那么就需要我们的re库了。
那么re库需要了解一下常用的函数




常用函数:
函数说明 返回类型
re.search() 在一个字符串中搜索匹配的正则表达式的第一个位置 返回match对象
re.match()从一个字符串的开始位置起,匹配正则表达式 返回match对象
re.findall() 搜索字符串,以列表类型返回全部能匹配的子串(子串就是字符串中查找到的数据) 返回列表类型
re.split() 将一个字符串按照正则表达式分割 返回列表类型
re.finditer() 搜索字符串,返回一个匹配结果的迭代类型 每个迭代元素match对象
re.sub() 在一个字符串中替换所有匹配的正则表达式的字串返回替换后的字符串





了解完常用函数,在了解一下什么是正则表达式,看表

字符表示意思 案例
[^] 非字符集,对单个字符给出取值范围[^abc] 表示非abc
*前一个字符0次或者无限次扩展 abc*表示ab,abc,abcc,abccc(无限次)
+ 前一个字符1次或者无限次扩展 abc+表示abc,abcc,abccc
? 前一个字符0次或者一次扩展 abc?表示ab,abc
| 左右表达式任意一个 abc | def 表示 abc 和 def随便那个都行
{m} 扩展前一个字符m次 ab{2}c表示abbc
{m.n} 扩展前一个字符m到n次(注意:包含n) ab{1,2}表示abc,abbc
^ 匹配字符串开头 ^abc 表示abc在一个字符串的开头
$ 匹配字符串结尾 abc$表示abc在一个字符串的结尾
() 分组标记 (abc) 表示 abc
\d 所有数字【0-9】
\w 所有单词字符【A-Za-z0-9】
[ ] 字符集对单个字符给出的取值范围 [abc]表示abc
.表示任何一个单个字符[a.z]表示a到z个


当时我看到这些东西,内心想,这都是些啥玩意,
用了之后才知道。真香!!


光说不练假把式!
上菜!




[Python] 纯文本查看 复制代码
#-*- codeing = utf-8 -*-
import urllib.request,urllib.error
from bs4 import BeautifulSoup
import  re
findLink = re.compile(r'<a href="(.*?)">')
def askURL(url):
    headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
    }
    req = urllib.request.Request(url,headers=headers)
    response = urllib.request.urlopen(req)
    html = response.read().decode('utf-8')
    return html
def getData(url):
    getlist = []
    for i in range(1):
        newurl = url+str(i*25)
        html = askURL(newurl)
        #解析数据
        suop = BeautifulSoup(html,'html.parser')
        for item in suop.find_all('div',class_="item"):
            item = str(item)
            link = re.findall(findLink,item)[0]
            print(link)
    return getlist


url = "https://movie.douban.com/top250?start="
getData(url)




这段代码的作用主要是爬取豆瓣网前250个电影的链接,

来解读一下代码:


我们看这句代码:findLink = re.compile(r'<a href="(.*?)">')


re.compile()函数 个人理解就是 将我们设置的正则表达式起个名字进行封装,后面调用方便


我们看函数里面的内容:





r'<a href="(.*?)">'


r在字符串前面 就是告诉我们的程序,什么“\',\\”这些转义字符统统别给我执行。
无论你出身贵贱,统统都是字符串!嘿嘿!




再看getData()这个函数:


for循环的主要作用就是翻页用的,顺带手的吧每页所需要的内容提出出来。




再来看这句代码:


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

这句代码的使用到了BeautifulSoup()函数

个人理解:就是把我们网页源代码“html”传入进去,添加“html.parser”参数

告诉BeautifulSoup你在解析的时候注意一下,我这是个html的网页代码。就这么简单。

然后封装到soup中





嵌套的for循环呢 看图:


image.png

一个网页中有25个电影,我都需要看,所以都给他们提取出来.




suop.find_all('div',class_="item")


这句代码的意思就去查找一个div标签,类名为“item”的div标签获取它的数据


那  'div',class_="item"  怎么来的呢。看图:


image.png


从图中可以看到  我们需要的电影的各种信息都在这个div中,


那真是太棒了,我们将这个div从我们爬取的页面中在提取出来。


使用定义的findLink这个正则表达式去匹配刚爬取的这段div的信息!






接下来使用re.findall()函数对他进行查找


首先告诉findall我们使用的规则是findLink  ,你用这个规则在item中给我找到对应的数据。


至于【0】是怕查出多条相同的链接,我们只要第一条就好了!


完美!




最后打印输出。
查看一下!
image.png





最近河北疫情超级严重。

哎,大家保护好自己一定要!


为我的家乡祈祷!


2020的大家鼠实不易


望大家2021大家牛转乾坤


加油!!!奥里给!!!!!!!!!


驴肉火烧给国际庄加油了!


但驴肉火烧也要保护好自己!!

















免费评分

参与人数 19吾爱币 +15 热心值 +16 收起 理由
l2430478 + 1 加油加油加油^0^~
paguco + 1 + 1 用心讨论,共获提升!
酥小劫 + 1 热心回复!
xhtdtk + 1 + 1 用心讨论,共获提升!
painstaking1 + 1 + 1 谢谢@Thanks!
醉牛牛發財 + 1 + 1 666 头发已经掉光了
嘟鲁鲁 + 1 + 1 6666666666666,通俗易懂
巴扎黑呗 + 1 我很赞同!
js67941888 + 1 + 1 谢谢@Thanks!
帅滴一批 + 1 + 1 我很赞同!
大虫 + 1 + 1 用心讨论,共获提升!
waltzofjack + 1 在轻松活泼的气氛中学到了几丝技术
楼主你好萌 + 1 + 1 我很赞同!
Saikit + 1 我很赞同!
fisherpau + 1 + 1 谢谢@Thanks!
阿傑 + 1 我很赞同!
真风纯 + 1 谢谢@Thanks!
hacksz + 2 我很赞同!
kidneyissource + 1 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ttphoon2010 发表于 2021-1-8 14:40
开始阶段用requests、bs4以及正则还不错,然后bs4和正则的性能是有一定差距,你可以自己尝试对比然后;之后批量爬虫的还是用scrapy啥的好点
头像被屏蔽
Deuez 发表于 2021-1-10 13:15
Hangjau 发表于 2021-1-7 12:33
 楼主| 王大哈哈 发表于 2021-1-7 12:39
Hangjau 发表于 2021-1-7 12:33
楼主 用下requests 吧 比较方便 虽然别人封装

好的,下次使用
花不开但要富贵 发表于 2021-1-7 12:41
现在用requests的比较多了,urllib有点跟不上了
kaka0000 发表于 2021-1-7 12:58
requests,谁用谁知道
kidneyissource 发表于 2021-1-7 13:01
楼主是在实习吗,还是正式工作了啊
hnwang 发表于 2021-1-7 13:04
感谢分享 我就在国际庄 加油
柠檬Cat 发表于 2021-1-7 13:07
xpath好用
hacksz 发表于 2021-1-7 13:16
可以,就路过
yang710883 发表于 2021-1-7 13:22
这是一篇学习的好文章。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 21:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表