王大哈哈 发表于 2021-1-7 12:30

爬虫第二天!扶我起来,我还有头发!!!

大家好,在领导的压迫之下,我还是偷摸总结了以下我上午所学的知识!
https://static.52pojie.cn/static/image/hrline/1.gif

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

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


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


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


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


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

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


https://static.52pojie.cn/static/image/hrline/1.gif

常用函数:

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


https://static.52pojie.cn/static/image/hrline/1.gif


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


字符表示意思 案例
[^] 非字符集,对单个字符给出取值范围[^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
.表示任何一个单个字符表示a到z个


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


光说不练假把式!
上菜!

https://static.52pojie.cn/static/image/hrline/1.gif


#-*- codeing = utf-8 -*-
import urllib.request,urllib.error
from bs4 import BeautifulSoup
importre
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)
            print(link)
    return getlist


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


https://static.52pojie.cn/static/image/hrline/1.gif
这段代码的作用主要是爬取豆瓣网前250个电影的链接,

来解读一下代码:

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


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


我们看函数里面的内容:

https://static.52pojie.cn/static/image/hrline/1.gif


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


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

https://static.52pojie.cn/static/image/hrline/1.gif


再看getData()这个函数:


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

https://static.52pojie.cn/static/image/hrline/1.gif


再来看这句代码:


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

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

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

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

然后封装到soup中

https://static.52pojie.cn/static/image/hrline/1.gif



嵌套的for循环呢 看图:




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

https://static.52pojie.cn/static/image/hrline/1.gif


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


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


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





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


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


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

https://static.52pojie.cn/static/image/hrline/1.gif




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


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


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


完美!

https://static.52pojie.cn/static/image/hrline/1.gif


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



https://static.52pojie.cn/static/image/hrline/1.gif


最近河北疫情超级严重。

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


为我的家乡祈祷!


2020的大家鼠实不易


望大家2021大家牛转乾坤


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


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


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

https://static.52pojie.cn/static/image/hrline/1.gif















ttphoon2010 发表于 2021-1-8 14:40

{:301_996:}开始阶段用requests、bs4以及正则还不错,然后bs4和正则的性能是有一定差距,你可以自己尝试对比然后;之后批量爬虫的还是用scrapy啥的好点

Deuez 发表于 2021-1-10 13:15

Hangjau 发表于 2021-1-7 12:33

楼主 用下requests 吧 比较方便 虽然别人封装

王大哈哈 发表于 2021-1-7 12:39

Hangjau 发表于 2021-1-7 12:33
楼主 用下requests 吧 比较方便 虽然别人封装

好的,下次使用{:1_927:}

花不开但要富贵 发表于 2021-1-7 12:41

现在用requests的比较多了,urllib有点跟不上了

kaka0000 发表于 2021-1-7 12:58

requests,谁用谁知道{:1_918:}

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

这是一篇学习的好文章。
页: [1] 2 3 4 5
查看完整版本: 爬虫第二天!扶我起来,我还有头发!!!