张小明 2026/1/3 11:49:11
河北中冶润丰建设股份有限公司网站,开发网站通过第三方微信认证登录开发费用,建设招聘网站需要哪些资质,大连金州区房价先看代码#xff0c;代码大部分都是定义函数 代码就是这样#xff0c;全是用定义函数#xff0c;这样出现问题维护和在其他地方调用都比较方便
另外#xff0c;简单爬虫基本都要遵守#xff1a;发送请求#xff0c;获得响应#xff0c;得到网页文本#xff0c;定位目标…先看代码代码大部分都是定义函数代码就是这样全是用定义函数这样出现问题维护和在其他地方调用都比较方便另外简单爬虫基本都要遵守发送请求获得响应得到网页文本定位目标位置(本文用正则表达式)获取信息打印信息爬取网址https://books.toscrape.com/catalogue/page-1.html一、获取HTML文本首先定义了一个toscrape_api(url)函数并传入了一个参数url这个定义函数用于获得传入参数url的HTML文本我说白了我白说了这其实是一个通用函数只要传入url参数(网址)就获得该参数的HTML。其中内容还是发送请求response requests.get(url,headers headers)获得响应response在这其中还做了个简单的反爬headers至于到底有没有的得到响应就if语句判断一下ifresponse.status_code 200:returnresponse.textelse: print(请求未成功) return 0如果状态码是200说明就请求成功了函数就返回response.text这就是HTML不然就输出请求未成功并返回0也好让我们知道请求未成功二、列表页网址获取我们想要进去每一个书籍的详情页就需要获得每一个详情页的网址url通过观察发现(有的人说怎么观察多点开几个书籍的详情页观察他们的网址变化)每一个书籍的详情页都是网址(https://books.toscrape.com/catalogue/)列表页中每一本书的属性为href的值这就需要我们先爬取列表页中每一本书属性为href的值在与这个网址(https://books.toscrape.com/catalogue/)结合就形成了详情页的网页在进行爬取就行了但在爬取列表页中href的值之前我们还需要构造列表页的网址毕竟列表页有10页通过观察(还是多点几个列表页看看网址)很容易发现网址中就只有其中的数字在发生变化1—10刚好就是10页的详情页用一个for循环就能轻易搞定就是下面代码deftoscrape_index(page): url fhttps://books.toscrape.com/catalogue/page-{page}.html returntoscrape_api(url)上面代码中并没有for循环因为for循环在主程序(定义函数main)中上面只是构建了列表页网址其中返回值是定义函数toscrape_api(url)假设传入的参数page为1那就获得了列表第一页的网址url然后将该url传入toscrape_api(url)函数中就获得列表页第一页的HTML三、获取详情页网址后缀现在来定义一个方法用来获得列表页中属性为href的值也就是详情页的网址的后缀用正则来匹配deftoscrape_index_href(html): index_pattern re.compile(ahref(.*?) title.*?)detail re.findall(index_pattern,html) foritemindetail: index_href fhttps://books.toscrape.com/catalogue/{item} yieldindex_href用compile方法构造正则表达式然后findall方法查找该列表页的HTML就能找到匹配该列表页所有的href的值并以列表的形式存储在detail中其中每一个href的值都是以元组的形式存在接着用for循环遍历这个列表把详情页后缀和https://books.toscrape.com/catalogue拼配就形成了详情页但是遍历后并没有把他全部存储而是用yield方法生成了一个生成器index_href简单来说就是遇到yieldindex_href就先订到这里再次下面代码出现index_href才进行下一次的循环直到再次遇到yieldindex_href又定到这里或者直接理解成列表也可以遍历虽然错误但好理解四、获取详情页的HTML既然详情页的网址已经有了就按照重复性步骤接着还是发送请求就是下面代码deftoscrape_detail(href):returntoscrape_api(href)至于为什么不在上一个定义函数的结尾直接返回toscrape_api(href)而是多此一举的又定义一个函数因为有条理而且出现错误也比较好找OK通过这个定义函数我们就获得了详情页的HTML接着还是像上面某一步一样用正则匹配详情页中需要的内容五、构造匹配详情页书名、价格、库存、评级、产品描述的正则接下来的定义函数稍微有点长简单分成两部分1.正则匹配其实就是构建正则匹配对象也挺简单实在不行就单独创建一个.py文件多尝试几次代码就是下面detail_pattern re.compile(rh1(.*?)/h1\s# 书名p classprice_color(.*?)/p.*?# 价格p classstar-rating (.*?).*?# 评级p(.*?)/p.*?# 产品描述tdIn stock \(\s*(\d)\s*available\)/td# 库存 ,re.S) detail_results re.findall(detail_pattern,html)当然也可以创建5个complie方法用search()方法进行查找用group()方法获取内容也很简单OK还是说说这个构建了一个整体的正则匹配如果第一个匹配不到后面几个也匹配不到还是建议用(5个complie方法),构建完就进行查找用的是findall方法查找结果是列表列表中的元素是以元组的形式存在2.获取内容既然需要的内容是以列表的形式存在直接遍历就行了forresultindetail_results: name result[0] if result[0] else None preice result[1] if result[0] else None stock result[4] if result[0] else None evaluate result[2] if result[0] else None describe result[3] if result[0] else None detail_result { 书名:name, 价格:preice, 库存:stock, 评级:evaluate, 产品描述:describe } results.append(detail_result) return results通过遍历就拿到列表中的每一个元素而这些元素又是元组所以可以根据索引获得值方才说如果第一个匹配错误后面都匹配不了直接返回[ ]所以这里的if result[0] else None没啥用可以删了然后创建字典把内容以字典形式存储然后把字典加入到全局变量列表results那后面的return results也没啥用可以删了或者写成return 0都行这样每使用一次定义函数toscrape_compile()就在全局变量列表results中加入一次字典(就是一本书籍的信息)直到全部加入六、保存为csv文件这是固定用法这个用法只用传入两个参数文件名称和列表这里直接命名为toscrape详情页内容.csv就只用传入一个参数了defsave_to_csv(results): df pd.DataFrame(results) df.to_csv(toscrape详情页内容.csv,indexFalse,encodingutf-8-sig)将刚才的全局变量results传入就行了七、主程序用以调用各个定义函数将定义函数联系起来defmain():forpageinrange(1,3):html toscrape_index(page)index_href toscrape_index_href(html)forhrefinindex_href: print(href)html toscrape_detail(href) toscrape_compile(html) print(results) save_to_csv(results)这里详细说下整篇思路先用forpageinrange(1,3)(由于内容有点多我就爬了前两页的)把值赋给toscrape_index(page)函数就获得了列表页的html把列表页的html传入toscrape_index_href(html)函数就获得了详情页的网址url(index_href)这里就遍历了生成器(index_href),把网址index_href传入toscrape_detail(href)函数就获得详情页的html将详情页的html传入toscrape_compile(html)这样就会获得书籍的详细内容通过for循环不断网全局变量中加入每一本书籍的内容最后调用save_to_csv(results)函数把数据存放在CSV文件中整体过程就是这样最后还有个启动程序if__name__ __main__: main()y 运行结果
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
兰州模板网站seo价格2022最新免费的推广引流软件
快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个VS2022最小化离线安装包原型工具。仅包含核心编辑器、C#编译器和调试器的基础组件,支持快速生成50MB以内的精简安装包。提供一键测试环境搭建、基本功能验证脚本…
北京哪家网站建设公司好湛江免费建站
网络安全防护指南 1. 服务配置文件查看 在网络安全防护中,我们首先要查看可能需要启用的其他服务的配置文件。例如,对于Web服务器,我们可能会用到Apache或者NGINX。默认的配置文件包含了大量可供使用的示例。若要启用某个示例,只需将 enabled = false 改为 enable = t…
网站建设帐号网站手机pc同步
软件规模与编程语言选择的深度剖析 在软件开发领域,软件规模的确定以及编程语言的选择是至关重要的决策,它们直接影响着软件的开发效率、可维护性和性能。下面我们将深入探讨这些关键问题。 软件规模的合理界定 在Unix的世界里,小型、高效工具的理念深入人心,但这背后隐藏…
企业建设网站软件网络监控系统
1.移动零 1.1题目链接 移动零 1.2题目解析 题目要求将所有0移动到数组末尾,同时保持非0元素的相对顺序,其实我们可以反向思考:将所有非0元素移动到数组最前面,因为题目关心的只是非0元素的顺序:我们可以定义两个下…
网站推广找中国设计网站排行榜
✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码获取及仿真…