php正则函数抓取网页连接(爬虫与爬虫的前端知识介绍及前端应用知识分析介绍)

优采云 发布时间: 2022-04-01 15:06

  php正则函数抓取网页连接(爬虫与爬虫的前端知识介绍及前端应用知识分析介绍)

  内容

  一、爬虫和爬虫的合法性

  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&#39;.*?<p class="">.*?

.*?(?P.*?)&nbsp.*?(?P.*?).*?&#39;

r&#39;(?P.*?)人评价&#39;,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(" &gt; ")

  &gt; 表示层次结构

  汤.select(".tang&gt;ul a")

  . 表示上层空间表示多层

  获取标签中的文本数据

  汤.a.text/string/get_text()

  汤.select(".tang&gt;ul a")[0].text()

  text/get_text() 获取所有内容

  字符串获取即时内容

  例子

  《三国志》各章的标题和内容都爬到这里了(3天)

  https://www.shicimingju.com/book/sanguoyanyi.html

  我们发现通过attribute定位后,title的名字都在li标签下,可以通过attribute name&gt;ul&gt;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 = &#39;https://pic.netbian.com/4kmeinv/&#39; #获取页面网址

#简单的反爬,使用headers将爬虫伪装起来

headers = {

&#39;User-Agent&#39;:&#39;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&#39;

}

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(&#39;//div[@class="slist"]/ul/li&#39;)

for li in li_list :

img_src = &#39;http://pic.netbian.com&#39; + li.xpath(&#39;./a/img/@src&#39;)[0] #在li标签下再次定位到图片

img_name = li.xpath(&#39;./a/img/@alt&#39;)[0] + &#39;jpg&#39;

img_name = img_name.encode(&#39;iso-8859-1&#39;).decode(&#39;gbk&#39;) #获取图片名称

img_data = requests.get(url=img_src,headers=headers).content #爬取图片

img_path =&#39;F:\\python\\爬虫\\debug\\&#39;+img_name #获取图片路径

with open(img_path,&#39;wb&#39;) as fp: #将爬取到的图片写入文件夹

fp.write(img_data)

print(img_name,&#39;over&#39;)

  最后通过写文件的方法,可以将爬取的文件写入之前创建的文件夹

  八、总结

  学了一个学期python,我的课程设计是爬百度图片,也就是最后的xpath爬取。我觉得python爬虫也比较有趣也比较难,后面的内容也需要很多我觉得这篇文章也很笼统。学习爬虫需要很多东西。后面也会讲一些单独的内容,希望大家多多指正。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线