php网页抓取工具( Python网页教程:正则表达式识别常见模式(二))
优采云 发布时间: 2021-09-18 01:05php网页抓取工具(
Python网页教程:正则表达式识别常见模式(二))
tags = res.findAll("a", {"class": ["url", "readmorebtn"]})
这段代码使用“readmorebtn”和“URL”类提取所有锚定标记
您可以使用text参数根据内部文本本身过滤内容,如下所示:
tags = res.findAll(text="Python Programming Basics with Examples")
findall函数返回与指定属性匹配的所有元素,但如果只想返回一个元素,可以使用limit参数或使用find函数,后者只返回第一个元素
用漂亮的汤找到第n个孩子
“靓汤”具有许多强大的功能;您可以像这样直接获取子元素:
tags = res.span.findAll("a")
这条线将获取beautiful soup对象上的第一个跨度元素,然后获取跨度下的所有锚定元素
如果你需要第n个孩子呢
您可以像这样使用选择功能:
tag = res.find("nav", {"id": "site-navigation"}).select("a")[3]
此行获取ID为“site navigation”的导航元素,然后从导航元素获取第四个锚定标记
美丽的汤是一个强大的图书馆
使用正则表达式查找标签
在上一个教程中,我们讨论了正则表达式,并且看到了使用正则表达式识别常见模式(如电子邮件、URL等)的强大功能
幸运的是,靓汤有这个功能;您可以传递正则表达式模式以匹配特定标记
假设您想要获取一些与特定模式匹配的链接,例如内部链接或特定外部链接,或者获取特定路径中的一些图像
正则表达式引擎使这项工作变得非常容易
import re
tags = res.findAll("img", {"src": re.compile("\.\./uploads/photo_.*\.png")})
这些行捕获../上载/,并将其打印为照片uuu开始
这只是一个简单的例子,它向您展示了正则表达式和BeautifulSoup组合的强大功能
Python网页爬行教程:爬行JavaScript
假设您需要抓取的页面有另一个加载页面,该页面将您重定向到所需页面,并且URL没有更改,或者您抓取的页面的某些部分使用ajax加载其内容
我们的scraper不会加载此内容,因为它不会运行加载它所需的JavaScript
您的浏览器运行JavaScript并正常加载任何内容,我们将使用第二个爬网库(称为selenium)来实现这一点
Selenium库不包括其浏览器;您需要安装第三方浏览器(或web驱动程序)才能工作。这是对浏览器本身的补充
您可以选择chrome、Firefox、safari或edge
如果您安装了这些驱动程序中的任何一个,例如chrome,它将打开一个浏览器实例并加载您的页面,然后您可以抓取页面或与页面交互
Python web爬虫教程:将chrome驱动程序与selenium结合使用
首先,应按如下方式安装selenium库:
$ pip install selenium
然后您应该从这里下载chrome驱动程序,并将其下载到您的系统路径
现在,您可以这样加载页面,如以下Python网页捕获示例所示:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.python.org/")
nav = browser.find_element_by_id("mainnav")
print(nav.text)
结果如下:
这很简单,不是吗
我们不与页面元素交互,所以我们还没有看到selenium的强大功能。等等
Python如何抓取网页?使用selenium+phantom JS
您可能喜欢使用浏览器驱动程序,但更多的人喜欢在后台运行代码,而看不到实际操作
因此,有一个很棒的工具叫做phantom JS,它可以在不打开任何浏览器的情况下加载页面并运行代码
Phantom JS使您能够轻松地与捕获的页面cookie和JavaScript交互
此外,您还可以像BeautifulSoup一样使用它来抓取这些页面中的页面和元素
从这里下载phantom JS并将其放在您的路径中,以便我们可以将其用作selenium的Web驱动程序
现在,让我们使用selenium和phantom JS抓取网页,就像使用Chrome web驱动程序一样
from selenium import webdriver
browser = webdriver.PhantomJS()
browser.get("https://www.python.org/")
print(browser.find_element_by_class_name("introduction").text)
browser.close()
结果是:
太棒了!!它工作得很好
您可以通过多种方式访问}元素:
browser.find_element_by_id("id")
browser.find_element_by_css_selector("#id")
browser.find_element_by_link_text("Click Here")
browser.find_element_by_name("Home")
所有这些函数只返回一个元素;可以使用此元素返回多个元素:
browser.find_elements_by_id("id")
browser.find_elements_by_css_selector("#id")
browser.find_elements_by_link_text("Click Here")
browser.find_elements_by_name("Home")
硒页\来源
您可以像这样使用页面uSource对selenium返回的内容使用beautiful soup的强大功能,如以下Python网页捕获代码示例所示:
from selenium import webdriver
from bs4 import BeautifulSoup
browser = webdriver.PhantomJS()
browser.get("https://www.python.org/")
page = BeautifulSoup(browser.page_source,"html5lib")
links = page.findAll("a")
for link in links:
print(link)
browser.close()
结果是:
如您所见,phantom JS使抓取HTML元素变得非常容易。让我们看更多
使用selenium捕获iframe内容
您抓取的页面可能收录收录数据的iframe
如果您试图抓取收录iframe的页面,您将无法获取iframe内容;您需要获取iframe源代码
您可以使用selenium切换到要抓取的帧以抓取iframe
from selenium import webdriver
browser = webdriver.PhantomJS()
browser.get("https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe")
iframe = browser.find_element_by_tag_name("iframe")
browser.switch_to.default_content()
browser.switch_to.frame(iframe)
iframe_source = browser.page_source
print(iframe_source) #returns iframe source
print(browser.current_url) #returns iframe URL
结果是:
查看当前网站;它是iframe URL,而不是原创页面
Python如何抓取网页?使用靓汤抓取iframe内容
可以通过find函数获取iframe的URL;然后您可以放弃该URL
from urllib.request import urlopen
from urllib.error import HTTPError
from urllib.error import URLError
from bs4 import BeautifulSoup
try:
html = urlopen("https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe")
except HTTPError as e:
print(e)
except URLError:
print("Server down or incorrect domain")
else:
res = BeautifulSoup(html.read(), "html5lib")
tag = res.find("iframe")
print(tag['src']) #URl of iframe ready for scraping
太棒了!!这里我们使用另一种技术从页面抓取iframe内容
使用(selenium+phantom JS)处理Ajax调用
在Ajax调用之后,您可以使用selenium获取内容
这就像点击一个按钮来获取你需要的东西。检查以下Python网页抓取示例:
from selenium import webdriver
import time
browser = webdriver.PhantomJS()
browser.get("https://www.w3schools.com/xml/ajax_intro.asp")
browser.find_element_by_tag_name("button").click()
time.sleep(2) #Explicit wait
browser.get_screenshot_as_file("image.png")
browser.close()
结果是:
在这里,我们抓取一个收录按钮的页面,然后单击按钮,它将调用Ajax并获取文本,然后保存页面的屏幕截图
这是一件小事;这是关于等待时间的问题
我们知道页面无法完全加载超过2秒,但这不是一个好的解决方案。服务器可能需要更多的时间,或者由于许多原因,您的连接可能较慢
使用phantom JS等待Ajax调用完成
最好的解决方案是检查最终页面上是否有HTML元素。如果是,则表示Ajax调用已成功完成
检查此Python网页抓取代码示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.PhantomJS()
browser.get("https://resttesttest.com/")
browser.find_element_by_id("submitajax").click()
try:
element = WebDriverWait(browser, 10).until(EC.text_to_be_present_in_element((By.ID, "statuspre"),"HTTP 200 OK"))
finally:
browser.get_screenshot_as_file("image.png")
browser.close()
结果是:
在这里,我们单击一个Ajax按钮,该按钮进行rest调用并返回JSON结果
我们检查div元素文本是否为“HTTP200OK”,超时10秒,然后将结果页面保存为图像,如图所示
您可以检查许多内容,例如:
URL更改使用
EC.url_changes()
使用新打开的窗口
EC.new_window_is_opened()
使用以下方法更改标题:
EC.title_is()
如果有任何页面重定向,可以检查标题或URL是否已更改
检查的条件很多,;我们只是一个例子,告诉你你有多大的力量
酷
Python web爬行教程:处理cookie
有时,当您编写爬网代码时,为您爬网的站点处理cookie非常重要
也许您需要删除cookie,或者您需要将其保存在文件中并用于将来的连接
有很多种情况。让我们看看如何处理饼干
要检索当前访问站点的cookie,可以调用如下Cookies()函数:
from selenium import webdriver
browser = webdriver.PhantomJS()
browser.get("https://likegeeks.com/")
print(browser.get_cookies())
结果是:
要删除cookie,可以使用delete_uuAll_uucookies()函数,如以下Python网页捕获代码示例所示:
from selenium import webdriver
browser = webdriver.PhantomJS()
browser.get("https://likegeeks.com/")
browser.delete_all_cookies()
Python如何抓取网页?要避免的陷阱
爬行网站最令人失望的是,在查看输出时,即使数据在浏览器中可见,也看不到数据。或者web服务器拒绝提交听起来很好的表单。更糟糕的是,您的IP由于匿名原因被网站阻止
我们将讨论您在使用scripy时可能遇到的最著名的障碍,并认为这些信息很有用,因为它可以帮助您在陷入麻烦之前解决错误和预防问题
做人
难以抓取的网站的基本挑战是,他们已经能够以各种方式(例如使用验证码)区分真人和爬虫
尽管这些网站使用了硬技术来检测抓取,但是有一些变化可以让你的脚本看起来更像一个人
产权调整
设置头的最佳方法之一是使用请求库。HTTP头是每次尝试执行对web服务器的请求时web服务器发送给您的一组属性
大多数浏览器在初始化任何连接时使用以下七个字段:
Host https://www.google.com/
Connection keep-alive
Accept text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/
39.0.2171.95 Safari/537.36
Referrer https://www.google.com/
Accept-Encoding gzip, deflate, sdch
Accept-Language en-US,en;q=0.8
接下来是常用Python爬虫库urllib使用的默认头:
Accept-Encoding identity
User-Agent Python-urllib/3.4
这两个标题是唯一真正重要的设置。因此,最好将它们保持在默认值
Python网页捕获示例:JavaScript和cookie处理
解决许多爬行问题的重要方法之一是正确处理cookie。网站使用Cookie跟踪您在网站上的进度的用户还可能使用Cookie来防止具有异常行为(例如浏览过多页面或快速提交表单)的爬网工具,并防止它们在网站上爬网@
如果您的浏览器cookie将您的身份传递给网站,那么更改您的IP地址甚至关闭并重新打开您与网站的连接等解决方案可能是无用的,也是浪费时间
在爬行过程中,Cookies非常重要网站. 有些网站总是要求新版本的cookie,而不是要求再次登录
如果您试图获取一个或多个网站,您应该检查并测试这些网站cookies,并决定需要处理哪个网站
Editthiscookie是可用于检查Cookie的最流行的chrome扩展之一
都是关于时间的
pythonwebcrawler教程:如果你是那种做事太快的人,那么它在爬行时可能不起作用。受高度保护的网站集可能会阻止您提交