在这个博客中,我们将分享一个简单的Python爬虫示例,它利用代理访问网页并从中提取信息。该脚本使用了多个库,包括`requests`、`BeautifulSoup`和`subprocess`,来处理HTTP请求和网页解析。
在这个博客中,我们将分享一个简单的Python爬虫示例,它利用代理访问网页并从中提取信息。该脚本使用了多个库,包括requests
、BeautifulSoup
和subprocess
,来处理HTTP请求和网页解析。
首先,我们定义了一个函数get_proxy
,用于获取有效的代理。该函数会尝试连接到指定的代理,如果成功则返回代理地址,否则会循环重试。
def get_proxy():
while True:
tunnel = "xxxxx"
username = "xxxxx"
password = "xxxxx"
proxy = f"http://{username}:{password}@{tunnel}/"
if check_proxy(proxy) and test_proxy_with_curl(proxy, 'https://www.baidu.com'):
return proxy
else:
print(f"代理无效: {proxy},正在获取新的代理...")
我们还定义了check_proxy
函数,用于验证代理是否可用。函数向http://httpbin.org/ip
发送请求,并检查响应的状态码。
为了确保代理工作正常,我们使用subprocess
库中的run
函数运行curl
命令。这个函数会向目标URL发送请求,并打印测试结果。
def test_proxy_with_curl(proxy, target_url):
try:
result = subprocess.run(
['curl', '-x', proxy, '-I', target_url],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
timeout=10
)
if result.returncode == 0:
print(f"代理测试成功: {result.stdout.decode('utf-8')}")
return True
else:
print(f"代理测试失败: {result.stderr.decode('utf-8')}")
return False
except subprocess.TimeoutExpired:
print("代理测试超时。")
return False
except Exception as e:
print(f"发生错误: {e}")
return False
在simulate_access
函数中,我们模拟访问一个链接并处理可能出现的异常。在请求之间随机等待一段时间,通常在1到3秒之间,以模拟真实用户的行为。
def simulate_access(href, requests):
time.sleep(random.uniform(1, 3))
try:
response = requests.get(href)
response.raise_for_status()
print(f"成功访问: {href}")
except requests.exceptions.RequestException as e:
print(f"抓取URL时发生错误: {e}")
为了防止被网站识别为爬虫,我们实现了一个函数get_random_user_agent
,从预定义的用户代理列表中随机选择一个。
最后,在find_links_with_keyword
中,我们利用百度搜索特定的关键词并提取相关链接。该函数会遍历多个页面,提取标题和链接,如果找到特定关键词的结果,就模拟访问这个链接。
def find_links_with_keyword(url, keyword, page_size=50, max_pages=5, proxies=None):
headers = {
'Host': 'www.baidu.com',
'User-Agent': get_random_user_agent()
}
soup_url = ''
for page in range(1, max_pages + 1):
params = {
'wd': keyword,
'pn': (page - 1) * page_size,
'rn': page_size,
'ie': 'utf-8'
}
try:
aurl = f"{url}?{urlencode(params)}"
time.sleep(random.uniform(1, 3))
if soup_url:
aurl = f'https://www.baidu.com/{soup_url}'
response = requests.get(aurl, headers=headers, proxies=proxies, timeout=0.7)
response.raise_for_status()
response.encoding = response.apparent_encoding
soup = BeautifulSoup(response.text, 'html.parser')
# 提取标题和链接的逻辑。
except requests.exceptions.RequestException as e:
max_pages -= 1
print(f"抓取URL时发生错误: {e}")
在主函数中,我们定义了要搜索的关键词,并依次调用find_links_with_keyword
函数。
if __name__ == '__main__':
while True:
base_url = "https://www.baidu.com/s"
search_keywords = [
"it博客", "花生博客", "优秀it博客",
"it个人博客", "前端学习sjxi",
"个人博客 sjxi", "优秀博客",
"好看的博客 sjxi"
]
for keyword in search_keywords:
find_links_with_keyword(base_url, keyword, page_size_number, max_pages_number, None)
通过此示例,我们展示了如何使用Python构建一个简单的代理爬虫,能够有效地访问网页并提取信息。您可以根据需要修改关键词和目标网站,以实现更多的功能。希望这篇文章能对您有所帮助,期待您在Python爬虫之路上的更多探索!
本站主要用于日常笔记的记录和生活日志。本站不保证所有内容信息可靠!(大多数文章属于搬运!)如有版权问题,请联系我立即删除:“abcdsjx@126.com”。
QQ: 1164453243
邮箱: abcdsjx@126.com