首页 文章 精选 留言 我的

精选列表

搜索[Python],共10000篇文章
优秀的个人博客,低调大师

【Python】从0开始写爬虫——豆瓣电影

1. 最近略忙。。java在搞soap,之前是用工具自动生成代码的。最近可能会写一个soap的java调用 2. 这个豆瓣电影的爬虫。扒信息的部分暂时先做到这了。扒到的信息如下 from scrapy import app import re header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36', 'Host': 'movie.douban.com', 'Accept-Language': 'zh-CN,zh;q=0.9' } movie_url = "https://movie.douban.com/subject/27132728/?tag=%E7%83%AD%E9%97%A8&from=gaia" m_id = re.search("[0-9]+", movie_url).group() # 获取soup对象 soup = app.get_soup(url=movie_url, headers=header, charset="utf-8") content = soup.find(id="content") # 抓取电影名字和上映年份 m_name = content.find("h1").find("span").string m_year = content.find(class_="year").string m_year = m_year[1:-1] # 去掉头尾的括号 # 抓取导演 info = content.find(id="info") m_directer = info.find(attrs={"rel": "v:directedBy"}).string# 上映日期 m_date = info.find(attrs={"property": "v:initialReleaseDate"}).string m_date = re.search("[-,0-9]+", m_date).group() # 类型 types = info.find_all(attrs={"property": "v:genre"}, limit=2) m_types = [] for type_ in types: m_types.append(type_.string) # 抓取主演,只取前面五个 actors = info.find(class_="actor").find_all(attrs={"rel": "v:starring"}, limit=5) m_actors = [] for actor in actors: m_actors.append(actor.string) # 片长 m_time = info.find(attrs={"property": "v:runtime"}).string m_time = re.search("[0-9]+", m_time).group() # 评分 score_info = soup.find(id="interest_sectl") m_score = score_info.find("strong").string m_stars = score_info.find_all(class_="rating_per") m_rate = [] for star in m_stars: m_rate.append(star.string[:-1]) m_votes = score_info.find(attrs={"property": "v:votes"}).string print("id", m_id, "名称", m_name, "年份 ", m_year, "导演 ", m_directer, "主演", m_actors) print("上映日期", m_date, "类型", m_types, "片长", m_time) print("评分", m_score, "星评(从5星到1星)", m_rate, "评价总数", m_votes) 输出如下 id 27132728 名称 致命警告 El aviso 年份 2018 导演 丹尼尔·卡尔帕索罗 主演 ['奥拉·加里多', '劳尔·阿雷瓦洛', '贝伦·奎斯塔', 'Sergio Mur', 'Aitor Luna'] 上映日期 2018-03-23 类型 ['惊悚'] 片长 92 评分 6.4 星评(从5星到1星) ['14.2', '19.9', '41.1', '21.3', '3.5'] 评价总数 445 把这些狗东西封装成一个方法。并且随便找几个豆瓣电影的url试一下。在多尝试几个url之后,会报一些问题,主要是没有进行空判断, 所以稍微修改了一点 from scrapy import app import re def douban_movie(movie_url): header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36', 'Host': 'movie.douban.com', 'Accept-Language': 'zh-CN,zh;q=0.9' } m_id = re.search("[0-9]+", movie_url).group() # 获取soup对象 soup = app.get_soup(url=movie_url, headers=header, charset="utf-8") content = soup.find(id="content") # 抓取电影名字和上映年份 m_name = content.find("h1").find("span").string m_year = content.find(class_="year").string m_year = m_year[1:-1] # 去掉头尾的括号 # 抓取导演 info = content.find(id="info") m_directer = info.find(attrs={"rel": "v:directedBy"}).string # 上映日期 m_date = info.find(attrs={"property": "v:initialReleaseDate"}).string m_date = re.search("[-,0-9]+", m_date).group() # 类型 types = info.find_all(attrs={"property": "v:genre"}, limit=2) m_types = [] for type_ in types: m_types.append(type_.string) # 抓取主演,只取前面五个 actors = info.find(class_="actor").find_all(attrs={"rel": "v:starring"}, limit=5) m_actors = [] for actor in actors: m_actors.append(actor.string) # 片长 m_time = info.find(attrs={"property": "v:runtime"}) m_time = re.search("[0-9]+", m_time.string).group() if m_time else 0 # 评分 score_info = soup.find(id="interest_sectl") m_score = score_info.find("strong").string m_stars = score_info.find_all(class_="rating_per") m_rate = [] for star in m_stars: m_rate.append(star.string[:-1]) m_votes = score_info.find(attrs={"property": "v:votes"}) m_votes = m_votes.string if m_votes else 0 print("id", m_id, "名称", m_name, "年份 ", m_year, "导演 ", m_directer, "主演", m_actors) print("上映日期", m_date, "类型", m_types, "片长", m_time) print("评分", m_score, "星评(从5星到1星)", m_rate, "评价总数", m_votes) douban_movie("https://movie.douban.com/subject/30236775/?from=showing") douban_movie("https://movie.douban.com/subject/26842702/?tag=%E7%83%AD%E9%97%A8&from=gaia") douban_movie("https://movie.douban.com/subject/26973784/?tag=%E6%9C%80%E6%96%B0&from=gaia") douban_movie("https://movie.douban.com/subject/30249296/?tag=%E7%83%AD%E9%97%A8&from=gaia") 输出如下 id 30236775 名称 旅行吧!井底之蛙 年份 2018 导演 陈设 主演 ['王雪沁', '吴凡', '周宗禹', '强光宗', '张艺文'] 上映日期 2018-08-18 类型 ['动画', '奇幻'] 片长 78 评分 None 星评(从5星到1星) [] 评价总数 0 id 26842702 名称 燃烧 버닝 年份 2018 导演 李沧东 主演 ['刘亚仁', '史蒂文·元', '全钟瑞', '金秀京', '崔承浩'] 上映日期 2018-05-16 类型 ['剧情', '悬疑'] 片长 148 评分 7.9 星评(从5星到1星) ['25.9', '48.1', '21.4', '3.2', '1.3'] 评价总数 81519 id 26973784 名称 设局 La niebla y la doncella 年份 2017 导演 安德烈斯·M·科佩尔 主演 ['基姆·古铁雷斯', '薇洛妮卡·恩切圭', '奥拉·加里多', '罗伯托·阿拉莫'] 上映日期 2017-09-08 类型 ['惊悚'] 片长 0 评分 5.2 星评(从5星到1星) ['1.2', '9.8', '42.0', '40.0', '7.1'] 评价总数 320 id 30249296 名称 我们的侣行 第二季 年份 2018 导演 张昕宇 主演 ['张昕宇', '梁红'] 上映日期 2018-06-12 类型 ['真人秀'] 片长 0 评分 8.9 星评(从5星到1星) ['59.3', '27.8', '11.1', '1.9', '0.0'] 评价总数 342 又稍微修改了一下 1. 把原方法加了一个返回值返回一个存储数据的字典 2.对数据做了一些转换,主要是把字符串转成数字 3.对电影和电视剧做了一个区分。 from scrapy import app import re import datetime def douban_movie(movie_url): header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36', 'Host': 'movie.douban.com', 'Accept-Language': 'zh-CN,zh;q=0.9' } movie = {} m_id = re.search("[0-9]+", movie_url).group() movie["id"] = m_id # 获取soup对象 soup = app.get_soup(url=movie_url, headers=header, charset="utf-8") content = soup.find(id="content") kinds = content.find(class_="episode_list") movie["type"] = 0 if kinds else 1 # 0 :电视剧,1:电影。如果有分集数,为电视剧, 否则就是电影 # 抓取电影名字和上映年份 m_name = content.find("h1").find("span").string movie["name"] = m_name; m_year = content.find(class_="year").string m_year = m_year[1:-1] # 去掉头尾的括号 movie["year"] = m_year # 抓取导演 info = content.find(id="info") m_directer = info.find(attrs={"rel": "v:directedBy"}).string movie["directer"] = m_directer # 上映日期 m_date = info.find(attrs={"property": "v:initialReleaseDate"}).string m_date = re.search("[-,0-9]+", m_date).group() movie["date"] = datetime.datetime.strptime(m_date, '%Y-%m-%d') # 类型 categories = info.find_all(attrs={"property": "v:genre"}, limit=2) m_categories = [] for category in categories: m_categories.append(category.string) movie["categories"] = m_categories # 抓取主演,只取前面五个 actors = info.find(class_="actor").find_all(attrs={"rel": "v:starring"}, limit=5) m_actors = [] for actor in actors: m_actors.append(actor.string) movie["actors"] = m_actors # 片长 m_time = info.find(attrs={"property": "v:runtime"}) m_time = int(re.search("[0-9]+", m_time.string).group()) if m_time else 0 movie["time"] = m_time # 评分 score_info = soup.find(id="interest_sectl") m_score = score_info.find("strong").string if score_info.find("strong") else 0.0 movie["score"] = float(m_score) if m_score else 0.0 m_stars = score_info.find_all(class_="rating_per") m_rate = [] for star in m_stars: m_rate.append(float(star.string[:-1])) movie["stars"] = m_rate m_votes = score_info.find(attrs={"property": "v:votes"}) m_votes = int(m_votes.string) if m_votes else 0 movie["vote"] = m_votes return movie print(douban_movie("https://movie.douban.com/subject/30236775/?from=showing")) print(douban_movie("https://movie.douban.com/subject/26842702/?tag=%E7%83%AD%E9%97%A8&from=gaia")) print(douban_movie("https://movie.douban.com/subject/26973784/?tag=%E6%9C%80%E6%96%B0&from=gaia")) print(douban_movie("https://movie.douban.com/subject/30249296/?tag=%E7%83%AD%E9%97%A8&from=gaia")) 输出 {'id': '30236775', 'type': 1, 'name': '旅行吧!井底之蛙', 'year': '2018', 'directer': '陈设', 'date': datetime.datetime(2018, 8, 18, 0, 0), 'categories': ['动画', '奇幻'], 'actors': ['王雪沁', '吴凡', '周宗禹', '强光宗', '张艺文'], 'time': 78, 'score': 0.0, 'stars': [], 'vote': 0} {'id': '26842702', 'type': 1, 'name': '燃烧 버닝', 'year': '2018', 'directer': '李沧东', 'date': datetime.datetime(2018, 5, 16, 0, 0), 'categories': ['剧情', '悬疑'], 'actors': ['刘亚仁', '史蒂文·元', '全钟瑞', '金秀京', '崔承浩'], 'time': 148, 'score': 7.9, 'stars': [25.9, 48.1, 21.5, 3.2, 1.3], 'vote': 83194} {'id': '26973784', 'type': 1, 'name': '设局 La niebla y la doncella', 'year': '2017', 'directer': '安德烈斯·M·科佩尔', 'date': datetime.datetime(2017, 9, 8, 0, 0), 'categories': ['惊悚'], 'actors': ['基姆·古铁雷斯', '薇洛妮卡·恩切圭', '奥拉·加里多', '罗伯托·阿拉莫'], 'time': 0, 'score': 5.2, 'stars': [1.2, 9.8, 41.8, 40.2, 7.0], 'vote': 321} {'id': '30249296', 'type': 0, 'name': '我们的侣行 第二季', 'year': '2018', 'directer': '张昕宇', 'date': datetime.datetime(2018, 6, 12, 0, 0), 'categories': ['真人秀'], 'actors': ['张昕宇', '梁红'], 'time': 0, 'score': 8.9, 'stars': [59.3, 28.8, 10.2, 1.7, 0.0], 'vote': 400}

优秀的个人博客,低调大师

python selenium 三种等待方式详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/81591216 言: 当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素不可见,那就必须要加等待了,等待元素可见再继续运行程序; 正文: 1.强制等待(sleep) 设置等待最简单的方法就是强制等待,其实就是time.sleep()方法,不管它什么情况,让程序暂停运行一定时间,时间过后继续运行;缺点时不智能,设置的时间太短,元素还没有加载出来,那照样会报错;设置的时间太长,则会浪费时间,不要小瞧每次几秒的时间,case多了,代码量大了,很多个几秒就会影响整体的运行速度了;所以尽量少用这个 2.隐性等待(implicitly_wait()) driver.implicitly_wait(),隐性等待设置了一个时间,在一段时间内网页是否加载完成,如果完成了,就进行下一步;在设置的时间内没有加载完成,则会报超时加载; # -*- coding: utf-8 -*- from selenium import webdriver import time driver = webdriver.Chrome() driver.implicitly_wait(20) # 隐性等待,最长等30秒 driver.get('https://www.baidu.com') time.sleep(3) driver.quit() 缺点也是不智能,因为随着ajax技术的广泛应用,页面的元素往往都可以时间局部加载,也就是在整个页面没有加载完的时候,可能我们需要的元素已经加载完成了,那就么有必要再等待整个页面的加载,执行进行下一步,而隐性等待满足不了这一点; 另外一点,隐性等待的设置时全局性的,在开头设置过之后,整个的程序运行过程中都会有效,都会等待页面加载完成;不需要每次设置一遍; 3.显性等待(WebDriverWait) WebDriverWait(driver,20,0.5).until(expected_conditions.presence_of_element_located(locator)),selenium中的wait模块的WebDriverWait()方法,配合until或者until_not方法,再辅助以一些判断条件,就可以构成这样一个场景:每经过多少秒就查看一次locator的元素是否可见,如果可见就停止等待,如果不可见就继续等待直到超过规定的时间后,报超时异常;当然也可以判断某元素是否在规定时间内不可见等等的各种场景吧,需要根据你自己实际的场景选择判断条件; # -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Firefox() driver.get('https://huilansame.github.io') WebDriverWait(driver,20,0.5).until( EC.presence_of_element_located((By.LINK_TEXT, 'CSDN'))) print driver.find_element_by_link_text('CSDN').get_attribute('href') driver.close() expected_conditions模块中提供了很多可以提供判断的条件: selenium.webdriver.support.expected_conditions(模块) 这两个条件类验证title,验证传入的参数title是否等于或包含于driver.title title_is title_contains 这两个人条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, 'kw') 顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行 presence_of_element_located presence_of_all_elements_located 这三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement 第一个和第三个其实质是一样的 visibility_of_element_located invisibility_of_element_located visibility_of 这两个人条件判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value text_to_be_present_in_element text_to_be_present_in_element_value 这个条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement frame_to_be_available_and_switch_to_it 这个条件判断是否有alert出现 alert_is_present 这个条件判断元素是否可点击,传入locator element_to_be_clickable 这四个条件判断元素是否被选中,第一个条件传入WebElement对象,第二个传入locator元组 第三个传入WebElement对象以及状态,相等返回True,否则返回False 第四个传入locator以及状态,相等返回True,否则返回False element_to_be_selected element_located_to_be_selected element_selection_state_to_be element_located_selection_state_to_be 最后一个条件判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了 staleness_of

优秀的个人博客,低调大师

Python列表推导式与生成器

愿你一直充满无限的潜力 列表推导式 >>> [x+1 for x in range(10) ] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 从上面的代码可以看出,列表推导式是生成一个列表。 生成器 >>> g=(x+1 for x in range(10)) >>> g <generator object <genexpr> at 0x7f3af91b7570> >>> next(g) 1 >>> next(g) 2 >>> next(g) 3 >>> next(g) 4 >>> next(g) 5 >>> next(g) 6 >>> next(g) 7 >>> next(g) 8 >>> next(g) 9 >>> next(g) 10 >>> next(g) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>> 从上面的代码可以看出,生成器的形式和列表推导式差不多,只是括号的不同。 本质区别是列表推导式是一次性生成,而生成器是通过相应的算法推导出来的值,在数据量较大的时候,你不可能一次性生成那么大的列表,生成器是最好的选择。 例如:用生成器产生斐波拉契数列 def fibs(max): n,a,b=0,0,1 while n < max: yield b a,b = b,a+b n+=1 for n in fibs(6): print(n)

优秀的个人博客,低调大师

Python网络编程(OSI模型、网络协议、TCP)

前言: 什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系。 在数学上,网络是一种图,一般认为专指加权图。 网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类 型的实际问题中抽象出来的模型 在计算机领域中,网络是信息传输、接收、共享的虚拟平台,通过它把各个点、面、体的信息联系到一起,从而实现这些资源的共享。 网络是人类发展史来最重要的发明,提高了科技和人类社会的发展。 在1999年之前,人们一般认为网络的结构都是随机的。但随着Barabasi和Watts在1999年分别发现了网络的无标度和小世界特性并分别在世界著名的《科学》和《自然》 杂志上 发表了他们的发现之后,人们才认识到网络的复杂性。 网络会借助文字阅读、图片查看、影音播放、下载传输、游戏、聊天等软件工具从文字、图片、声音、视频等方面给人们带来极其丰富的生活和美好的享受。 网络目的: 网络传输的目的是什么? 没错就是:数据传输 由于网络的复杂性以及各种应用硬件等等不匹配原因 和编码是一个道理你有你的我有我的会导致冲突等问题 所以出现了 :ISO(国际标准化组织) ISO是干嘛的呢? 他是一个非盈利性国际组织 这个组织制定了一个用于计算机或通讯系统间的互联网标准体系 叫OSI模型不仅包括一系列抽象的术语或概念,也包括具体的协议 OSI公有七层 : 应用层: 提供用户服务,具体的内容由特定的程序规定 表示层: 提供数据的加密和压缩优化 会话层: 确定建立应用链接,选择传输服务 传输层: 提供数据传输服务,进行流量控制 网络层: 路由选着,网络互联 链路层: 提供链路交换,具体消息的发送 物理层: 物理硬件,接口,网卡的规定 或 四层模型: 应用层 : 应用层 表示层 会话层 传输层 : 传输层 网络层 : 网络层 物理链路层: 链路层和物理层 或 五层模型(tcp/ip模型): 应用层 : 应用层 表示层 会话层 传输层 : 传输层 网络层 : 网络层 链路层 : 链路层 物理层 : 物理层 OSI模型优点: 将功能分开 降低网络中的耦合度, 使用开发流程更加清晰,每部分各司其职 高内聚低耦合: 高内聚:每个模块功能尽量单一,不会多个功能掺杂 低耦合:尽量降低每个模块之间的关联性 网络协议: 在网络通讯中协议必须遵守的规定, 如建立什么连接,消息结构如何解析等 应用层:TFTP(文件传输)、HTTP(超文本传输协议)、DNS(域名解析)、SMTP(邮件传输) 传输层:TCP、UDP 网络层:IP 物理层:IEEE iPython3:socket模块 网络相关概念: 网络主机:在网络上确定一台主机 本地使用:127.0.0.1 或 “localhost” 网络地址:“0.0.0.0” 或 “172.168.40.53” ifconfig:查看本机IP (ens33:本地IP lo:本地回还) ipconfig:windoes中 socket.gethostname() : 获取本机主机名 socket.gethostbyname('tedu') : 利用主机名获取ip socket.gethostbyname('localhost'): 获取本地ip 常用IP地址: IPv4: 点分十进制 例如:192.168.1.3 取值0~255(32位) IPv6: 128位 网络连接测试 ping 172.18.32.47 特殊ip 127.0.0.1 本地IP测试 0.0.0.0 自动使用本地可用网卡IP 192.168.1.0 代表网段 192.168.1.1 通常为网关地址 192.168.1.255 广播地址 访问主机IP地址: socket.gethostbyaddr('127.0.0.1') (' localhost', [], [' 127.0.0.1']) 主机 别名 ip地址 IP十六进制转换: socket.inet_aton('192.168.1.2') b'\xc0\xa8\x01\x02' socket.inet_ntoa(b'\xc0\xa8\x01\02') '192.168.1.2' 域名: 是指网络服务器地址在网络上的名称 端口号: 端口号是地址的一部分,在一个系统中每个网络(区分应用ip) 应用监听不同的端口,以获取对应的端口传递信息 取值范围:1---------65535 1---------255 一些通用端口(众所周知的程序占用) 256------1023 系统端口 1024-----65535 自用端口 获取应用程序的端口: socket.getservbyname('ssh') 22 socket.getservbyname('mysql') 3306 传输层服务: 面向连接的传输服务(tcp协议): 传输特征: 可靠的数据传输: 可靠性:无失序、无差错、无重复、无丢失 在数据传输前和传输后需要建立连接和断开链接 面向传输服务建立连接的过程:‘三次握手’ 客户端向服务器发送链接请求 服务器接受到请求进行确认,返回确认报文 客户端收到服务器回复最终确认链接 面向传输服务断开链接的过程:‘四次挥手’ 主动方发送报文,告知被动方要断开链接 被动方回复报文,表示已经接受到请求,准备断开 被动方再次发送报文,表示准备处理就绪,可以断开 主动方发送确认报文,断开链接 应用情况: 适用于传输较大的内容或文件,网络良好, 需要保证传输可靠性的情况 e.g. 信息聊天,文件上传下载,邮件,网页获取 面向无连接的传输服务(udp协议): 不保证传输的可靠性 没有建立连接和断开的过程 数据的收发比较自由 适用情况: 网络情况较差,对可靠性要求不高,收发消息的两端 e.g.:网络视频,群聊,广播等 socket 套接字编程: 目的: 通过编程语言提供的套接字编程接口 可以更简单的完成基于tcp/udp的编程 套接字: 是完成上述目标的一种编程手段 套接字类别: 1.流式套接字( SOCK_STREAM): 传输层基于套接字的协议通信 面向连接可靠的传输 tcp的传输 流式套接字 2.数据报套接字( SOCK_DGRAM): 面向无连接不可靠的传输 udp的传输 数据报套接字 3.低层套接字(SOCK_RAM): 访问底层协议套接字 TCP服务端: import socket 1.创建套接字(函数): socket.socket(sock_family = AF_INET, sock_type = SOCK_STREAM, proto = 0) 功能: 创建套接字 参数: sock_family地址族类型 AF_INET:IPV4网络通讯 sock_tpye:套接字类型 SICK_STREAM :流式 SOCK_DGRAM:数据报 proto:通常为0 选定子协议类型 返回值:返回一个套接字对象 2.绑定地址(函数): sockfd.bind(addr) 功能: 绑定地址 参数: addr--->元组 (ip, port) ("0.0.0.0", 8888) 3.设置监听套接字: sockfd.listen(n) 功能: 将套接字设置为监听套接字,创建监听队列 参数: 监听队列大小 一个监听套接字可以连接多个客户端 4.等待接受客户端链接: connfd,addr = sockfd.accept() 阻塞状态 功能: 阻塞等待并处理客户端链接 返回值: connfd:新的套接字,用于和客户端通讯 addr:链接客户端的地址(ip, port) 阻塞函数: 当程序运行到阻塞函数位置,如果某种条件 没有达成则暂停程序运行,直到条件达成结束阻塞 - 5.消息的收发: data = connfd.recv( buffersize) 功能: 接受消息 参数: 一次接受消息的大小 字节 返回值:返回接受的内容 n = connfd.send(data) 功能: 发送消息 参数: 要发送的内容(bytes格式) 返回值:返回实际发送的字节数 6.关闭套接字 sockfd.close() 客户端: 1.创建套接字 (和服务端套接字类型相同) 2.发起链接 connect(addr) 功能: 向服务端发起链接 参数: 服务器地址 (元组) 3.消息收发 4.关闭套接字 示例 服务端: from socket import * # 创建套接字对象 sockd = socket() # 绑定IP地址 sockd.bind(("127.0.0.1", 6666)) # 设置监听套接字 sockd.listen(5) # 等待客户端链接 cond, addr = sockd.accept() # 接受客户端消息(单次1024字节) data = cond.recv(1024) print(data.decode()) # 发送消息 cond.send(b"Hello, I'm the server") # 关闭套接字 cond.close() sockd.close() 这里本机测试可以利用两个进行 telnet命令链接服务端测试 服务器: from socket import * # 创建套接字 sockfd = socket(AF_INET, SOCK_STREAM) # 绑定地址 sockfd.bind(("0.0.0.0", 8888)) # 设置监听 sockfd.listen(5) # 等待客户端链接 print("waiting for connect....") conn, addr = sockfd.accept() print("Connect from", addr) print("Connect from", conn) # 消息收发 while True: data = conn.recv(1024) if data.decode() == "": n = conn.send(b"Bey") break print("Receive", data.decode()) n = conn.send(b"Receive your message") print("send %d" % n) # 关闭套接字 conn.close() sockfd.close() 客户端: # tcp_client.py from socket import * sockfd = socket() sockfd.connect(("172.18.32.31", 8888)) while True: msg = input("Msg>>") if msg == "": break sockfd.send(msg.encode()) data = sockfd.recv(1024) # if msg == "Bye": # break print(data.decode()) sockfd.close() 简单的消息传输:

优秀的个人博客,低调大师

【Python】从0开始写爬虫——小试身手

先写个demo获取数据,我不会做太多介绍,基本上都会写在注释里。 header 的数据一般就是在浏览器的调试工具里,有的网站访问需要登陆,就要加cookie。像Chrome的调试工具 快捷键是F12. 去到新浪首页,按F12调出开发者工具,然后刷新。在Network下拉到最上面就能看到一开始的请求信息(我之前是做java web的,略微会一点。) import urllib.request header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36', } url = "http://www.sina.com" request = urllib.request.Request(url=url, headers=header) # url为爬取的链接,headers主要是假装我们不是爬虫,现在我们就假装我们是个Chrome浏览器 response = urllib.request.urlopen(request) # 请求数据 data = response.read() # 读取返回的数据 data.decode("UTF-8") # 设置字符格式为utf-8,可以处理中文 然后控制台会打印出一段html,就是新浪的首页,数据太多就不发了,发一部分截图。 然后我们用BeautifulSoup试着解析一下。 先导入BeautifulSoup, 一般都是加在最上面 import urllib.request from bs4 import BeautifulSoup 然后在最后面把 print(data) 那句去掉加上 soup = BeautifulSoup(data, "html.parser") # 把html转换成BeautifulSoup对象,这样我们就可以用BeautifulSoup的方法来解析htmlprint(soup) # 打印 控制台输出如下 然后我们可以 print(soup.title) # 打印标题 print(soup.find_all("a")) # 打印所有a标签 控制台输出, 因为find_all("a") 会找出所有的a标签,所以输出很多 现在就得去了解BeautifulSoup更多的知识,以便我们能更加快速得获取我们想要得信息。 忘了贴一下完整的代码 import urllib.request from bs4 import BeautifulSoup header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36' } url = "http://www.sina.com" request = urllib.request.Request(url=url, headers=header) # url为爬取的链接,headers主要是假装我们不是爬虫,现在我们就假装我们是个Chrome浏览器 response = urllib.request.urlopen(request) # 请求数据 data = response.read() # 读取返回的数据 data.decode("UTF-8") # 设置字符格式为utf-8,可以处理中文 soup = BeautifulSoup(data, "html.parser") # 把html转换成BeautifulSoup对象,这样我们就可以用BeautifulSoup的方法来解析html print(soup.title) # 打印标题 print(soup.find_all("a")) # 打印所有a标签

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册