php网页抓取工具( Python网页教程:正则表达式识别常见模式(二))

优采云 发布时间: 2021-09-18 01:05

  php网页抓取工具(

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教程:如果你是那种做事太快的人,那么它在爬行时可能不起作用。受高度保护的网站集可能会阻止您提交

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线