php正则函数抓取网页连接(爬虫与爬虫的前端知识介绍及前端应用知识分析介绍)
优采云 发布时间: 2022-04-01 15:06php正则函数抓取网页连接(爬虫与爬虫的前端知识介绍及前端应用知识分析介绍)
内容
一、爬虫和爬虫的合法性
Python爬虫可能大家都知道,但是爬虫所做的,用我自己的话来说,就是把数据取出来供自己使用。这里的数据是指互联网上的资源,比如百度上发布的网站信息你可以得到。爬虫通常有三种方法:正则表达式、bs4和xpath
这里涉及到爬虫的合法性。我认为在目前的学习阶段,你能爬取的数据都是在后台显示的,所以不会出现非法问题。爬虫的目的是为了方便你更快的取出这些数据,整合在一起。就像我以前学爬虫的时候看到很多梗一样,我说爬虫很好,监狱里能吃的都吃。我可能还没有达到那么高的水平哈哈。
二、请求模块
在写爬虫之前,我们先来了解一些关键步骤。如上所述,如果你想在互联网上获取一些资源,你必须打开网页。如果要爬取百度资源,必须先在编译器中打开百度,然后操作。requests 模块的功能在这里。我们可以使用requests来实现python对http请求的操作。先来看看下面这个小爬虫(资源1day)
import requests
url = "http://www.baidu.com"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
}
response = requests.get(url=url,headers=headers)
page_text = response.text
with open("my_baidu.html",mode = "w",encoding="utf-8") as f:
f.write(page_text) #读取到网页的源代码
print("over")
使用 requests.get() 方法获取一个 URL,然后使用 response.text 获取 URL 的内容,最后将内容写入你的文件夹。这是一个爬百度初始页面的小爬虫
这里还有另一个问题。我们发现我们使用了headers={},这是一个简单的反爬措施,让爬虫伪装成浏览器。头在哪里找,打开你使用的浏览器页面勾选,随便在网络中打开一个名字,在底部就可以找到
三、前端知识介绍
爬虫爬取内容时,需要一些前端知识。你会发现页面也是人写的,是通过各种html、css、js等语法写的。我们看到的页面的所有内容都可以在一个地方看到。这时候只需要在页面上点右键打开勾选或者查看页面源码,就可以看到页面的源码,页面中的所有内容都可以在里面找到。我们爬取的内容也需要从这里找到。
关于相关的前端知识,在我的博客中有对html的详细解释。详情请参考html basics_hxiaogang2021的博客-CSDN博客
四、客户端渲染和服务器渲染
爬虫中的这个概念是两个非常重要的概念,你甚至每次爬取数据都会用到它。
1.服务器渲染
在服务器那边直接把数据和html整合在一起,统一返回浏览器
在页面原代码可以看到数据
2.客户端渲染
第一次请求只要一个html框架,第二次请求拿到数据,进行数据展示(要数据)
在页面源代码中看不到数据
比如有的页面,页面的源码会直接显示你需要的数据,你可以直接爬取,这是服务端渲染,有的数据打开相关页面后会有一个链接,然后跳转到另一个页面,而爬取数据时,需要使用两个或多个爬虫,一步一步爬取数据。
五、正则表达式
我们都在python的基础上学过正则表达式。事实上,正则表达式是一种比较麻烦的方法。我对正则表达式的一些个人总结也在我的资源中。
在页面的源码中,你会发现很多标签,而这些标签是不需要的,我们只需要里面的文字,我们需要使用正则表达式来提取文字,我们这里抓取的是豆瓣电影电影TOP250的名字。
分析发现,在页面的源码中,我们可以看到电影名在li标签后面,以span标签结尾,我们可以使用正则表达式中文.*? 提取文本(2天)
import requests
import re
url = "https://movie.douban.com/top250"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
}
resp = requests.get(url,headers = headers)
# print(resp.text) #检查反爬
page_content = resp.text
#解析数据
obj = re.compile(r'.*?.*?(?P.*?)',re.S)
result = obj.finditer(page_content)
for i in result:
print(i.group("name"))
通过这个方法,我们不仅可以提取里面的名字,还可以爬出拍摄年份、收视率和收视人数,还可以把爬出来的东西写成excel文件
import requests
import re
import csv
url = "https://movie.douban.com/top250"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"
}
resp = requests.get(url,headers = headers)
page_content = resp.text
#解析数据
obj = re.compile(r'.*?.*?(?P.*?)'
r'.*?<p class="">.*?
.*?(?P.*?) .*?(?P.*?).*?'
r'(?P.*?)人评价',re.S)
result = obj.finditer(page_content)
f = open("3.1day.csv",mode="w",encoding="gbk",newline="")
csvwriter = csv.writer(f)
for it in result:
dic = it.groupdict()
dic["year"] = dic["year"].strip()
csvwriter.writerow(dic.values())
f.close()
print("over")
六、BS4
在使用bs4的时候,还需要下载一个叫bs4的模块,可以在bs4中调用一个叫beautifulsoup的方法
我们知道页面是由前端的各种标签和内容组成的。bs4可以通过定位标签的内容来爬取数据。原理是实例化一个BeautifulSoup对象,给对象添加页面源码,调用BeautifulSoup方法进行标签定位和数据提取
bs4方法soup.TageName返回第一次出现的tagname对应的标签
汤.find("div")
同上
汤.find("div",class_ = "song")
属性定位
汤.find_all("div")
返回所有 div 标签并返回一个列表
汤.select(" > ")
> 表示层次结构
汤.select(".tang>ul a")
. 表示上层空间表示多层
获取标签中的文本数据
汤.a.text/string/get_text()
汤.select(".tang>ul a")[0].text()
text/get_text() 获取所有内容
字符串获取即时内容
例子
《三国志》各章的标题和内容都爬到这里了(3天)
https://www.shicimingju.com/book/sanguoyanyi.html
我们发现通过attribute定位后,title的名字都在li标签下,可以通过attribute name>ul>li(标签名)定位
import requests
from bs4 import BeautifulSoup
url = "https://www.shicimingju.com/book/sanguoyanyi.html"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.55"
}
page_text = requests.get(url=url,headers=headers).text
#实例化BeatifulSoup对象,将页面源代码数据加载到该对象中
soup = BeautifulSoup(page_text,"lxml")
#定位内容标签
li_list = soup.select(".book-mulu > ul > li")
fp = open("sanguo","w",encoding="utf-8-sig",errors="ignore")
for i in li_list:
title = i.a.string
但是在这之后,我们发现了一个问题。我们得到的a标签无法爬取三国演义的内容,导致前面提到的客户端渲染。我们必须向 href 中的详细信息页面发出另一个请求。解析出章节的内容
for i in li_list:
title = i.a.string
#详情页的网址 用拼接的方法
detail_url = "https://www.shicimingju.com/" + i.a["href"]
#对详情页发起请求
detail_page_text = requests.get(url=detail_url,headers=headers).text.encode("ISO-8859-1")
detail_soup = BeautifulSoup(detail_page_text,"lxml")
#在详情页中发起定位
div_tag = detail_soup.find("div",class_="chapter_content")
content = div_tag.text
fp.write(title + ":" + content + "/n")
print(title,"over")
这样,所有爬取的内容都可以写入我们之前创建的文件中
七、xpath
Xpath是我们最常用也最方便高效的解析方式
xpath的使用需要下载一个lxml模块,在lxml中实例化一个etree对象,并将解析对象的页面源数据加载到该对象中,然后在etree对象中调用xpath表达式定位标签和内容抓取
xpath 表达式
从根节点定位表示层次结构
/
代表多个级别,从任何位置定位
//
属性定位
//div[@class="song"] 标签[@attrname="attrvalue"]
索引定位
//div[@class="song"]/p[3]
获取文本
/../../text()[0] 立即获取
获取所有不直接相关的文本内容
//文本()
取属性
//div/img/@attrname //img/scr
例子
抓取百度美图(4天)
#导入模块
import requests
import os
from lxml import etree
url = 'https://pic.netbian.com/4kmeinv/' #获取页面网址
#简单的反爬,使用headers将爬虫伪装起来
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62'
}
response = requests.get(url=url,headers=headers)#使用request.get方法获取html页面
page_text = response.text #获取html页面中的文本内容
tree = etree.HTML(page_text) #调用HTML类对HTML文本进行初始化,成功构造XPath解析对象
#利用os模块创建文件
if not os.path.exists("F:\python\爬虫\debug"):
os.mkdir("F:\python\爬虫\debug")
前面的请求都是一样的,不同的是 tree = etree.HTML(page_text) 这里实例化了一个etree对象,将需要解析的页面源代码加载到该对象中。
我们还导入了os模块创建文件,查看文件夹中是否有这个文件,有的话就保留,没有的话就创建,里面所有的文件路径都是我自己的文件路径
然后调用xpath方法定位,我们从最后一个div标签开始到ul标签再到li标签
li_list = tree.xpath('//div[@class="slist"]/ul/li')
for li in li_list :
img_src = 'http://pic.netbian.com' + li.xpath('./a/img/@src')[0] #在li标签下再次定位到图片
img_name = li.xpath('./a/img/@alt')[0] + 'jpg'
img_name = img_name.encode('iso-8859-1').decode('gbk') #获取图片名称
img_data = requests.get(url=img_src,headers=headers).content #爬取图片
img_path ='F:\\python\\爬虫\\debug\\'+img_name #获取图片路径
with open(img_path,'wb') as fp: #将爬取到的图片写入文件夹
fp.write(img_data)
print(img_name,'over')
最后通过写文件的方法,可以将爬取的文件写入之前创建的文件夹
八、总结
学了一个学期python,我的课程设计是爬百度图片,也就是最后的xpath爬取。我觉得python爬虫也比较有趣也比较难,后面的内容也需要很多我觉得这篇文章也很笼统。学习爬虫需要很多东西。后面也会讲一些单独的内容,希望大家多多指正。