文章采集程序(PythonRequests库、提交一个基本表单、HTML相关控件等内容)

优采云 发布时间: 2022-02-26 19:25

  文章采集程序(PythonRequests库、提交一个基本表单、HTML相关控件等内容)

  上一期我们讲解了 Python Requests 库、提交基本表单、HTML 相关控件等。

  在这篇文章中文章我们跟随上一期文章关于通过Python请求提交文件和图像、处理登录cookie、HTTP基本访问认证以及其他与表单相关的问题。

  提交文件和图像

  虽然上传文件在网络上很常见,但对于网络数据采集 则不太常见。但是,如果您想为自己的 网站 文件上传测试实例,也可以通过 Python 请求库来实现。无论如何,掌握事物的运作方式总是很有用的。

  以下是文件上传的源代码示例:

  

​ 编辑封面图片

  文件上传表单看起来和之前的 文章 中的文本字段相同,只是标签中有一个类型属性是文件。事实上,Python Requests 库处理这种形式与以前非常相似:

  import requests

def upload_image():

files = {'uploadFile': open('files/2fe7243c7c113fad443b375a021801eb6277169d.png', 'rb')}

r = requests.post("http://pythonscraping.com/pages/processing2.php", files=files)

print(r.text)

if __name__ == '__main__':

upload_image()

  需要注意的是,这里提交给表单字段uploadFile的值不一定是简单的字符串,而是用open函数打开的Python文件对象。在这个例子中,我们提交了一个保存在我们计算机上的图像文件,文件路径是相对于 Python 程序的位置的。

  处理登录和 cookie

  到目前为止,我们介绍的大多数表单都允许您向 网站 提交信息,或者让您在提交表单后立即看到所需的页面信息。那么,这些表单和登录表单(让您在浏览 网站 时保持“登录”状态)之间有什么区别?

  大多数现代 网站 使用 cookie 来跟踪有关用户是否登录的状态信息。一旦 网站 验证了您的登录凭据,他会将它们存储在您浏览器的 cookie 中,该 cookie 通常收录服务器生成的令牌、登录过期时间和登录状态跟踪信息。网站 将使用此 cookie 作为信息验证的凭据,在您浏览 网站 的每个页面时呈现给服务器。在 1990 年代中期广泛使用 cookie 之前,保持用户的安全身份验证和跟踪是 网站 上的一个主要问题。

  虽然 cookie 为 Web 开发人员解决了大问题,但它们也给 Web 爬虫带来了大问题。您一天只能提交一次登录表单,但如果您不注意表单后返回给您的cookie,那么当您过一段时间再次访问新页面时,您的登录状态将丢失,您将需要重新登录。

  现在我们有了博客管理后台,我们需要登录发布文章并上传图片,我们用Python Requests模拟登录,跟踪cookies,下面是代码示例:

  在上面的代码中,我们向登录页面发送了相关参数,作用是模拟我们输入用户名和密码的登录页面。然后我们从请求中获取cookie并打印登录结果。

  对于简单的页面,我们可以毫无问题地处理,但是如果网站比较复杂,他经常会偷偷调整cookie,或者如果我们一开始就不想使用cookie,我们该怎么办?Requests 库的 session 功能可以完美解决这些问题:

  import requests

from bs4 import BeautifulSoup

from requests import Session, exceptions

from utils import connection_util

class GetCookie(object):

def __init__(self):

self._session = Session()

self._init_connection = connection_util.ProcessConnection()

def get_cookie_by_login(self):

# 另外一个 session 中

get_token=self.get_request_verification_token()

if get_token:

params = {'__RequestVerificationToken': get_token, 'Email': 'abc@pdf-lib.org',

'Password': 'hhgu##$dfe__e',

'RememberMe': True}

r = self._session.post('https://pdf-lib.org/account/admin', params)

# 如果使用 request_verification_token 此处会出现 500 错误

if r.status_code == 500:

print(r.content.decode('utf-8'))

print('Cookie is set to:')

print(r.cookies.get_dict())

print('--------------------------------')

print('Going to post article page..')

r = self._session.get('https://pdf-lib.org/Manage/ArticleList', cookies=r.cookies)

print(r.text)

def get_request_verification_token(self):

# 连接网站

try:

headers = {

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

"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"}

html = self._session.get("https://pdf-lib.org/Account/Login", headers=headers)

except (exceptions.ConnectionError, exceptions.HTTPError, exceptions.Timeout) as e:

return False

try:

bsObj = BeautifulSoup(html.text, features='html.parser')

except AttributeError as e:

return False

if bsObj:

try:

get_token = bsObj.find("input", {"name": "__RequestVerificationToken"}).get("value")

except Exception as e:

print(f"ot unhandled exception {e}")

return False

return get_token

if __name__ == '__main__':

get_cookie = GetCookie()

get_cookie.get_cookie_by_login()

  在此示例中,会话对象(通过调用 requests.Session() 获得)继续跟踪会话信息,例如 cookie、标头,甚至有关运行 HTTP 协议的信息,例如 HTTPAdapter(为 HTTP 和 HTTPS 连接会话提供)。统一接口)。

  Requests 是一个非常强大的库。程序员不必浪费脑筋或编写代码。它可能只是不如 Selenium。尽管在编写网络爬虫时,您可能想让 Requests 库为您做所有事情,但请保持关注。了解 cookie 的状态以及它们可以控制的程度非常重要。这样可以避免痛苦的调试和追逐 网站 异常,从而节省大量时间。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线