python抓取动态网页( 2.用正则表达式匹配获取数据​(图)打印显示(组图))

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

  python抓取动态网页(

2.用正则表达式匹配获取数据​(图)打印显示(组图))

  

  爬行打印展示

  

  通过上面的对比,我们爬取的是网页的源码。我们只需要对页面返回的内容进行过滤,提取出我们想要的部分数据,但通常很多网站都有反爬虫机制需要预处理。最后,将获取的数据写入文件或数据库,用于持久化数据存储。

  步骤:通过url发送请求————>等待服务器响应————>获取网页源代码————>解析页面————>过滤————>数据保存

  在上述步骤中,获取网页的源代码和解析页面是最重要的。这两个部分通常是最困难的。它们主要处理网页上的各种反爬机制。有时您的道德页面的源代码可能与网页的源代码不同。完全一样,需要对比分析。

  2. 获取正则表达式匹配的数据

  ​ 与其他方法相比,正则表达式是爬虫获取数据的一种非常有效的方法。它只需要在特殊模式下传递返回的网页源字符串和模式匹配,就可以找到我们想要的。所需的数据。但是,正则表达式的匹配模式对于初学者来说也有点难写,以实现快速精确的匹配。

  ​ 正则表达式的使用可以概括为以下两种:

  在自己写的pattern中编译,创建一个pattern对象(pattern),然后传入函数,只需要传入函数中要匹配的字符串即可。

  通过 re.function name('match pattern', 'string to match') 找到需要的字符

  当需要多次使用相同的匹配模式来选择第一种方法时,当匹配模式只需要使用一次来选择第二种方法时。

  如果正则表达式匹配成功,则返回的数据类型为字符串,如果匹配失败,则返回None。但是,我们在查看匹配结果的时候,最好先判断一下匹配成功与否,以防报错。

  常用的匹配函数如下:

  函数名对应的函数描述

  匹配()

  从前到后匹配,只有一次。如果匹配成功,返回re.Match对象,然后调用group()查看对应的值

  全匹配()

  从前到后匹配,只匹配一次并进行完整匹配

  搜索()

  搜索满足匹配模式的字符串,只匹配一次

  找到所有()

  搜索所有满足匹配模式的字符并返回一个列表,列表中的每个元素都是一个满足匹配模式的字符串

  在爬虫中,findall通常用于匹配查找所有符合匹配模式的字符串,通过遍历列表查看数据

  正则表达式的特殊字符有以下含义:

  数量限定词

  

  特殊字符

  

  \u4e00-\u9fa5 只匹配中文字体

  位置相关字符

  

  常见匹配字符

  

  3. 页面源码分析

  页面显示的内容

  

  页面来源

  

  通过对比两张图,我们可以看到,我们看到的和服务器返回给我们的还是有很大区别的。我们可以在页面上看到图片和文字,还有一些视频,但是网页的源代码都是纯文本,源代码中的图片和视频与链接一一对应。这意味着我们需要源代码提供的链接来访问图片和视频等。

  在爬虫中分析网页源代码是一项非常重要的技能,需要通过不断的探索找到一些共性。最好对 CSS 和 JS 有一定的了解,了解网页显示给我的原理。

  4. 通过请求爬取静态页面

  对于从requests请求页面获取的源代码,需要进行预处理。常用的预处理通过 CSS 选择器和 xpath 过滤掉我们想要的内容。

  4.1 css选择器基本语法选择器示例示例说明

  。班级

  。介绍

  选择所有带有 class="intro" 的元素

  #ID

  #名

  选择 id="firstname" 的所有元素

  *

  *

  选择所有元素

  元素

  p

  全选

  元素

  元素,元素

  格,p

  全选

  元素和

  元素

  元素元素

  分区 p

  选择

  全部在元素内

  元素

  在使用CSS选择器定位元素时,当有一个可以通过id定位的首选id时,id属性对应的值是唯一的,那么就为status元素考虑class属性。如果class属性有多个值,则需要选择一个。能。

  4.2 xpath 基本语法

  官方帮助文档:

  表达描述

  节点名

  选择该节点的所有子节点

  /

  从当前节点中选择子节点

  //

  从当前节点中选择后代节点

  .

  选择当前节点

  …

  选择当前节点的父节点

  @

  选择属性

  

  xpath 还可以结合运算符来定位元素

  xpath 中的谓词

  谓词用于查找特定节点或收录指定值的节点。

  谓词用方括号括起来。

  

  选择未知节点

  

  选择多条路径

  

  在以上基础上,通过案例进行如下具体分析:

  通过CSS选择器方法获取豆瓣上排名前25的电影名

  import requests

from bs4 import BeautifulSoup as Bs

url = 'https://movie.douban.com/top250'

# 设置请求头

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',

# 先登录,通过开发者工具控制台获取

'Cookies': '**************************************************'

}

# 建立连接

resp = requests.get(url=url, headers=headers)

print(resp.status_code) # 查看是否访问成功,出现200就说明访问成功

if resp.status_code == 200:

soup = Bs(resp.text, 'lxml') # 进行预处理

title_list = soup.select('div.hd > a > span:nth-child(1)') # 找到标题对应的标签

for title in title_list:

print(title.text, end='\t') # 打印输出电影标题

'''

200

肖申克的救赎 霸王别姬 阿甘正传 这个杀手不太冷 泰坦尼克号 美丽人生 千与千寻 辛德勒的名单 盗梦空间 忠犬八公的故事 星际穿越 楚门的世界 海上钢琴师 三傻大闹宝莱坞 机器人总动员 放牛班的春天 无间道 疯狂动物城 大话西游之大圣娶亲 熔炉 教父 当幸福来敲门 龙猫 怦然心动 控方证人

'''

  通过xpath选择器方法获取豆瓣排名前25的电影名

  import requests

from bs4 import BeautifulSoup as Bs

from lxml import etree

url = 'https://movie.douban.com/top250'

# 设置请求头

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',

'Cookies': '**************************************'

}

# 建立连接

resp = requests.get(url=url, headers=headers)

if resp.status_code == 200:

html = etree.HTML(resp.text) # 预处理

title_list = html.xpath('//div[@class= "hd"]/a[@href]/span[1]/text()')

for title in title_list:

print(title, end='\t')

'''

肖申克的救赎 霸王别姬 阿甘正传 这个杀手不太冷 泰坦尼克号 美丽人生 千与千寻 辛德勒的名单 盗梦空间 忠犬八公的故事 星际穿越 楚门的世界 海上钢琴师 三傻大闹宝莱坞 机器人总动员 放牛班的春天 无间道 疯狂动物城 大话西游之大圣娶亲 熔炉 教父 当幸福来敲门 龙猫 怦然心动 控方证人

'''

  在爬取页面数据时,我们通常选择xpath进行爬取,这显然比通过css选择器定位元素更加灵活。爬取静态页面时,通过以上步骤爬取数据,但部分网页内容只能通过登录获取。

  4.3 数据通过代理采集

  当我们访问同一个网页太琐碎时,一些网站会使用反爬机制来屏蔽你的ip。这需要我们使用不同的 ip 地址多次访问同一个 网站。这个时候只能买ip让别人为你转发,结果返回给你。

  通过运营商提供的ip链接获取有效ip

  # -*- coding: UTF-8 -*-

"""

此代码为代理IP可用性检测模块,可准确筛选出尚未失效IP

注:

1.此代码只针对TXT数据格式接口。

2.尚未失效IP不一定为爬虫可用IP

3.使用时,请调用check_ip(url),url为TXT数据格式接口地址

"""

import requests

import telnetlib

import re

from concurrent.futures.thread import ThreadPoolExecutor

# 请求接口,匹配出代理IP,多线程检测

def check_ip(url):

real_ip = []

# 检测代理IP是否失效

def telnet_ip(ip, port):

try:

telnetlib.Telnet(ip, port, timeout=1)

real_ip.append(f'{ip}:{port}')

except:

pass

while True:

try:

resp = requests.get(url)

# print(resp.text)

ip_data = re.findall('(\d+\.\d+\.\d+\.\d+):(\d+)', resp.text)

with ThreadPoolExecutor(max_workers=16) as pool:

for ip, port in ip_data:

pool.submit(telnet_ip, ip, port)

return real_ip

except:

pass

  调用ip爬取

  """

example04-利用代理爬取

Version:

Author:

Date:2021/8/17

"""

from check_proxies import check_ip

import requests

from bs4 import BeautifulSoup

# ip地址链接,由运营商提供,具有一定的时效性

URL = 'http://api.66daili.cn/API/GetCommonProxy/?orderid=2291244402101903832&num=20&token=66daili&format=text&line_separator=win&protocol=http&anonymous=elite,anonymous,transparent&area=%E4%B8%AD%E5%9B%BD&proxytype=https&speed=fast#api'

ip_list = check_ip(URL)

print(ip_list)

flag = True

while flag:

for i in range(len(ip_list)):

doubna_url = 'https://movie.douban.com/top250'

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '

'(KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',

}

# 代理ip,会根据要求进行自动选择http或https协议

proxy = {

'http': 'http://' + ip_list[i],

'http': 'https://' + ip_list[i]

}

try:

resp = requests.get(url=doubna_url, headers=headers, proxies=proxy, timeout=1)

if resp.status_code == 200:

print(resp.text)

flag = False

break

except:

print('Erro')

  5. 通过 selenium 驱动浏览器并爬取动态页面

  通过 selenium 获取页面步骤:

  先把驱动放到当前项目中

  from selenium import webdriver

url = 'https://www.baidu.com/'

# 创建浏览器对象

b = webdriver.Chrome(./chromedrivers.exe)

# 访问页面

b.get(url)

# 关闭

b.quit()

  使用selenium登录京东页面

<p>import getpass

import time

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

url = &#39;https://www.jd.com/&#39;

options = webdriver.ChromeOptions()

options.add_experimental_option("excludeSwitches", [&#39;enable-automation&#39;, &#39;enable-logging&#39;]) # 忽略警告

# options.add_argument(&#39;blink-settings=imagesEnabled=false&#39;) # 不加载图片

b = webdriver.Chrome(options=options)

b.get(url)

b.find_element_by_id(&#39;ttbar-login&#39;).click()

b.find_element_by_class_name(&#39;login-tab-r&#39;).click()

b.find_element_by_id(&#39;loginname&#39;).send_keys(input(&#39;输入账号:&#39;))

b.find_element_by_id(&#39;nloginpwd&#39;).send_keys(getpass.getpass(&#39;输入密码:&#39;))

b.find_element_by_id(&#39;loginsubmit&#39;).click()

time.sleep(5)

b.find_element_by_id(&#39;key&#39;).send_keys(&#39;python&#39;)

b.find_element_by_id(&#39;key&#39;).send_keys(Keys.ENTER)

max_y = 10000

y = 0

while y

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线