为了visa面签预约学习python爬虫-DAY1

1.目的:

持续一个多月在CGI进行面签的预约都是提示没有可用预约时间,又不知道到底CGI多久会放出预约的名额,网上找人代预约感觉又贵又各种不靠谱,打算自己搞个定时任务来抓数据,顺便学一下python和爬虫。最好可以通过这个成功预约到面签,再不济也希望通过自动任务找出CGI放号的踪迹。

关于这个问题我问过GPT,下面也附上我和GPT的问答纪录

我:

我想写一个爬虫或者机器人之类的,可以每天定点定时帮我登录预约签证的网站,请问用什么技术实现,具体怎么实现呢

GPT:

创建一个能够定时自动登录网站并预约签证的程序,通常需要使用到网络爬虫(Web Crawling)和自动化脚本(Automation Scripting)技术。下面是一些常见的技术和步骤,可以帮助你实现这样的程序:

### 1. 选择编程语言和工具
- **Python**:Python 是进行网络爬虫和自动化任务的首选语言,因为它有着丰富的库支持。
- **库和工具**:
  - **Requests**:用于发送HTTP请求。
  - **Beautiful Soup** 或 **lxml**:用于解析HTML页面,提取所需数据。
  - **Selenium**:一个自动化测试工具,可以模拟真实用户的浏览器行为,包括登录、点击按钮等操作。

### 2. 分析目标网站
- 在编写爬虫之前,需要分析目标网站的登录和预约流程。这可能包括查看网页的HTML源码,了解表单数据是如何提交的,以及哪些HTTP请求是必要的。
- 注意检查网站是否有反爬虫措施,比如验证码、登录频率限制等。

### 3. 实现自动登录和预约
- **使用Requests和Beautiful Soup**:如果网站的登录和预约流程比较简单,不涉及JavaScript动态加载内容,可以使用Requests库发送登录请求,然后用Beautiful Soup解析响应,模拟用户填写预约信息并提交。
- **使用Selenium**:对于复杂的、需要与JavaScript交互的网站,Selenium 能够模拟真实的浏览器环境,执行登录和预约的动作就像真正的用户一样。Selenium 可以模拟点击、输入文本、滚动页面等操作。

### 4. 设置定时任务
- **Linux**:使用cron工作表来安排脚本定时运行。
- **Windows**:使用任务计划程序来安排脚本执行。
- **Python**:使用`schedule`库来在Python脚本内部设置定时任务。

### 注意事项
- **遵守法律法规和网站使用协议**:自动化访问和使用网络服务可能会违反服务条款或相关法律,务必确保你的行为是合法的,并尊重网站的反爬虫政策。
- **避免给网站带来负担**:设置合理的请求间隔,避免过度请求导致服务器负载过重。

### 实现示例(伪代码)
这里给出一个使用Python和Selenium进行自动登录的简化示例:

```python
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# 初始化浏览器驱动
driver = webdriver.Chrome()

# 打开登录页面
driver.get("登录页面的URL")

# 找到用户名和密码输入框,输入信息
username_box = driver.find_element_by_id("用户名输入框的ID")
username_box.send_keys("你的用户名")
password_box = driver.find_element_by_id("密码输入框的ID")
password_box.send_keys("你的密码")

# 找到登录按钮并点击
login_button = driver.find_element_by_id("登录按钮的ID")
login_button.click()

# 等待页面加载,然后进行后续的预约操作
time.sleep(5)

# 根据需要操作的页面元素进行预约操作,最后关闭浏览器
# driver.close()
```

请根据实际情况调整代码,包括找到正确的元素定位方法(如 `find_element_by_id`)、输入框的ID、按钮的ID等。另外,如果网站有验证码或其他安全措施,可能需要额外的处理策略。

 

2.搞了下环境

平时都是写Java,对python还是蛮陌生的,电脑里有安装过python,本来试图用idea来写,但是感觉各种不方便,还是下载了pycharm。

创建项目的时候可以创建一个虚拟的环境

这张图片是一个截图,显示的是PyCharm IDE(集成开发环境)创建新Python项目的对话框。

在这个对话框中,可以看到以下信息和选项:

- 在左上角,有两个选项:"Pure Python"和"Django"。"Pure Python"已被选中,表示正在创建一个普通的Python项目,而非专门的Django(一个Python web框架)项目。

- “Name”字段被填充为“pythonProject”,这是即将创建的项目的名称。

- “Location”字段显示项目将被创建在“C:\Users\HP\PycharmProjects\pythonProject”这个路径下。

- 下方有一个选项“Create Git repository”,它未被选中。如果选中,PyCharm将为这个项目初始化一个Git仓库。

- 另一个选项“Create a main.py welcome script”也未被选中。如果选中,PyCharm会在项目创建时自动生成一个包含欢迎信息的`main.py`文件。

- 在“Interpreter type”区域,你可以选择“Project venv”(已选中),表示将为这个项目创建一个虚拟环境,这是Python项目管理的一个最佳实践,可以隔离不同项目的依赖关系。其他选项包括“Base conda”和“Custom environment”。

- “Python version”下拉菜单显示了可供选择的Python解释器版本。选项包括从Python 3.7.9到Python 3.12.0不等的多个版本,以及系统中已检测到的解释器。目前选择的是下载并安装Python 3.12.0。

- 底部的“Create”按钮会根据上述的配置信息创建新的Python项目。

这个对话框是PyCharm初始化新项目时的标准设置界面,允许用户定制他们的项目设置,包括Python解释器的版本和项目的位置。

使用了虚拟的环境的话,就相当于这个项目单独用一个python,为这个python下载的模块也只能在这个python环境里使用 (原先我在CMD里pip了requests这个模块但是import的时候还是报找不到,因此对此有疑惑,现在暂时搞清楚了一些)

3.简单地使用了requests

解释下面的代码:

import requests

if __name__ == "__main__":

url = 'https://portal.ustraveldocs.com/'

#get方法会返回一个响应对象

response = requests.get(url=url)

#text返回的是字符串形式的响应数据

page_text=response.text print(page_text)

#持久化存储

with open('./por.html','w',encoding='utf-8') as fp:

fp.write(page_text)

这段代码使用了Python的`requests`库来发送一个HTTP GET请求到指定的URL,然后将响应的内容保存到一个本地HTML文件中。下面是代码的详细解释:

1. `import requests`: 导入Python的`requests`模块。`requests`是一个简单易用的HTTP库,可以发送HTTP请求。

2. `if __name__ == "__main__":`:这一行确保代码块只在该脚本作为主程序运行时执行,而不是在被导入到其他脚本中时执行。

3. `url = 'https://portal.ustraveldocs.com/'`:定义了一个变量`url`,它包含了要发送GET请求的网址。

4. `response = requests.get(url=url)`: 使用`requests.get`函数发送一个GET请求到上面定义的`url`。这个函数会返回一个响应对象(`response`),其中包含了服务器对请求的回应。

5. `page_text = response.text`:从响应对象中提取出页面的HTML内容。`response.text`返回的是服务器响应内容的字符串形式。

6. `print(page_text)`: 打印出获取到的HTML内容,以便于调试或检查。

7. `with open('./por.html','w',encoding='utf-8') as fp:`:使用`with`语句打开(或创建)一个名为`por.html`的文件用于写入。`'w'`参数表示写入模式,`encoding='utf-8'`指定文件的编码方式为UTF-8。

8. `fp.write(page_text)`: 将获取到的HTML内容(`page_text`)写入到上一步打开的文件中。

这个过程通常用于爬取网页内容,将网页的HTML代码下载下来进行分析或者备份。

 

4.关于UA伪装:
 

UA伪装(User-Agent伪装)是一种技术手段,通过修改HTTP请求中的`User-Agent`头部信息来伪装请求的来源。`User-Agent`是一个HTTP请求头部,用于告诉服务器发起请求的浏览器类型、版本以及运行浏览器的操作系统等信息。通过修改这些信息,可以让服务器认为请求来自不同的浏览器或设备,即使实际上请求是由自动化脚本或爬虫程序发起的。

### 为什么使用UA伪装?

1. **绕过网站限制**:一些网站可能会根据`User-Agent`信息限制或改变对特定浏览器或设备的内容访问。例如,只允许移动设备访问某些特定内容或提供不同的布局。通过伪装`User-Agent`,可以访问这些受限的内容。

2. **爬虫抓取**:网站可能会阻止来自爬虫或自动化脚本的请求,以保护自己的数据不被大量抓取。通过修改`User-Agent`来伪装成常见的浏览器,爬虫可以减少被网站识别和阻止的风险。

3. **测试和开发**:开发者可能需要测试他们的网站如何响应不同浏览器或设备的请求。通过修改`User-Agent`,他们可以在不实际使用那些设备的情况下模拟请求,以确保网站能够兼容各种用户代理。

### 如何实现UA伪装?

在编写HTTP请求的代码时,可以直接设置或修改`User-Agent`头部的值。例如,在使用Python的`requests`库进行网络请求时,可以通过定义请求头部的字典来自定义`User-Agent`:

```python
import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get('https://example.com', headers=headers)
```

### 注意事项

虽然UA伪装可以帮助绕过某些限制,但它也涉及到法律和道德问题。在使用UA伪装访问网站数据时,应当遵守网站的使用条款、隐私政策和相关法律法规。滥用UA伪装可能导致用户被网站永久禁止,或面临其他法律后果。因此,在考虑使用UA伪装时,务必慎重。

5.第一天的成果:

 我使用requests模块对https://portal.ustraveldocs.com/发起get 请求,并且指定'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36 Edg/121.0.0.0',得到的内容是:Please enable cookies. Sorry, you have been blocked You are unable to access ustraveldocs.com Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. What can I do to resolve this? You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page. Cloudflare Ray ID: 8567e6f92a8867d6 • Your IP: Click to reveal 120.84.10.89 • Performance & security by Cloudflare 请问这是什么情况 解释给我下 并且给我一个合理的解决方案

你遇到的情况是一个常见的网络安全措施。很多网站为了保护自己免受恶意访问和网络攻击,会使用像Cloudflare这样的安全服务。当你的请求看起来不像是来自一个正常用户的浏览行为时(比如,自动化脚本、某些特定的HTTP头部、高频率的请求等),安全服务可能会阻止这些请求并显示上述的消息。

原因可能包括:

1. **User-Agent**: 你使用的User-Agent表明请求来自一个移动设备的浏览器。尽管这本身不是问题,但如果网站检测到某些不常见或可疑的行为模式,它可能会触发安全防护。

2. **Cookies未启用**:许多网站要求客户端支持cookies以确保访问者是真实的用户。如果你的请求没有携带正确的cookie,网站可能会阻止访问。

3. **安全服务触发**:你的请求可能触发了Cloudflare的安全规则,这可能是由于请求速率、请求类型、或是请求的内容。

解决方案:

1. **启用Cookies**: 在你的请求中启用cookies。如果你使用`requests`库,可以使用`Session`对象来维持一个会话,并自动处理cookies。

2. **减慢请求频率**: 如果你在短时间内发送了大量请求,尝试减慢请求的频率。许多网站都有限制以防止DDoS攻击或爬虫滥用。

3. **改变User-Agent**: 尽管你已经使用了一个看起来合理的User-Agent,但有时更换不同的User-Agent可能会有所帮助,特别是如果你使用的User-Agent被标记为可疑的。

4. **联系网站管理员**: 如果你认为你的请求被错误地阻止,可以按照错误消息中的指示联系网站管理员。

5. **使用公开的API**: 如果网站提供了API服务,那么使用API而不是直接爬取网站内容通常更加稳定和可靠。

6. **考虑法律和道德问题**: 在尝试绕过这些限制之前,确保你的行为符合网站的使用条款和当地法律。

请注意,即使采取了上述措施,某些网站可能仍然会因为其安全策略而阻止你的请求。在这种情况下,最好是直接与网站的支持团队联系解决问题。

 

 为什么客户端支持cookies可以确保访问者是真实的用户?

 

客户端支持cookies可以帮助网站确保访问者是真实的用户,原因主要包括以下几点:

1. **状态管理**:Cookies是网站用来在用户的浏览器上存储信息的一种方式,它们允许网站保存和回忆关于用户的信息,比如登录状态、用户偏好设置、购物车内容等。这种状态信息的持续性对于提供连贯的用户体验是必需的。

2. **会话管理**:Cookies常用于管理用户会话。当用户登录到一个网站时,服务器通常会生成一个唯一的会话标识符(Session ID)并通过cookie发送给用户的浏览器。在用户的后续请求中,浏览器会自动将这个cookie返回给服务器,服务器通过这个Session ID识别出用户,从而维持用户的登录状态。这种机制要求客户端必须支持并正确地处理cookies。

3. **安全性**:一些安全措施,如防止跨站请求伪造(CSRF)攻击,依赖于cookies来验证用户请求的合法性。例如,网站可能会在用户的cookie中设置一个CSRF令牌,并要求所有表单提交或敏感操作请求携带这个令牌。这有助于确保请求是由用户本人发起的,而不是由攻击者伪造的。

4. **区分人类用户和自动化脚本**:许多自动化脚本(例如,爬虫或恶意软件)可能不会完全模拟正常浏览器的行为,特别是在处理cookies方面。如果一个客户端不接受或不发送cookies,这可能是一个迹象表明它不是一个通过常规浏览器操作的真实用户。因此,网站可能会要求必须接受和发送cookies,作为区分真实用户和可能的自动化访问的一种手段。

5. **防止滥用**:通过要求客户端接受和保留cookies,网站可以更有效地限制和控制对其资源的访问,比如限制对某些内容的频繁访问,或者防止创建多个账户进行滥用。

总的来说,客户端对cookies的支持使网站能够实现复杂的用户跟踪、状态管理和安全措施,从而帮助区分真实用户和自动化程序,确保网站资源的合理使用和用户的安全性。

接下来是要研究一下具体应该怎么 使用`Session`对象来维持一个会话,并自动处理cookies

并且需要了解一下 Cloudflare的安全规则 (目标网址使用了相关技术)

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值