网页源代码抓取工具

网页源代码抓取工具

还能有 Selenium 都抓取不到的内容?

网站优化优采云 发表了文章 • 0 个评论 • 58 次浏览 • 2022-05-25 21:12 • 来自相关话题

  还能有 Selenium 都抓取不到的内容?
  有一些同学在写爬虫的时候,过于依赖 Selenium,觉得只要使用模拟浏览器,在不被网站屏蔽的情况下,就可以爬到任何内容。
  今天我们不讨论字体反爬虫和 CSS 反爬虫这两种情况。我们来看一段非常简单的网页。这个网页只有一个HTML 文件,不加载特殊字体,不加载 CSS 文件。
  
  这个网页的奇怪之处在哪里呢?我们试一试使用 XPath Helper 来提取网页上面的红色文字,发现XPath 竟然无法找到这段文字,如下图所示:
  
  然后我们使用 Selenium 来试一试:
  
  Selenium果然无法获取 红字到内容。我们再打印一下网页的源代码:
  
  这一次,Selenium 获取到的源代码,竟然跟 Chrome 开发者工具里面显示的源代码不一样?这个问题的关键,就在开发者工具里面的这样一段文字:
  
  因为这个节点是一个shadow DOM[1]。shadow DOM 的行为跟 iframe很像,都是把一段HTML 信息嵌入到另一个 HTML 中。但不同的是,iframe被嵌入的地址需要额外再搭建一个 HTTP服务,而 shadow DOM 可以只嵌入一段 HTML 代码,所以它比 iframe 更节省资源。在上面的截图中,通过下面这三行代码,我们把一个新的
  标签嵌入到了原来的 HTML 中:
      var content = document.querySelector('.content');<br />    var root = content.attachShadow({mode: 'open'});<br />    root.innerHTML = '<p class="real_content" style="color: red">你抓不到这段文字的!'<br /></p>
  而这个被嵌入的影子标签,就像 iframe 一样,是无法直接使用 Selenium 提取的。如果强行提取,那么,我们需要使用 JavaScript 获取 shadow DOM,然后再进行提取。我们来看一段可以正常工作的代码:
  shadow = driver.execute_script('return document.querySelector(".content").shadowRoot')<br />content = shadow.find_element_by_class_name('real_content')<br />print(content.text)<br />
  运行效果如下图所示:
  
  这段代码,首先通过 JavaScript 找到shadow-root的父节点元素,然后返回这个元素的.shadowRoot属性。在 Python 里面拿到这个属性以后,使用.find_element_by_class_name()方法获取里面的内容。要特别注意的是,拿到shadow-root节点以后,只能通过 CSS 选择器进一步筛选里面的内容,不能用 XPath,否则会导致报错。参考资料[1]
  shadow DOM: 查看全部

  还能有 Selenium 都抓取不到的内容?
  有一些同学在写爬虫的时候,过于依赖 Selenium,觉得只要使用模拟浏览器,在不被网站屏蔽的情况下,就可以爬到任何内容。
  今天我们不讨论字体反爬虫和 CSS 反爬虫这两种情况。我们来看一段非常简单的网页。这个网页只有一个HTML 文件,不加载特殊字体,不加载 CSS 文件。
  
  这个网页的奇怪之处在哪里呢?我们试一试使用 XPath Helper 来提取网页上面的红色文字,发现XPath 竟然无法找到这段文字,如下图所示:
  
  然后我们使用 Selenium 来试一试:
  
  Selenium果然无法获取 红字到内容。我们再打印一下网页的源代码:
  
  这一次,Selenium 获取到的源代码,竟然跟 Chrome 开发者工具里面显示的源代码不一样?这个问题的关键,就在开发者工具里面的这样一段文字:
  
  因为这个节点是一个shadow DOM[1]。shadow DOM 的行为跟 iframe很像,都是把一段HTML 信息嵌入到另一个 HTML 中。但不同的是,iframe被嵌入的地址需要额外再搭建一个 HTTP服务,而 shadow DOM 可以只嵌入一段 HTML 代码,所以它比 iframe 更节省资源。在上面的截图中,通过下面这三行代码,我们把一个新的
  标签嵌入到了原来的 HTML 中:
      var content = document.querySelector('.content');<br />    var root = content.attachShadow({mode: 'open'});<br />    root.innerHTML = '<p class="real_content" style="color: red">你抓不到这段文字的!'<br /></p>
  而这个被嵌入的影子标签,就像 iframe 一样,是无法直接使用 Selenium 提取的。如果强行提取,那么,我们需要使用 JavaScript 获取 shadow DOM,然后再进行提取。我们来看一段可以正常工作的代码:
  shadow = driver.execute_script('return document.querySelector(".content").shadowRoot')<br />content = shadow.find_element_by_class_name('real_content')<br />print(content.text)<br />
  运行效果如下图所示:
  
  这段代码,首先通过 JavaScript 找到shadow-root的父节点元素,然后返回这个元素的.shadowRoot属性。在 Python 里面拿到这个属性以后,使用.find_element_by_class_name()方法获取里面的内容。要特别注意的是,拿到shadow-root节点以后,只能通过 CSS 选择器进一步筛选里面的内容,不能用 XPath,否则会导致报错。参考资料[1]
  shadow DOM:

抓取崔庆才个人博客网站前端源码

网站优化优采云 发表了文章 • 0 个评论 • 40 次浏览 • 2022-05-23 10:36 • 来自相关话题

  抓取崔庆才个人博客网站前端源码
  微信公众号『stormsha』,后台回复『仿站工具』获取工具
  工具获取方式二:仿站小工具官网
  崔庆才博客
  从网站源码来看此博客应该是使用的wordpress框架,原站用什么写的不重要,重要的是快速使用python实现全栈开发
  2、开扒
  下载工具后,解压直接打开exe程序,按如下步骤抓取即可
  
  
  3、扒取结果
  
  4、整理
  新建一个templates文件
  把扒下的除static文件之外,其它文件中的html文件都放入templates文件中,把static文件和templates放于同级目录,结果
  
  
  5、发现什么了吗?
  django项目文件:static、templates
  把index.html打开看一下效果,完美运行
  
  6、总结:
  学习python只有两个方向是最好找工作的,python web、python爬虫,之前我也在《让每行代码产生价值》一文中提到,如果你是因为数据科学的兴起才有了学习python的想法,那你错了,你应该去学习数据科学。对于数据科学而言python只是一个工具。
  如果你没有一个好的学历背景,学习python数据科学仍然是没有什么竞争力的。学习python web和python爬虫你可以从事数据科学相关工作,比如数据可视化、数据分析、数据抓取等。
  学习python web只有具备全栈开发能力才有竞争力。只会python你就是一块砖,搬到哪里都一样,会全栈开发你就是一个设计师,其实也不需要全栈,会点python web 加 爬虫就可以搞很多有意思的事情了。如果想快速入门python全栈那基本是不现实。按我的思路来,快速学习找到一份工作问题不大。扒取网站前端的源码应该是一个学习python web开发人员必备的技能,具备了此能力你可以快速搭建起一个网站。
  学习python就应该从实际需求出发去学习。接下来我会把崔大佬的个人博客网站使用django实现。最终部署上线,一个人的精力有限,计划每天在工作之余花费四个小时左右一点点把这个项目完善,后期我会把项目放在github上,每天进步一点点。
  今天看到的一段鸡汤文:
  如何评估一个人的职业化程度?
  ①、时间感强、时间颗粒度小,最大限度地提升自己的时间价值。
  ②、能够分清事实与观点,只用实力佐证事实,而不用情绪陈述观点。
  
  长按识别二维码
  
   查看全部

  抓取崔庆才个人博客网站前端源码
  微信公众号『stormsha』,后台回复『仿站工具』获取工具
  工具获取方式二:仿站小工具官网
  崔庆才博客
  从网站源码来看此博客应该是使用的wordpress框架,原站用什么写的不重要,重要的是快速使用python实现全栈开发
  2、开扒
  下载工具后,解压直接打开exe程序,按如下步骤抓取即可
  
  
  3、扒取结果
  
  4、整理
  新建一个templates文件
  把扒下的除static文件之外,其它文件中的html文件都放入templates文件中,把static文件和templates放于同级目录,结果
  
  
  5、发现什么了吗?
  django项目文件:static、templates
  把index.html打开看一下效果,完美运行
  
  6、总结:
  学习python只有两个方向是最好找工作的,python web、python爬虫,之前我也在《让每行代码产生价值》一文中提到,如果你是因为数据科学的兴起才有了学习python的想法,那你错了,你应该去学习数据科学。对于数据科学而言python只是一个工具。
  如果你没有一个好的学历背景,学习python数据科学仍然是没有什么竞争力的。学习python web和python爬虫你可以从事数据科学相关工作,比如数据可视化、数据分析、数据抓取等。
  学习python web只有具备全栈开发能力才有竞争力。只会python你就是一块砖,搬到哪里都一样,会全栈开发你就是一个设计师,其实也不需要全栈,会点python web 加 爬虫就可以搞很多有意思的事情了。如果想快速入门python全栈那基本是不现实。按我的思路来,快速学习找到一份工作问题不大。扒取网站前端的源码应该是一个学习python web开发人员必备的技能,具备了此能力你可以快速搭建起一个网站。
  学习python就应该从实际需求出发去学习。接下来我会把崔大佬的个人博客网站使用django实现。最终部署上线,一个人的精力有限,计划每天在工作之余花费四个小时左右一点点把这个项目完善,后期我会把项目放在github上,每天进步一点点。
  今天看到的一段鸡汤文:
  如何评估一个人的职业化程度?
  ①、时间感强、时间颗粒度小,最大限度地提升自己的时间价值。
  ②、能够分清事实与观点,只用实力佐证事实,而不用情绪陈述观点。
  
  长按识别二维码
  
  

不用写代码的爬虫工具教程——推荐

网站优化优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2022-05-21 18:52 • 来自相关话题

  不用写代码的爬虫工具教程——推荐
  最近一直在写课程,网上找资料,找到一个Web Scraper 的工具教程,对于那些不想写爬虫代码又想获取信息的人来说,非常友好。
  
  不过要提醒的是,Web Scraper 是一款专注于文本爬取的爬虫工具。也就是这个工具只能爬取文本类的信息,多媒体类的图片,视频爬取不了。
  下面是博主列出的优点,缺点及简答的总结:
  Web Scraper 的优点Web Scraper 的缺点总结
  掌握了 Web Scraper 的使用,基本上可以应付学习工作中90%的数据爬取需求。相对于 python 爬虫,虽然灵活度上受到了限制,但是低廉的学习成本可以大大节省学习时间,快速解决手头的工作,提高整体的工作效率。综合来看,Web Scraper 还是非常值得去学习的。
  博主网址:
  %E7%AE%80%E6%98%93%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/
  
  互联网上总有一群默默耕耘的人,写了很多好的内容。而搜索引擎尽管非常发达,但是依然存在很大的信息差,并且会一直存在。
  看到一本书上说,搜索引擎中可检索的网址占整个互联网不过一小部分,还存在很大一部分检索不到,也叫暗网,挖掘信息的能力真的非常重要,也非常有用,这个需要一直练习。
  <p data-darkmode-bgcolor-15964675795346="rgb(25, 25, 25)" data-darkmode-original-bgcolor-15964675795346="rgb(255, 255, 255)" data-darkmode-color-15964675795346="rgb(156, 156, 156)" data-darkmode-original-color-15964675795346="rgb(74, 74, 74)" data-style="margin-bottom: 15px; max-width: 100%; box-sizing: border-box; background-color: rgb(255, 255, 255); color: rgb(74, 74, 74); min-height: 1em; letter-spacing: 0.544px; font-size: 16px; white-space: pre-line; line-height: 30px; font-family: Avenir, -apple-system-font, 微软雅黑, sans-serif; text-align: start; overflow-wrap: break-word !important;" class="js_darkmode__3" data-darkmode-bgcolor-15982707083969="rgb(25, 25, 25)" data-darkmode-original-bgcolor-15982707083969="rgb(255, 255, 255)" data-darkmode-color-15982707083969="rgb(156, 156, 156)" data-darkmode-original-color-15982707083969="rgb(74, 74, 74)" style="margin-bottom: 15px;outline: 0px;max-width: 100%;box-sizing: border-box;letter-spacing: 0.544px;font-size: 16px;color: rgb(74, 74, 74);white-space: pre-line;line-height: 30px;font-family: Avenir, -apple-system-font, 微软雅黑, sans-serif;text-align: start;overflow-wrap: break-word !important;">(全文完)
  长按二维码,加关注!叶子陪你玩
  </p> 查看全部

  不用写代码的爬虫工具教程——推荐
  最近一直在写课程,网上找资料,找到一个Web Scraper 的工具教程,对于那些不想写爬虫代码又想获取信息的人来说,非常友好。
  
  不过要提醒的是,Web Scraper 是一款专注于文本爬取的爬虫工具。也就是这个工具只能爬取文本类的信息,多媒体类的图片,视频爬取不了。
  下面是博主列出的优点,缺点及简答的总结:
  Web Scraper 的优点Web Scraper 的缺点总结
  掌握了 Web Scraper 的使用,基本上可以应付学习工作中90%的数据爬取需求。相对于 python 爬虫,虽然灵活度上受到了限制,但是低廉的学习成本可以大大节省学习时间,快速解决手头的工作,提高整体的工作效率。综合来看,Web Scraper 还是非常值得去学习的。
  博主网址:
  %E7%AE%80%E6%98%93%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/
  
  互联网上总有一群默默耕耘的人,写了很多好的内容。而搜索引擎尽管非常发达,但是依然存在很大的信息差,并且会一直存在。
  看到一本书上说,搜索引擎中可检索的网址占整个互联网不过一小部分,还存在很大一部分检索不到,也叫暗网,挖掘信息的能力真的非常重要,也非常有用,这个需要一直练习。
  <p data-darkmode-bgcolor-15964675795346="rgb(25, 25, 25)" data-darkmode-original-bgcolor-15964675795346="rgb(255, 255, 255)" data-darkmode-color-15964675795346="rgb(156, 156, 156)" data-darkmode-original-color-15964675795346="rgb(74, 74, 74)" data-style="margin-bottom: 15px; max-width: 100%; box-sizing: border-box; background-color: rgb(255, 255, 255); color: rgb(74, 74, 74); min-height: 1em; letter-spacing: 0.544px; font-size: 16px; white-space: pre-line; line-height: 30px; font-family: Avenir, -apple-system-font, 微软雅黑, sans-serif; text-align: start; overflow-wrap: break-word !important;" class="js_darkmode__3" data-darkmode-bgcolor-15982707083969="rgb(25, 25, 25)" data-darkmode-original-bgcolor-15982707083969="rgb(255, 255, 255)" data-darkmode-color-15982707083969="rgb(156, 156, 156)" data-darkmode-original-color-15982707083969="rgb(74, 74, 74)" style="margin-bottom: 15px;outline: 0px;max-width: 100%;box-sizing: border-box;letter-spacing: 0.544px;font-size: 16px;color: rgb(74, 74, 74);white-space: pre-line;line-height: 30px;font-family: Avenir, -apple-system-font, 微软雅黑, sans-serif;text-align: start;overflow-wrap: break-word !important;">(全文完)
  长按二维码,加关注!叶子陪你玩
  </p>

20行Python代码爬取网站美女图,哇太多了,看不过来了,我U盘装满了!

网站优化优采云 发表了文章 • 0 个评论 • 79 次浏览 • 2022-05-21 18:49 • 来自相关话题

  20行Python代码爬取网站美女图,哇太多了,看不过来了,我U盘装满了!
  淘女郎爬虫,可动态抓取淘女郎的信息和照片。
  
  需要额外安装的第三方库模块功能
  哦对了,先说明一下,我这里有一套Python编程入门教程,由于平台不能发资料文件,所以我把资料整理在Python编程学习群:808713721里面,大家加入就可以免费领取这套教程了
  
  原理
  淘女郎的网站使用了AJAX技术。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。这意味着通过直接抓取网页源代码然后分析出信息的方式是行不通的,因为网站是动态加载的,直接抓取的方式只能抓到网页原始的源代码,并不能抓到动态加载出的淘女郎的信息。
  
  对于这一类网站,一般有两种抓取办法:
  利用selenium库来模拟浏览器的用户行为,让服务器以为是真正的用户在浏览网页,从而获得完整的网页源代码
  利用Chrome等浏览器自带的分析工具,对网页的Network进行监控,分析出数据交换的API,从而利用API抓取到数据交换的JSON数据,从而进行抓取。
  一般来讲,第一种方法速度较慢,并且运行时占用较多的系统资源,所以,条件允许的情况下,尽量使用第二种方法。
  在Chrome浏览器中打开淘女郎: 按F12切换到开发者模式,在Network一栏选择XHR可以看到目前没有网络活动,但是,在网页中按下一页的时候,会出现一个POST活动,当再次按下下一页的时候,会再次出现一次该活动,所以,可以断定,数据交换使用的就是这个API。
  然后我们再来对比这两次请求,在Headers框的FromData栏中,可以看到两次请求的差别在currentPage的不同,一个是2,一个是3,这说明,要想得到第几页的数据,这个currentPage的值就是多少。所以我们就根据这个,来编写请求,从而得到全部淘女郎信息的JSON文件。
  
  发送请求,得到JSON数据,将其加工并转化为Python的字典类型返回
  
  连接到MongoDB, 将信息保存
  
  抽取出照片的网址,下载,保存在pic文件夹中
  
  爬完了,成果斐然啊
  
  最后,别忘了来我的Python学习QQ群:808713721,获取全套Python编程入门资料哦!
   查看全部

  20行Python代码爬取网站美女图,哇太多了,看不过来了,我U盘装满了!
  淘女郎爬虫,可动态抓取淘女郎的信息和照片。
  
  需要额外安装的第三方库模块功能
  哦对了,先说明一下,我这里有一套Python编程入门教程,由于平台不能发资料文件,所以我把资料整理在Python编程学习群:808713721里面,大家加入就可以免费领取这套教程了
  
  原理
  淘女郎的网站使用了AJAX技术。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。这意味着通过直接抓取网页源代码然后分析出信息的方式是行不通的,因为网站是动态加载的,直接抓取的方式只能抓到网页原始的源代码,并不能抓到动态加载出的淘女郎的信息。
  
  对于这一类网站,一般有两种抓取办法:
  利用selenium库来模拟浏览器的用户行为,让服务器以为是真正的用户在浏览网页,从而获得完整的网页源代码
  利用Chrome等浏览器自带的分析工具,对网页的Network进行监控,分析出数据交换的API,从而利用API抓取到数据交换的JSON数据,从而进行抓取。
  一般来讲,第一种方法速度较慢,并且运行时占用较多的系统资源,所以,条件允许的情况下,尽量使用第二种方法。
  在Chrome浏览器中打开淘女郎: 按F12切换到开发者模式,在Network一栏选择XHR可以看到目前没有网络活动,但是,在网页中按下一页的时候,会出现一个POST活动,当再次按下下一页的时候,会再次出现一次该活动,所以,可以断定,数据交换使用的就是这个API。
  然后我们再来对比这两次请求,在Headers框的FromData栏中,可以看到两次请求的差别在currentPage的不同,一个是2,一个是3,这说明,要想得到第几页的数据,这个currentPage的值就是多少。所以我们就根据这个,来编写请求,从而得到全部淘女郎信息的JSON文件。
  
  发送请求,得到JSON数据,将其加工并转化为Python的字典类型返回
  
  连接到MongoDB, 将信息保存
  
  抽取出照片的网址,下载,保存在pic文件夹中
  
  爬完了,成果斐然啊
  
  最后,别忘了来我的Python学习QQ群:808713721,获取全套Python编程入门资料哦!
  

不用写代码怎么爬数据

网站优化优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2022-05-21 18:49 • 来自相关话题

  不用写代码怎么爬数据
  今天说一个不用写代码,怎么来抓取数据的方式,这种方式能满足相当部分人群的需求。
  爬数据通常要用程序写一段网络请求代码来获取网页,遇到有些网页是异步加载或者用JS混淆了,又要耗费精力去分析。尤其是很多爬虫选手是非专业选手,写起代码其实挺吃力的,在我的了解来看大部分公司或者爬数据的需求都是一次性的,而且获取数据的量级很小,万或数十万条数据这样的规模,而且是一次性的。这可以不用去开发程序,使用一些工具就能办到,比如Web Scraper工具。
  Web Scraper
  Web Scraper是一个网页抓取工具,不需要复杂的安装配置,是以Chrome 插件的形式运行在Chrome浏览器上。不用担心抓取的网页是否异步加载或者有JS混淆之类的,是所见即所得的抓取方式,熟练情况下抓取数据只需要花10-20分钟完成配置就能开始抓取(写代码可能需要数小时乃至数天)。非常适合一次性/短期/非爬虫专业选手爬数据的需求。
  
  演示一下,比如我们要抓这个网站URL下面的商店名称和用户评论。
  如何安装和配置Web Scraper?
  1.Chrome浏览器里的插件商店里搜索Web Scraper即可安装,如果你不能访问Chrome插件商店,在公众号回复 Web Scraper ,可以在本地安装Chrome插件,怎么操作就不再赘述了。
  2.安装好Web Scraper插件后,打开Chrome浏览器的开发者工具,能看到Web Scraper选项代表安装成功。
  
  3.配置抓取规则
  配置也很简单,先科普下,我们在写程序抓取网页时,通常需要一个入口页面(这个页面通常是一个频道页,列表页之类的),程序抽取入口页面的URL,接着访问这些URL再抽取里面我们需要的详细信息。
  比如,要抽取点评网上的私房菜分类下的店名和小店里面的评论。我们首先需要一个入口页面(即 私房菜频道的URL),抽取该页面里的小店URL,程序访问这些小店URL,再抽取小店里面的店名,评论等信息。
  配置Web Scraper也是一样的道理,需要一个入口页面(Start URL),然后配置抽取入口页面的URL规则,配置好后紧接着再配置抽取详细页信息的规则。详细的Web Scraper教程可以查看原文,我在猿人学网站上写了个简单的Web Scraper配置教程。
  比如你要抓取点评网私房菜频道里的小店和点评评论。
  第一步把私房菜频道的URL当着Start URL。
  
  如果你想翻页的话,检查一下点评网的翻页规则,它的翻页是这样:
  第二页
  第三页
  就可以把翻页规则写成这样
  [0-5]
  表示从第1页翻到第5页
  第二步创建一个抽取入口页面里URL的规则,即抽取小店URL,看gif最直观:
  完全是可视化操作,Type里选择Link,Selector上选择Select,然后鼠标先选几下页面上的小店,自动把抽取小店url的xpath规则就写好了。点击Data preview可以检查和预览抽取规则是否生效。
  第三步常见抽取小店详细页信息的规则,比如抽取评论:
  熟练的话,10-20分钟就能配置好一个抓取规则,当然更复杂的数据抽取规则你可以看它官网的文档。
  使用Web Scraper这种抓取方法一次抓取上千条数据不成问题,适用想少量抓取用来数据分析,或者补充抓取数据。当然再配合使用切换代理ip软件的话,也可以做到长时间大量抓取数据用,只是效率没那么高。
  总结Web Scraper的优点:
  1.可以抓取动态加载的数据,比如通过ajax翻页的数据;
  2.抓取的数据可以CSV文件格式导出到本地;
  3.抓取需要登录的数据较方便,因为这个插件是运行在浏览器上的;
  4.不用担心JS/CSS混淆数据;
  5.配置简单,可视化配置抽取规则。 查看全部

  不用写代码怎么爬数据
  今天说一个不用写代码,怎么来抓取数据的方式,这种方式能满足相当部分人群的需求。
  爬数据通常要用程序写一段网络请求代码来获取网页,遇到有些网页是异步加载或者用JS混淆了,又要耗费精力去分析。尤其是很多爬虫选手是非专业选手,写起代码其实挺吃力的,在我的了解来看大部分公司或者爬数据的需求都是一次性的,而且获取数据的量级很小,万或数十万条数据这样的规模,而且是一次性的。这可以不用去开发程序,使用一些工具就能办到,比如Web Scraper工具。
  Web Scraper
  Web Scraper是一个网页抓取工具,不需要复杂的安装配置,是以Chrome 插件的形式运行在Chrome浏览器上。不用担心抓取的网页是否异步加载或者有JS混淆之类的,是所见即所得的抓取方式,熟练情况下抓取数据只需要花10-20分钟完成配置就能开始抓取(写代码可能需要数小时乃至数天)。非常适合一次性/短期/非爬虫专业选手爬数据的需求。
  
  演示一下,比如我们要抓这个网站URL下面的商店名称和用户评论。
  如何安装和配置Web Scraper?
  1.Chrome浏览器里的插件商店里搜索Web Scraper即可安装,如果你不能访问Chrome插件商店,在公众号回复 Web Scraper ,可以在本地安装Chrome插件,怎么操作就不再赘述了。
  2.安装好Web Scraper插件后,打开Chrome浏览器的开发者工具,能看到Web Scraper选项代表安装成功。
  
  3.配置抓取规则
  配置也很简单,先科普下,我们在写程序抓取网页时,通常需要一个入口页面(这个页面通常是一个频道页,列表页之类的),程序抽取入口页面的URL,接着访问这些URL再抽取里面我们需要的详细信息。
  比如,要抽取点评网上的私房菜分类下的店名和小店里面的评论。我们首先需要一个入口页面(即 私房菜频道的URL),抽取该页面里的小店URL,程序访问这些小店URL,再抽取小店里面的店名,评论等信息。
  配置Web Scraper也是一样的道理,需要一个入口页面(Start URL),然后配置抽取入口页面的URL规则,配置好后紧接着再配置抽取详细页信息的规则。详细的Web Scraper教程可以查看原文,我在猿人学网站上写了个简单的Web Scraper配置教程。
  比如你要抓取点评网私房菜频道里的小店和点评评论。
  第一步把私房菜频道的URL当着Start URL。
  
  如果你想翻页的话,检查一下点评网的翻页规则,它的翻页是这样:
  第二页
  第三页
  就可以把翻页规则写成这样
  [0-5]
  表示从第1页翻到第5页
  第二步创建一个抽取入口页面里URL的规则,即抽取小店URL,看gif最直观:
  完全是可视化操作,Type里选择Link,Selector上选择Select,然后鼠标先选几下页面上的小店,自动把抽取小店url的xpath规则就写好了。点击Data preview可以检查和预览抽取规则是否生效。
  第三步常见抽取小店详细页信息的规则,比如抽取评论:
  熟练的话,10-20分钟就能配置好一个抓取规则,当然更复杂的数据抽取规则你可以看它官网的文档。
  使用Web Scraper这种抓取方法一次抓取上千条数据不成问题,适用想少量抓取用来数据分析,或者补充抓取数据。当然再配合使用切换代理ip软件的话,也可以做到长时间大量抓取数据用,只是效率没那么高。
  总结Web Scraper的优点:
  1.可以抓取动态加载的数据,比如通过ajax翻页的数据;
  2.抓取的数据可以CSV文件格式导出到本地;
  3.抓取需要登录的数据较方便,因为这个插件是运行在浏览器上的;
  4.不用担心JS/CSS混淆数据;
  5.配置简单,可视化配置抽取规则。

这些Python代码技巧,你肯定还不知道

网站优化优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2022-05-21 06:00 • 来自相关话题

  这些Python代码技巧,你肯定还不知道
  它可以帮助你从大量顶级国际出版物中检索到新闻文章和相关元数据。你可以检索图像、文本和作者名。
  它还有一些内置的 NLP 功能。
  地址:#performing-nlp-on-an-article
  如果你想在下一个项目中使用 BeautifulSoup 或其它 DIY 网页抓取库,那么不如使用$ pip install newspaper3k,既省时又省事,何乐而不为呢?
  运算符重载(Operator overloading)
  Python 支持运算符重载。
  它实际上是一个简单的概念。你有没有想过为什么 Python 允许用户使用 + 运算符来将数字相加,并级联字符串?这就是运算符重载在发挥作用。
  你可以使用 Python 的标准运算符号来定义对象,这样你可以在与这些对象相关的语境中使用它们。
  class Thing:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    def __init__(self, value):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />        self.__value = value<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    def __gt__(self, other):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />        return self.__value > other.__value<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    def __lt__(self, other):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />        return self.__value  nothing<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" /># False<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />something >> file = open('file.txt', 'r')<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />>>> print(file)<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />
  这使代码 debug 变得简单很多。将字符串添加到类别定义,如下所示:
  class someClass:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    def __repr__(self):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />        return ""<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />someInstance = someClass()<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" /># prints <br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />print(someInstance)
  sh
  Python 是一种伟大的脚本语言,不过有时使用标准 os 和 subprocess 库会有点棘手。
  sh 库提供了一种不错的替代方案。
  sh 库:
  该库允许用户像使用普通函数一样调用任意程序,这对自动化工作流和任务非常有用。
  from sh import *<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.pwd()<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.mkdir('new_folder')<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.touch('new_file.txt')<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.whoami()<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.echo('This is great!')
  类型提示(Type hints)
  Python 是动态语言。在定义变量、函数、类别等时无需指定数据类型。
  这有利于缩短开发周期。但是,简单的类型错误(typing issue)导致的运行时错误真的太烦了。
  从 Python 3.5 版本开始,用户可以选择在定义函数时开启类型提示。
  def addTwo(x : Int) -> Int:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    return x + 2
  你还可以定义类型别名:
  from typing import List<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />Vector = List[float]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />Matrix = List[Vector]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />def addMatrix(a : Matrix, b : Matrix) -> Matrix:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />  result = []<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />  for i,row in enumerate(a):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    result_row =[]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    for j, col in enumerate(row):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />      result_row += [a[i][j] + b[i][j]]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    result += [result_row]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />  return result<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />x = [[1.0, 0.0], [0.0, 1.0]]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />y = [[2.0, 1.0], [0.0, -2.0]]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />z = addMatrix(x, y)
  尽管非强制,但类型注释可以使代码更易理解。
  它们还允许你在运行之前使用类型检查工具捕捉 TypeError。在进行大型复杂项目时执行此类操作是值得的。
  uuid
  生成通用唯一标识符(Universally Unique ID,UUID)的一种快速简单方法就是使用 Python 标准库的 uuid 模块。
  uuid 模块:
  import uuid<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />user_id = uuid.uuid4()<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />print(user_id)
  这创建了一个随机化后的 128 比特数字,该数字几乎必然是唯一的。
  事实上,可以生成 2¹²²可能的 UUID。这个数字超过了 5,000,000,000,000,000,000,000,000,000,000,000,000。
  在给定集合中找出重复数字的可能性极低。即使有一万亿 UUID,重复数字存在的概率也远远低于十亿分之一。
  虚拟环境(Virtual environment)
  这可能是 Python 中我最喜欢的事物了。
  你可能同时处理多个 Python 项目。不幸的是,有时候两个项目依赖于相同依赖项的不同版本。那你要安装哪个版本呢?
  幸运的是,Python 支持虚拟环境,这使得用户能够充分利用两种环境。见下列行:
  python -m venv my-project<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />source my-project/bin/activate<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />pip install all-the-modules 
  现在你在一台机器上具备独立的多个 Python 版本了。问题解决!
  wikipedia
  Wikipedia 拥有一个很棒的 API,允许用户以编程方式访问巨大体量的免费知识和信息。
  wikipedia 模块使得访问该 API 非常便捷。
  Wikipedia 模块:
  import wikipedia<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />result = wikipedia.page('freeCodeCamp')<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />print(result.summary)<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />for link in result.links:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    print(link)
  和真实的维基百科网站类似,该模块支持多种语言、页面消歧、随机页面检索,甚至还具备 donate() 方法。
  xkcd
  humour 是 Python 语言的一个关键特征,其名称来自英国喜剧片《蒙提·派森的飞行马戏团》(Monty Python and the Flying Circus)。Python 的很多官方文档引用了该喜剧片最著名的剧情。
  幽默感并不限于文档。试着运行下列行:
  import antigravity
  将打开 xkcd 画的 Python 漫画。不要改变这一点,Python。不要改变。
  YAML
  YAML 代表 『YAML Ain』t Markup Language』。它是一种数据格式语言,是 JSON 的超集。
  与 JSON 不同,它可以存储更复杂的对象并引用自己的元素。你还可以编写注释,使其尤其适用于编写配置文件。
  PyYAML 模块()可以让你在 Python 中使用 YAML。安装:
  $ pip install pyyaml
  然后导入到项目中:
  import yaml
  PyYAML 使你能够存储任何数据类型的 Python 对象,以及任何用户定义类别的实例。
  zip
  给你支最后一招,非常酷。还在用两个列表来组成一部词典吗?
  keys = ['a', 'b', 'c']<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />vals = [1, 2, 3]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />zipped = dict(zip(keys, vals))
  zip() 内置函数使用多个可迭代对象作为输入并返回元组列表。每个元组按位置索引对输入对象的元素进行分组。
  你也可以通过调用*zip() 来「解压」对象。
  
  原文链接:
   查看全部

  这些Python代码技巧,你肯定还不知道
  它可以帮助你从大量顶级国际出版物中检索到新闻文章和相关元数据。你可以检索图像、文本和作者名。
  它还有一些内置的 NLP 功能。
  地址:#performing-nlp-on-an-article
  如果你想在下一个项目中使用 BeautifulSoup 或其它 DIY 网页抓取库,那么不如使用$ pip install newspaper3k,既省时又省事,何乐而不为呢?
  运算符重载(Operator overloading)
  Python 支持运算符重载。
  它实际上是一个简单的概念。你有没有想过为什么 Python 允许用户使用 + 运算符来将数字相加,并级联字符串?这就是运算符重载在发挥作用。
  你可以使用 Python 的标准运算符号来定义对象,这样你可以在与这些对象相关的语境中使用它们。
  class Thing:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    def __init__(self, value):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />        self.__value = value<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    def __gt__(self, other):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />        return self.__value > other.__value<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    def __lt__(self, other):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />        return self.__value  nothing<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" /># False<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />something >> file = open('file.txt', 'r')<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />>>> print(file)<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />
  这使代码 debug 变得简单很多。将字符串添加到类别定义,如下所示:
  class someClass:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    def __repr__(self):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />        return ""<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />someInstance = someClass()<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" /># prints <br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />print(someInstance)
  sh
  Python 是一种伟大的脚本语言,不过有时使用标准 os 和 subprocess 库会有点棘手。
  sh 库提供了一种不错的替代方案。
  sh 库:
  该库允许用户像使用普通函数一样调用任意程序,这对自动化工作流和任务非常有用。
  from sh import *<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.pwd()<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.mkdir('new_folder')<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.touch('new_file.txt')<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.whoami()<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.echo('This is great!')
  类型提示(Type hints)
  Python 是动态语言。在定义变量、函数、类别等时无需指定数据类型。
  这有利于缩短开发周期。但是,简单的类型错误(typing issue)导致的运行时错误真的太烦了。
  从 Python 3.5 版本开始,用户可以选择在定义函数时开启类型提示。
  def addTwo(x : Int) -> Int:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    return x + 2
  你还可以定义类型别名:
  from typing import List<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />Vector = List[float]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />Matrix = List[Vector]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />def addMatrix(a : Matrix, b : Matrix) -> Matrix:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />  result = []<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />  for i,row in enumerate(a):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    result_row =[]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    for j, col in enumerate(row):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />      result_row += [a[i][j] + b[i][j]]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    result += [result_row]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />  return result<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />x = [[1.0, 0.0], [0.0, 1.0]]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />y = [[2.0, 1.0], [0.0, -2.0]]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />z = addMatrix(x, y)
  尽管非强制,但类型注释可以使代码更易理解。
  它们还允许你在运行之前使用类型检查工具捕捉 TypeError。在进行大型复杂项目时执行此类操作是值得的。
  uuid
  生成通用唯一标识符(Universally Unique ID,UUID)的一种快速简单方法就是使用 Python 标准库的 uuid 模块。
  uuid 模块:
  import uuid<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />user_id = uuid.uuid4()<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />print(user_id)
  这创建了一个随机化后的 128 比特数字,该数字几乎必然是唯一的。
  事实上,可以生成 2¹²²可能的 UUID。这个数字超过了 5,000,000,000,000,000,000,000,000,000,000,000,000。
  在给定集合中找出重复数字的可能性极低。即使有一万亿 UUID,重复数字存在的概率也远远低于十亿分之一。
  虚拟环境(Virtual environment)
  这可能是 Python 中我最喜欢的事物了。
  你可能同时处理多个 Python 项目。不幸的是,有时候两个项目依赖于相同依赖项的不同版本。那你要安装哪个版本呢?
  幸运的是,Python 支持虚拟环境,这使得用户能够充分利用两种环境。见下列行:
  python -m venv my-project<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />source my-project/bin/activate<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />pip install all-the-modules 
  现在你在一台机器上具备独立的多个 Python 版本了。问题解决!
  wikipedia
  Wikipedia 拥有一个很棒的 API,允许用户以编程方式访问巨大体量的免费知识和信息。
  wikipedia 模块使得访问该 API 非常便捷。
  Wikipedia 模块:
  import wikipedia<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />result = wikipedia.page('freeCodeCamp')<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />print(result.summary)<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />for link in result.links:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    print(link)
  和真实的维基百科网站类似,该模块支持多种语言、页面消歧、随机页面检索,甚至还具备 donate() 方法。
  xkcd
  humour 是 Python 语言的一个关键特征,其名称来自英国喜剧片《蒙提·派森的飞行马戏团》(Monty Python and the Flying Circus)。Python 的很多官方文档引用了该喜剧片最著名的剧情。
  幽默感并不限于文档。试着运行下列行:
  import antigravity
  将打开 xkcd 画的 Python 漫画。不要改变这一点,Python。不要改变。
  YAML
  YAML 代表 『YAML Ain』t Markup Language』。它是一种数据格式语言,是 JSON 的超集。
  与 JSON 不同,它可以存储更复杂的对象并引用自己的元素。你还可以编写注释,使其尤其适用于编写配置文件。
  PyYAML 模块()可以让你在 Python 中使用 YAML。安装:
  $ pip install pyyaml
  然后导入到项目中:
  import yaml
  PyYAML 使你能够存储任何数据类型的 Python 对象,以及任何用户定义类别的实例。
  zip
  给你支最后一招,非常酷。还在用两个列表来组成一部词典吗?
  keys = ['a', 'b', 'c']<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />vals = [1, 2, 3]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />zipped = dict(zip(keys, vals))
  zip() 内置函数使用多个可迭代对象作为输入并返回元组列表。每个元组按位置索引对输入对象的元素进行分组。
  你也可以通过调用*zip() 来「解压」对象。
  
  原文链接:
  

拿好这段代码,愿你求职路上不再迷茫

网站优化优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2022-05-21 05:55 • 来自相关话题

  拿好这段代码,愿你求职路上不再迷茫
  如需转载,发送「转载」二字查看说明
  涉及知识:数据库(mongodb)node.js
  建议阅读:3分钟
  经常有人问:“我是该学Angular还是React?该用gulp还是webpack…”
  这篇文章就是要 交给大家一把钥匙,专门解答这类问题。
  解答思路
  我一直提倡的是 学以致用,知行合一,所以当我们学习和储备技能的时候应该要和市场相结合,准确的说应该是人才市场。
  要了解人才市场有个非常简单的方法——招聘网站。我们上招聘网站搜一搜,看看企业在招聘的时候都有哪些技能需求就一目了然了。
  可问题就是数据那么多,如果只抽取部分做参考不够准确,一个个去看又效率太低。
  我觉得身为开发人员最大的优势就是 可以用代码等技术手段定制所需的工具。所以我们只需要写一段爬虫代码,把招聘网站上的数据“同步”到数据库,然后进行统计分析,就可以进行有的放矢地学习了。先看一下统计分析结果:
  
  动手实践
  以个人比较喜欢的某招聘网站为例。
  网页分析
  搜索“前端”,人往高处看齐,我们添加一个过滤条件“25k-50k”,看看市场对高级前端的要求。同时按下F12打开调试,发现这里发送了ajax请求(凡事有利有弊,前后端分离虽然开发效率提高了,但同时也为爬虫程序降低了难度)。
  补充一下:一般分两种情况:json数据和html页面,本文两种情况皆有涉及。
  
  通过列表我们只能知道公司和职位,点击链接跳转到详情页看到我们想要的信息:岗位职责和要求。
  
  这里没有看到ajax请求,应该是后端利用模板直接生成的静态页面,所以需要解析html,会略微麻烦一些。
  编写代码
  整个编码的思路变得很清晰了:
  1.分页查询职位列表
  用request模块发送get请求,获取json数据,然后按照id查询html。
  2.按职位查询详情并入库
  用jsdom模块对获取的html进行dom解析,这个模块很容易上手,可用jquery语法。
  将解析的数据过滤,保留岗位职责和要求信息,利用mongoose保存至数据库。
  3.从数据库中查询结果
  查询统计各技能占比。结果如开头截图所示。
  统计结果只代表了某招聘网站对高级前端的技能要求,仅供参考。 程序代码100多行,具体细节可戳
  源码地址:
  总结优化
  换个搜索关键词,换个网站都可以使用么?
  换个关键词可以,换个网站直接使用肯定不行的,首先用开发者工具找出查询数据的url,然后json数据直接处理,如果是html再解析,方法相同,只是解析的字段不同。
  明明是写个爬虫,却说是职业规划,不是标题党么?
  爬虫跟文中所提的手工统计、抽样查看方法一样,都是手段,只是更高效一些。文章的重点是利用统计分析的方法来解决“xx与yy,我该如何选择”这类问题。目标思维很重要,黑猫白猫抓到老鼠就是好猫。
  我不用数据库直接在内存中分析不是更简单么?
  这样的确能减少代码量,但是每次分析都需要重新抓取数据,效率太低而且容易被反爬虫发现,所以 建议还是将查询结果统计入库。绘图,出表格…后续想怎么玩都行~
  有没有更可靠的分析方法?
  当然有。文中所提的搜索匹配的分析方式太简单了,最理想的方式应该是 自动挑选出topN的关键词然后按占比排序。咨询了一下做大数据的朋友,可以使用 word2vec,有兴趣的读者可以试试。
  关注「前端大全」
  看更多精选前端技术文章
  ↓↓↓
  
  专栏作者简介()
  亚里士朱德:JSP工程师,多年大型国际项目开发经验。WEB前端工程师,擅长PC端以及移动端开发。js全栈工程师,熟悉node.js、mongoDB。
  
  打赏支持作者写出更多好文章,谢谢! 查看全部

  拿好这段代码,愿你求职路上不再迷茫
  如需转载,发送「转载」二字查看说明
  涉及知识:数据库(mongodb)node.js
  建议阅读:3分钟
  经常有人问:“我是该学Angular还是React?该用gulp还是webpack…”
  这篇文章就是要 交给大家一把钥匙,专门解答这类问题。
  解答思路
  我一直提倡的是 学以致用,知行合一,所以当我们学习和储备技能的时候应该要和市场相结合,准确的说应该是人才市场。
  要了解人才市场有个非常简单的方法——招聘网站。我们上招聘网站搜一搜,看看企业在招聘的时候都有哪些技能需求就一目了然了。
  可问题就是数据那么多,如果只抽取部分做参考不够准确,一个个去看又效率太低。
  我觉得身为开发人员最大的优势就是 可以用代码等技术手段定制所需的工具。所以我们只需要写一段爬虫代码,把招聘网站上的数据“同步”到数据库,然后进行统计分析,就可以进行有的放矢地学习了。先看一下统计分析结果:
  
  动手实践
  以个人比较喜欢的某招聘网站为例。
  网页分析
  搜索“前端”,人往高处看齐,我们添加一个过滤条件“25k-50k”,看看市场对高级前端的要求。同时按下F12打开调试,发现这里发送了ajax请求(凡事有利有弊,前后端分离虽然开发效率提高了,但同时也为爬虫程序降低了难度)。
  补充一下:一般分两种情况:json数据和html页面,本文两种情况皆有涉及。
  
  通过列表我们只能知道公司和职位,点击链接跳转到详情页看到我们想要的信息:岗位职责和要求。
  
  这里没有看到ajax请求,应该是后端利用模板直接生成的静态页面,所以需要解析html,会略微麻烦一些。
  编写代码
  整个编码的思路变得很清晰了:
  1.分页查询职位列表
  用request模块发送get请求,获取json数据,然后按照id查询html。
  2.按职位查询详情并入库
  用jsdom模块对获取的html进行dom解析,这个模块很容易上手,可用jquery语法。
  将解析的数据过滤,保留岗位职责和要求信息,利用mongoose保存至数据库。
  3.从数据库中查询结果
  查询统计各技能占比。结果如开头截图所示。
  统计结果只代表了某招聘网站对高级前端的技能要求,仅供参考。 程序代码100多行,具体细节可戳
  源码地址:
  总结优化
  换个搜索关键词,换个网站都可以使用么?
  换个关键词可以,换个网站直接使用肯定不行的,首先用开发者工具找出查询数据的url,然后json数据直接处理,如果是html再解析,方法相同,只是解析的字段不同。
  明明是写个爬虫,却说是职业规划,不是标题党么?
  爬虫跟文中所提的手工统计、抽样查看方法一样,都是手段,只是更高效一些。文章的重点是利用统计分析的方法来解决“xx与yy,我该如何选择”这类问题。目标思维很重要,黑猫白猫抓到老鼠就是好猫。
  我不用数据库直接在内存中分析不是更简单么?
  这样的确能减少代码量,但是每次分析都需要重新抓取数据,效率太低而且容易被反爬虫发现,所以 建议还是将查询结果统计入库。绘图,出表格…后续想怎么玩都行~
  有没有更可靠的分析方法?
  当然有。文中所提的搜索匹配的分析方式太简单了,最理想的方式应该是 自动挑选出topN的关键词然后按占比排序。咨询了一下做大数据的朋友,可以使用 word2vec,有兴趣的读者可以试试。
  关注「前端大全」
  看更多精选前端技术文章
  ↓↓↓
  
  专栏作者简介()
  亚里士朱德:JSP工程师,多年大型国际项目开发经验。WEB前端工程师,擅长PC端以及移动端开发。js全栈工程师,熟悉node.js、mongoDB。
  
  打赏支持作者写出更多好文章,谢谢!

20个编写现代CSS代码的建议

网站优化优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2022-05-21 05:54 • 来自相关话题

  20个编写现代CSS代码的建议
  的背景图而不是直接使用img标签。基于这种方式配合上background-size与background-position这两个属性,可以很方便地按比例缩放:
  img {
   width: 300px;
   height: 200px;
}
div {
   width: 300px;
   height: 200px;
   background: url('http://cdn.tutorialzine.com/wp-content/uploads/2016/08/bicycle.jpg');
   background-position: center center;
   background-size: cover;
}
section{
   float: left;
   margin: 15px;
}
  不过这种方式也是存在缺陷的,譬如你无法设置图片的懒加载、图片无法被搜索引擎或者其他类似的工具抓取到,有个不错的属性叫object-fit可以解决这个问题,不过该属性目前的浏览器支持并不是很完善。
  Better Table Borders
  HTML中使用Tables进行布局一直是个很头疼的问题,它们使用起来很简单,但是无法进行响应式操作,并且也不方便进行全局样式设置。譬如,如果你打算为Table的边与单元的边添加样式,可能得到的结果如下:
  table {
   width: 600px;
   border: 1px solid #505050;
   margin-bottom: 15px;
   color:#505050;
}
td{
   border: 1px solid #505050;
   padding: 10px;
}
  
  这里存在的问题是出现了很多的重复的边,会导致视觉上不协调的情况,那么我们可以通过设置border-collapse:collapse来进行处理:
  
  注释格式优化
  CSS虽然谈不上一门编程语言但是其仍然需要添加注释以保障整体代码的可读性,只要添加些简单的注释不仅可以方便你更好地组织整个样式表还能够让你的同事或者未来的自己更好地理解。对于CSS中整块的注释或者使用在Media-Query中的注释,建议是使用如下形式:
  /*---------------
   #Header
---------------*/header { }header nav { }/*---------------
   #Slideshow
---------------*/.slideshow { }
  而设计的细节说明或者一些不重要的组件可以用如下单行注释的方式:
  /*   Footer Buttons   */
.footer button { }
.footer button:hover { }
  同时,不要忘了CSS中是没有//这种注释方式的:
  /*  Do  */p {
   padding: 15px;
   /*border: 1px solid #222;*/
}/*  Don't  */p {
   padding: 15px;
   // border: 1px solid #222;  
}
  使用Kebab-case命名变量
  对于样式类名或者ID名的命名都需要在多个单词之间添加-符号,CSS本身是大小写不敏感的因此你是用不了camelCase的,另一方面,很久之前也不支持下划线,所以现在的默认的命名方式就是使用-:
  /*  Do     */
.footer-column-left { }
/*  Don't  */
.footerColumnLeft { }
.footer_column_left { }
  而涉及到具体的变量命名规范时,建议是使用BEM规范,只要遵循一些简单的原则即可以保证基于组件风格的命名一致性。你也可以参考CSS Tricks来获得更多的细节描述。
  避免重复代码
  大部分元素的CSS属性都是从DOM树根部继承而来,这也是其命名为级联样式表的由来。我们以font属性为例,该属性往往是继承自父属性,因此我们并不需要再单独地为元素设置该属性。我们只需要在html或者body中添加该属性然后使其层次传递下去即可:
  html {
   font: normal 16px/1.4 sans-serif;
}
  使用transform添加CSS Animations
  不建议直接改变元素的width与height属性或者left/top/bottom/right这些属性来达到动画效果,而应该优先使用transform()属性来提供更平滑的变换效果,并且能使得代码的可读性会更好:
  .ball {
   left: 50px;
   transition: 0.4s ease-out;
}/* Not Cool*/.ball.slide-out {
   left: 500px;
}/* Cool*/.ball.slide-out {
   transform: translateX(450px);
}
  Transform的几个属性translate、rotate、scale都具有比较好的浏览器兼容性可以放心使用。
  不要重复造轮子
  现在CSS社区已经非常庞大,并且不断地有新的各式各样的库开源出来。这些库可以帮助我们解决从小的代码片到用于构建完整的响应式应用的全框架。所以如果下次你再碰到什么CSS问题的时候,在打算撸起袖子自己上之前可以尝试在GitHUB或者CodePen上搜索可行方案。
  尽可能使用低优先级的选择器
  并不是所有的CSS选择器的优先级都一样,很多初学者在使用CSS选择器的时候都是考虑以新的特性去复写全部的继承特性,不过这一点在某个元素多状态时就麻烦了,譬如下面这个例子:
  a{
   color: #fff;
   padding: 15px;
}
a#blue-btn {
   background-color: blue;
}
a.active {
   background-color: red;
}
  我们本来希望将.active类添加到按钮上然后使其显示为红色,不过在上面这个例子中很明显起不了作用,因为button已经以ID选择器设置过了背景色,也就是所谓的Higher Selector Specificity。一般来说,选择器的优先级顺序为:ID(#id) > Class(.class) > Type(header)
  避免使用!important
  认真的说,千万要避免使用!important,这可能会导致你在未来的开发中无尽的属性重写,你应该选择更合适的CSS选择器。而唯一的可以使用!important属性的场景就是当你想去复写某些行内样式的时候,不过行内样式本身也是需要避免的。
  使用text-transform属性设置文本大写
  Star Wars: The Force Awakens
.movie-poster {
   text-transform: uppercase;
}
  Em, Rem, 以及 Pixel
  已经有很多关于人们应该如何使用em,rem,以及px作为元素尺寸与文本尺寸的讨论,而笔者认为,这三个尺寸单位都有其适用与不适用的地方。不同的开发与项目都有其特定的设置,因此并没有通用的规则来决定应该使用哪个单位,这里是我总结的几个考虑:
  在大型项目中使用预处理器
  估计你肯定听说过 Sass, Less, PostCSS, Stylus这些预处理器与对应的语法。Preprocessors可以允许我们将未来的CSS特性应用在当前的代码开发中,譬如变量支持、函数、嵌套式的选择器以及很多其他的特性,这里我们以Sass为例:
  $accent-color: #2196F3;
a {
   padding: 10px 15px;
   background-color: $accent-color;
}
a:hover {
   background-color: darken($accent-color,10%);
}
  使用Autoprefixers来提升浏览器兼容性
  使用特定的浏览器前缀是CSS开发中常见的工作之一,不同的浏览器、不同的属性对于前缀的要求也不一样,这就使得我们无法在编码过程中记住所有的前缀规则。并且在写样式代码的时候还需要加上特定的浏览器前缀支持也是个麻烦活,幸亏现在也是有很多工具可以辅助我们进行这样的开发:
  在生产环境下使用Minified代码
  为了提升页面的加载速度,在生产环境下我们应该默认使用压缩之后的资源代码。在压缩的过程中,会将所有的空白与重复剔除掉从而减少整个文件的体积大小。当然,经过压缩之后的代码毫无可读性,因此在开发阶段我们还是应该使用普通的版本。对于CSS的压缩有很多的现行工具:
  选择哪个工具肯定是依赖于你自己的工作流啦~
  多参阅Caniuse
  不同的浏览器在兼容性上差异很大,因此如果我们可以针对我们所需要适配的浏览器,在caniuse上我们可以查询某个特性的浏览器版本适配性,是否需要添加特定的前缀或者在某个平台上是否存在Bug等等。不过光光使用caniuse肯定是不够的,我们还需要使用些额外的服务来进行检测。
  Validate:校验
  对于CSS的校验可能不如HTML校验或者JavaScript校验那么重要,不过在正式发布之前用Lint工具校验一波你的CSS代码还是很有意义的。它会告诉你代码中潜在的错误,提示你一些不符合最佳实践的代码以及给你一些提升代码性能的建议。就像Minifers与Autoprefixers,也有很多可用的工具:
  原文:
  译文:
   查看全部

  20个编写现代CSS代码的建议
  的背景图而不是直接使用img标签。基于这种方式配合上background-size与background-position这两个属性,可以很方便地按比例缩放:
  img {
   width: 300px;
   height: 200px;
}
div {
   width: 300px;
   height: 200px;
   background: url('http://cdn.tutorialzine.com/wp-content/uploads/2016/08/bicycle.jpg');
   background-position: center center;
   background-size: cover;
}
section{
   float: left;
   margin: 15px;
}
  不过这种方式也是存在缺陷的,譬如你无法设置图片的懒加载、图片无法被搜索引擎或者其他类似的工具抓取到,有个不错的属性叫object-fit可以解决这个问题,不过该属性目前的浏览器支持并不是很完善。
  Better Table Borders
  HTML中使用Tables进行布局一直是个很头疼的问题,它们使用起来很简单,但是无法进行响应式操作,并且也不方便进行全局样式设置。譬如,如果你打算为Table的边与单元的边添加样式,可能得到的结果如下:
  table {
   width: 600px;
   border: 1px solid #505050;
   margin-bottom: 15px;
   color:#505050;
}
td{
   border: 1px solid #505050;
   padding: 10px;
}
  
  这里存在的问题是出现了很多的重复的边,会导致视觉上不协调的情况,那么我们可以通过设置border-collapse:collapse来进行处理:
  
  注释格式优化
  CSS虽然谈不上一门编程语言但是其仍然需要添加注释以保障整体代码的可读性,只要添加些简单的注释不仅可以方便你更好地组织整个样式表还能够让你的同事或者未来的自己更好地理解。对于CSS中整块的注释或者使用在Media-Query中的注释,建议是使用如下形式:
  /*---------------
   #Header
---------------*/header { }header nav { }/*---------------
   #Slideshow
---------------*/.slideshow { }
  而设计的细节说明或者一些不重要的组件可以用如下单行注释的方式:
  /*   Footer Buttons   */
.footer button { }
.footer button:hover { }
  同时,不要忘了CSS中是没有//这种注释方式的:
  /*  Do  */p {
   padding: 15px;
   /*border: 1px solid #222;*/
}/*  Don't  */p {
   padding: 15px;
   // border: 1px solid #222;  
}
  使用Kebab-case命名变量
  对于样式类名或者ID名的命名都需要在多个单词之间添加-符号,CSS本身是大小写不敏感的因此你是用不了camelCase的,另一方面,很久之前也不支持下划线,所以现在的默认的命名方式就是使用-:
  /*  Do     */
.footer-column-left { }
/*  Don't  */
.footerColumnLeft { }
.footer_column_left { }
  而涉及到具体的变量命名规范时,建议是使用BEM规范,只要遵循一些简单的原则即可以保证基于组件风格的命名一致性。你也可以参考CSS Tricks来获得更多的细节描述。
  避免重复代码
  大部分元素的CSS属性都是从DOM树根部继承而来,这也是其命名为级联样式表的由来。我们以font属性为例,该属性往往是继承自父属性,因此我们并不需要再单独地为元素设置该属性。我们只需要在html或者body中添加该属性然后使其层次传递下去即可:
  html {
   font: normal 16px/1.4 sans-serif;
}
  使用transform添加CSS Animations
  不建议直接改变元素的width与height属性或者left/top/bottom/right这些属性来达到动画效果,而应该优先使用transform()属性来提供更平滑的变换效果,并且能使得代码的可读性会更好:
  .ball {
   left: 50px;
   transition: 0.4s ease-out;
}/* Not Cool*/.ball.slide-out {
   left: 500px;
}/* Cool*/.ball.slide-out {
   transform: translateX(450px);
}
  Transform的几个属性translate、rotate、scale都具有比较好的浏览器兼容性可以放心使用。
  不要重复造轮子
  现在CSS社区已经非常庞大,并且不断地有新的各式各样的库开源出来。这些库可以帮助我们解决从小的代码片到用于构建完整的响应式应用的全框架。所以如果下次你再碰到什么CSS问题的时候,在打算撸起袖子自己上之前可以尝试在GitHUB或者CodePen上搜索可行方案。
  尽可能使用低优先级的选择器
  并不是所有的CSS选择器的优先级都一样,很多初学者在使用CSS选择器的时候都是考虑以新的特性去复写全部的继承特性,不过这一点在某个元素多状态时就麻烦了,譬如下面这个例子:
  a{
   color: #fff;
   padding: 15px;
}
a#blue-btn {
   background-color: blue;
}
a.active {
   background-color: red;
}
  我们本来希望将.active类添加到按钮上然后使其显示为红色,不过在上面这个例子中很明显起不了作用,因为button已经以ID选择器设置过了背景色,也就是所谓的Higher Selector Specificity。一般来说,选择器的优先级顺序为:ID(#id) > Class(.class) > Type(header)
  避免使用!important
  认真的说,千万要避免使用!important,这可能会导致你在未来的开发中无尽的属性重写,你应该选择更合适的CSS选择器。而唯一的可以使用!important属性的场景就是当你想去复写某些行内样式的时候,不过行内样式本身也是需要避免的。
  使用text-transform属性设置文本大写
  Star Wars: The Force Awakens
.movie-poster {
   text-transform: uppercase;
}
  Em, Rem, 以及 Pixel
  已经有很多关于人们应该如何使用em,rem,以及px作为元素尺寸与文本尺寸的讨论,而笔者认为,这三个尺寸单位都有其适用与不适用的地方。不同的开发与项目都有其特定的设置,因此并没有通用的规则来决定应该使用哪个单位,这里是我总结的几个考虑:
  在大型项目中使用预处理器
  估计你肯定听说过 Sass, Less, PostCSS, Stylus这些预处理器与对应的语法。Preprocessors可以允许我们将未来的CSS特性应用在当前的代码开发中,譬如变量支持、函数、嵌套式的选择器以及很多其他的特性,这里我们以Sass为例:
  $accent-color: #2196F3;
a {
   padding: 10px 15px;
   background-color: $accent-color;
}
a:hover {
   background-color: darken($accent-color,10%);
}
  使用Autoprefixers来提升浏览器兼容性
  使用特定的浏览器前缀是CSS开发中常见的工作之一,不同的浏览器、不同的属性对于前缀的要求也不一样,这就使得我们无法在编码过程中记住所有的前缀规则。并且在写样式代码的时候还需要加上特定的浏览器前缀支持也是个麻烦活,幸亏现在也是有很多工具可以辅助我们进行这样的开发:
  在生产环境下使用Minified代码
  为了提升页面的加载速度,在生产环境下我们应该默认使用压缩之后的资源代码。在压缩的过程中,会将所有的空白与重复剔除掉从而减少整个文件的体积大小。当然,经过压缩之后的代码毫无可读性,因此在开发阶段我们还是应该使用普通的版本。对于CSS的压缩有很多的现行工具:
  选择哪个工具肯定是依赖于你自己的工作流啦~
  多参阅Caniuse
  不同的浏览器在兼容性上差异很大,因此如果我们可以针对我们所需要适配的浏览器,在caniuse上我们可以查询某个特性的浏览器版本适配性,是否需要添加特定的前缀或者在某个平台上是否存在Bug等等。不过光光使用caniuse肯定是不够的,我们还需要使用些额外的服务来进行检测。
  Validate:校验
  对于CSS的校验可能不如HTML校验或者JavaScript校验那么重要,不过在正式发布之前用Lint工具校验一波你的CSS代码还是很有意义的。它会告诉你代码中潜在的错误,提示你一些不符合最佳实践的代码以及给你一些提升代码性能的建议。就像Minifers与Autoprefixers,也有很多可用的工具:
  原文:
  译文:
  

7 款从 HTML 文档提取文本的工具

网站优化优采云 发表了文章 • 0 个评论 • 704 次浏览 • 2022-05-15 01:35 • 来自相关话题

  7 款从 HTML 文档提取文本的工具
  
  来自:Dzone
  编译:局长
  下面的工具包括了由为初学者和小项目而设计的非常简单的工具到需要一定的编码知识,旨在用于更大,更困难的任务的高级工具。
  
  收集电子邮件地址、竞争分析、网站检查、定价分析和客户数据收集 — 这些可能只是你需要从 HTML 文档中提取文本和其他数据的几个原因。不幸的是,手动做这种事是很痛苦的而且效率很低,在某些情况下甚至不可能实现。幸运的是,现在有各种各样的工具可以实现这些需求。下面的 7 个工具包括了由为初学者和小项目而设计的非常简单的工具到需要一定的编码知识,旨在用于更大,更困难的任务的高级工具。
  Iconico HTML 文本提取器 (Iconico HTML Text Extractor)
  试想一下,你正在浏览竞争对手的网站,然后想提取出文本内容,又或是想看看页面背后的 HTML 代码。但十分不幸,你发现右键被禁用了,复制和粘贴也是如此。现在许多 Web 开发人员正在采取措施禁用查看源代码,否则锁定其页面。幸运的是,Iconico 有一个 HTML 文本提取器,你可以用来绕过所有的这些限制,而且这个产品非常易于使用。你可以高亮和复制文本,提取功能的运行使用轻易得像上网一样。
  UiPath
  UIPath 有一套自动化过程工具,里面包含了一个 Web 内容抓取实用程序。要使用该工具,并获得所需的几乎任何数据十分简单 — 只需打开页面,转到工具中的设计菜单,然后单击“网络抓取(web scraping)”。 除了网络抓取工具,屏幕抓取工具允许您从网页中拉取任何内容。 使用这两种工具意味着您可以从任何网页抓取文本,表格数据和其他相关信息。
  Mozenda
  Mozenda 允许用户提取 Web数据,并将该信息导出到各种智能商务工具。它不仅可以提取文本内容,还可以从 PDF 文件中提取出图像,文件和内容。然后,你可以将这些数据导出到 XML 文件,CSV 文件,JSON 或者可以选择使用 API。 提取和导出数据后,就可以使用 BI 工具进行分析和报告。
  HTMLtoText
  这款在线工具可以从 HTML 源代码中提取文本,甚至只是一个 URL 也可以。你所需要做的只是复制和粘贴,提供一个 URL 或者上传文件。 单击选项按钮,让工具知道你需要的输出格式和一些其他的细节,然后点击转换,你将获得你需要的文本信息。
  (还有一个类似的工具 —)
  Octoparse
  Octoparse的特征是它提供的是“点击”用户界面。即便是没有过编码知识的用户也可以从网站提取数据并将其发送到各种文件格式。这个工具包括从页面中提取电子邮件地址,从招聘板上提取职位列表等功能。该工具适用于动态和静态网页以及云采集(配置好采集任务关机也能采集数据)。它提供了一个免费版本,对于大多数使用场景应该足够应付,而付费版本则有更多丰富的功能。
  如果你是为了进行竞争分析而抓取网站,可能会因为此活动而被禁止。因为 Octoparse 包含一个循环识别你的 IP 地址的功能,并能通过你的 IP 禁止你使用。
  Scrapy
  这个免费的开源工具使用网络爬虫从网站提取信息,使用这个工具需要一些高级技能和编码知识。但如果你愿意以你的方式去学习使用它,Scrapy 是抓取大型 Web 项目的理想选择。该工具已被 CareerBuilder 和其他主要品牌使用。因为它是一个开源工具,所以这为用户提供了很多良好的社区支持。
  Kimono
  Kimono 是一个免费的工具,从网页获取非结构化数据,并将该信息提取为具有 XML 文件的结构化格式。该工具可以交互使用,也可以创建计划作业以在特定时间提取你需要的数据。你可以从搜索引擎结果、网页、甚至幻灯片演示中提取数据。最重要的是,当你设置好每个工作流时,Kimono 会创建一个 API。这意味着当你返回到网站以提取更多数据时,不必再重新造轮子。
  结论
  如果你遇到需要从一个或多个网页中提取非结构化数据的任务,那么此列表中至少有一个工具应该包含你需要的解决方案。而且无论你的期望价格是什么,你都应该能找到你所需要的工具。了解清楚然后决定哪个是最适合你的。要知道,大数据在企业蓬勃发展中的重要性,并且收集所需信息的能力对于你来说也是至关重要。
   查看全部

  7 款从 HTML 文档提取文本的工具
  
  来自:Dzone
  编译:局长
  下面的工具包括了由为初学者和小项目而设计的非常简单的工具到需要一定的编码知识,旨在用于更大,更困难的任务的高级工具。
  
  收集电子邮件地址、竞争分析、网站检查、定价分析和客户数据收集 — 这些可能只是你需要从 HTML 文档中提取文本和其他数据的几个原因。不幸的是,手动做这种事是很痛苦的而且效率很低,在某些情况下甚至不可能实现。幸运的是,现在有各种各样的工具可以实现这些需求。下面的 7 个工具包括了由为初学者和小项目而设计的非常简单的工具到需要一定的编码知识,旨在用于更大,更困难的任务的高级工具。
  Iconico HTML 文本提取器 (Iconico HTML Text Extractor)
  试想一下,你正在浏览竞争对手的网站,然后想提取出文本内容,又或是想看看页面背后的 HTML 代码。但十分不幸,你发现右键被禁用了,复制和粘贴也是如此。现在许多 Web 开发人员正在采取措施禁用查看源代码,否则锁定其页面。幸运的是,Iconico 有一个 HTML 文本提取器,你可以用来绕过所有的这些限制,而且这个产品非常易于使用。你可以高亮和复制文本,提取功能的运行使用轻易得像上网一样。
  UiPath
  UIPath 有一套自动化过程工具,里面包含了一个 Web 内容抓取实用程序。要使用该工具,并获得所需的几乎任何数据十分简单 — 只需打开页面,转到工具中的设计菜单,然后单击“网络抓取(web scraping)”。 除了网络抓取工具,屏幕抓取工具允许您从网页中拉取任何内容。 使用这两种工具意味着您可以从任何网页抓取文本,表格数据和其他相关信息。
  Mozenda
  Mozenda 允许用户提取 Web数据,并将该信息导出到各种智能商务工具。它不仅可以提取文本内容,还可以从 PDF 文件中提取出图像,文件和内容。然后,你可以将这些数据导出到 XML 文件,CSV 文件,JSON 或者可以选择使用 API。 提取和导出数据后,就可以使用 BI 工具进行分析和报告。
  HTMLtoText
  这款在线工具可以从 HTML 源代码中提取文本,甚至只是一个 URL 也可以。你所需要做的只是复制和粘贴,提供一个 URL 或者上传文件。 单击选项按钮,让工具知道你需要的输出格式和一些其他的细节,然后点击转换,你将获得你需要的文本信息。
  (还有一个类似的工具 —)
  Octoparse
  Octoparse的特征是它提供的是“点击”用户界面。即便是没有过编码知识的用户也可以从网站提取数据并将其发送到各种文件格式。这个工具包括从页面中提取电子邮件地址,从招聘板上提取职位列表等功能。该工具适用于动态和静态网页以及云采集(配置好采集任务关机也能采集数据)。它提供了一个免费版本,对于大多数使用场景应该足够应付,而付费版本则有更多丰富的功能。
  如果你是为了进行竞争分析而抓取网站,可能会因为此活动而被禁止。因为 Octoparse 包含一个循环识别你的 IP 地址的功能,并能通过你的 IP 禁止你使用。
  Scrapy
  这个免费的开源工具使用网络爬虫从网站提取信息,使用这个工具需要一些高级技能和编码知识。但如果你愿意以你的方式去学习使用它,Scrapy 是抓取大型 Web 项目的理想选择。该工具已被 CareerBuilder 和其他主要品牌使用。因为它是一个开源工具,所以这为用户提供了很多良好的社区支持。
  Kimono
  Kimono 是一个免费的工具,从网页获取非结构化数据,并将该信息提取为具有 XML 文件的结构化格式。该工具可以交互使用,也可以创建计划作业以在特定时间提取你需要的数据。你可以从搜索引擎结果、网页、甚至幻灯片演示中提取数据。最重要的是,当你设置好每个工作流时,Kimono 会创建一个 API。这意味着当你返回到网站以提取更多数据时,不必再重新造轮子。
  结论
  如果你遇到需要从一个或多个网页中提取非结构化数据的任务,那么此列表中至少有一个工具应该包含你需要的解决方案。而且无论你的期望价格是什么,你都应该能找到你所需要的工具。了解清楚然后决定哪个是最适合你的。要知道,大数据在企业蓬勃发展中的重要性,并且收集所需信息的能力对于你来说也是至关重要。
  

手把手 | 范例+代码:一文带你上手Python网页抓取神器BeautifulS

网站优化优采云 发表了文章 • 0 个评论 • 98 次浏览 • 2022-05-15 01:23 • 来自相关话题

  手把手 | 范例+代码:一文带你上手Python网页抓取神器BeautifulS
  代码段落并提取相应值
  name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})
  在我们得到标签之后,我们可以用name_box的text属性获取相应值
  name = name_box.text.strip() # strip() 函数用于去除前后空格
  print name
  采用相似的方法,我们可以得到股指价格数据。
  # 获取股指价格数据
  price_box = soup.find(‘div’, attrs={‘class’:’price’})
  price = price_box.text
  print price
  
  当你运行程序时,应该可以看到程序输出当前的标普500指数的价格。
  导出Excel CSV格式数据
  我们已经学会如何获取数据,现在来学习如何存储数据了。Excel逗号隔开的数据格式(CSV)不失为一个好选择。这样我们就可以在Excel中打开数据文件进行查看和进一步处理。
  在此之前,我们需要导入Python的csv模块和datetime模块。Datetime模块用于获取数据记录时间。请将下面几行代码插入您的导入代码部分。
  import csv
  from datetime import datetime
  在您代码的最下方,加上把数据写入CSV文件的代码。
  # 以“添加”模式打开一个csv文件, 以保证文件原有信息不被覆盖
  with open(‘index.csv’, ‘a’) as csv_file:
  writer = csv.writer(csv_file)
  writer.writerow([name, price, datetime.now()])
  
  现在如果运行程序,您应该可以导出一个index.csv文件。您可以在Excel中打开文件,看到里面有如图所示的一行数据。
  所以如果您每天都运行这个程序,您就可以很简单的获取标准普尔指数价格,不需要像之前一样在网站上翻找。
  更进一步(高级用法)
  多个股指
  抓取一个股指信息对您来说不够,对吗?我们可以试试同时提取多个股指信息。首先,我们需要修改quote_page,把它定义为网址的数组。
  quote_page = [‘:IND', ‘:IND']
  然后我们把数据提取部分代码改成一个for循环。这个循环可以一一处理网址,并以元组(tuple)类型把所有数据存入变量data.
  # for 循环
  data = []
  for pg in quote_page:
  # 检索网站并返回HTML代码,存入变量‘page’
  page = urllib2.urlopen(pg)
  # 用 beautifulSoup 解析HTML代码并存入变量 `soup`
  soup = BeautifulSoup(page, ‘html.parser’)
  # 获取“名称”类的
  代码段落并提取相应值
  name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})
  name = name_box.text.strip() # strip() is used to remove starting and trailing
  # 获取股指价格数据
  price_box = soup.find(‘div’, attrs={‘class’:’price’})
  price = price_box.text
  # 用元组类型存储数据
  data.append((name, price))
  并且,修改保存部分以便一行行保存数据
  # 以“添加”模式打开一个csv文件, 以保证文件原有信息不被覆盖
  with open(‘index.csv’, ‘a’) as csv_file:
  writer = csv.writer(csv_file)
  # for 循环
  for name, price in data:
  writer.writerow([name, price, datetime.now()])
  重新运行程序,您应该可以同时提取两个股指价格信息了!
  高级抓取技术
  BeautifulSoup 库使用简单,能很好的完成小量的网站抓取。但是如果您对大量的抓取信息感兴趣,您可以考虑其他方法:
  1. 强大的Python数据抓取框架Scrapy。
  2. 您可以试试把一些公共应用程序接口(Application programming interface, API) 整合入您的代码。这个获取数据的方法远比网页抓取高效。举个例子来说,您可以试试Facebook Graph API,这个应用程序接口可以帮助您获取脸书网站上不显示的隐藏信息。
  3. 如果数据量过大,您可以考虑使用类似MySQL的数据库后端来存储数据。
  采取“别重复”方法
  
  DRY是“别重复你做过的事”的英文简写。您可以尝试像链接中的这个人一样把日常的工作自动化。同时您还可以考虑其他有趣的项目,比如说掌握您的脸书好友的上线时间(当然在征得他们同意的情况下),或者获取某个论坛的讲座主题列表来尝试自然语言处理(这是目前人工智能的热门话题)!
  原文链接:
  2017年7月《顶级数据团队建设全景报告》下载
  
  <p style="margin-top: -1.4em; margin-bottom: 15px; max-width: 100%; min-height: 1em; border: none; line-height: 1.75em; box-sizing: border-box !important; word-wrap: break-word !important;">关于转载
  如需转载,请在开篇显著位置注明作者和出处(转自:大数据文摘 | bigdatadigest),并在文章结尾放置大数据文摘醒目二维码。无原创标识文章请按照转载要求编辑,可直接转载,转载后请将转载链接发送给我们;有原创标识文章,请发送【文章名称-待授权公众号名称及ID】给我们申请白名单授权。未经许可的转载以及改编者,我们将依法追究其法律责任。联系邮箱:zz@bigdatadigest.cn。</p>
  志愿者介绍 查看全部

  手把手 | 范例+代码:一文带你上手Python网页抓取神器BeautifulS
  代码段落并提取相应值
  name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})
  在我们得到标签之后,我们可以用name_box的text属性获取相应值
  name = name_box.text.strip() # strip() 函数用于去除前后空格
  print name
  采用相似的方法,我们可以得到股指价格数据。
  # 获取股指价格数据
  price_box = soup.find(‘div’, attrs={‘class’:’price’})
  price = price_box.text
  print price
  
  当你运行程序时,应该可以看到程序输出当前的标普500指数的价格。
  导出Excel CSV格式数据
  我们已经学会如何获取数据,现在来学习如何存储数据了。Excel逗号隔开的数据格式(CSV)不失为一个好选择。这样我们就可以在Excel中打开数据文件进行查看和进一步处理。
  在此之前,我们需要导入Python的csv模块和datetime模块。Datetime模块用于获取数据记录时间。请将下面几行代码插入您的导入代码部分。
  import csv
  from datetime import datetime
  在您代码的最下方,加上把数据写入CSV文件的代码。
  # 以“添加”模式打开一个csv文件, 以保证文件原有信息不被覆盖
  with open(‘index.csv’, ‘a’) as csv_file:
  writer = csv.writer(csv_file)
  writer.writerow([name, price, datetime.now()])
  
  现在如果运行程序,您应该可以导出一个index.csv文件。您可以在Excel中打开文件,看到里面有如图所示的一行数据。
  所以如果您每天都运行这个程序,您就可以很简单的获取标准普尔指数价格,不需要像之前一样在网站上翻找。
  更进一步(高级用法)
  多个股指
  抓取一个股指信息对您来说不够,对吗?我们可以试试同时提取多个股指信息。首先,我们需要修改quote_page,把它定义为网址的数组。
  quote_page = [‘:IND', ‘:IND']
  然后我们把数据提取部分代码改成一个for循环。这个循环可以一一处理网址,并以元组(tuple)类型把所有数据存入变量data.
  # for 循环
  data = []
  for pg in quote_page:
  # 检索网站并返回HTML代码,存入变量‘page’
  page = urllib2.urlopen(pg)
  # 用 beautifulSoup 解析HTML代码并存入变量 `soup`
  soup = BeautifulSoup(page, ‘html.parser’)
  # 获取“名称”类的
  代码段落并提取相应值
  name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})
  name = name_box.text.strip() # strip() is used to remove starting and trailing
  # 获取股指价格数据
  price_box = soup.find(‘div’, attrs={‘class’:’price’})
  price = price_box.text
  # 用元组类型存储数据
  data.append((name, price))
  并且,修改保存部分以便一行行保存数据
  # 以“添加”模式打开一个csv文件, 以保证文件原有信息不被覆盖
  with open(‘index.csv’, ‘a’) as csv_file:
  writer = csv.writer(csv_file)
  # for 循环
  for name, price in data:
  writer.writerow([name, price, datetime.now()])
  重新运行程序,您应该可以同时提取两个股指价格信息了!
  高级抓取技术
  BeautifulSoup 库使用简单,能很好的完成小量的网站抓取。但是如果您对大量的抓取信息感兴趣,您可以考虑其他方法:
  1. 强大的Python数据抓取框架Scrapy。
  2. 您可以试试把一些公共应用程序接口(Application programming interface, API) 整合入您的代码。这个获取数据的方法远比网页抓取高效。举个例子来说,您可以试试Facebook Graph API,这个应用程序接口可以帮助您获取脸书网站上不显示的隐藏信息。
  3. 如果数据量过大,您可以考虑使用类似MySQL的数据库后端来存储数据。
  采取“别重复”方法
  
  DRY是“别重复你做过的事”的英文简写。您可以尝试像链接中的这个人一样把日常的工作自动化。同时您还可以考虑其他有趣的项目,比如说掌握您的脸书好友的上线时间(当然在征得他们同意的情况下),或者获取某个论坛的讲座主题列表来尝试自然语言处理(这是目前人工智能的热门话题)!
  原文链接:
  2017年7月《顶级数据团队建设全景报告》下载
  
  <p style="margin-top: -1.4em; margin-bottom: 15px; max-width: 100%; min-height: 1em; border: none; line-height: 1.75em; box-sizing: border-box !important; word-wrap: break-word !important;">关于转载
  如需转载,请在开篇显著位置注明作者和出处(转自:大数据文摘 | bigdatadigest),并在文章结尾放置大数据文摘醒目二维码。无原创标识文章请按照转载要求编辑,可直接转载,转载后请将转载链接发送给我们;有原创标识文章,请发送【文章名称-待授权公众号名称及ID】给我们申请白名单授权。未经许可的转载以及改编者,我们将依法追究其法律责任。联系邮箱:zz@bigdatadigest.cn。</p>
  志愿者介绍

编写现代 CSS 代码的 20 个建议

网站优化优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2022-05-12 23:11 • 来自相关话题

  编写现代 CSS 代码的 20 个建议
  的背景图而不是直接使用img标签。基于这种方式配合上background-size与background-position这两个属性,可以很方便地按比例缩放:
  img {  
   width: 300px;  
   height: 200px;  
}  
div {  
   width: 300px;  
   height: 200px;  
   background: url('http://cdn.tutorialzine.com/wp-content/uploads/2016/08/bicycle.jpg');  
   background-position: center center;  
   background-size: cover;  
}  
section{  
   float: left;  
   margin: 15px;  
}
  不过这种方式也是存在缺陷的,譬如你无法设置图片的懒加载、图片无法被搜索引擎或者其他类似的工具抓取到,有个不错的属性叫object-fit可以解决这个问题,不过该属性目前的浏览器支持并不是很完善。
  Better Table Borders
  HTML中使用Tables进行布局一直是个很头疼的问题,它们使用起来很简单,但是无法进行响应式操作,并且也不方便进行全局样式设置。譬如,如果你打算为Table的边与单元的边添加样式,可能得到的结果如下:
  table {  
   width: 600px;  
   border: 1px solid #505050;  
   margin-bottom: 15px;  
   color:#505050;  
}  
td{  
   border: 1px solid #505050;  
   padding: 10px;  
}
  
  这里存在的问题是出现了很多的重复的边,会导致视觉上不协调的情况,那么我们可以通过设置border-collapse:collapse来进行处理:
  
  注释格式优化
  CSS虽然谈不上一门编程语言但是其仍然需要添加注释以保障整体代码的可读性,只要添加些简单的注释不仅可以方便你更好地组织整个样式表还能够让你的同事或者未来的自己更好地理解。对于CSS中整块的注释或者使用在Media-Query中的注释,建议是使用如下形式:
  /*---------------  
   #Header  
---------------*/header { }header nav { }/*---------------  
   #Slideshow  
---------------*/.slideshow { }
  而设计的细节说明或者一些不重要的组件可以用如下单行注释的方式:
  /*   Footer Buttons   */   .footer button { }  
.footer button:hover { }
  同时,不要忘了CSS中是没有//这种注释方式的:
  /*  Do  */p {  
   padding: 15px;  
   /*border: 1px solid #222;*/   }/*  Don't  */p {  
   padding: 15px;  
   // border: 1px solid #222;     }
  使用Kebab-case命名变量
  对于样式类名或者ID名的命名都需要在多个单词之间添加-符号,CSS本身是大小写不敏感的因此你是用不了camelCase的,另一方面,很久之前也不支持下划线,所以现在的默认的命名方式就是使用-:
  /*  Do     */   .footer-column-left { }  
/*  Don't  */   .footerColumnLeft { }  
.footer_column_left { }
  而涉及到具体的变量命名规范时,建议是使用BEM规范,只要遵循一些简单的原则即可以保证基于组件风格的命名一致性。你也可以参考CSS Tricks来获得更多的细节描述。
  避免重复代码
  大部分元素的CSS属性都是从DOM树根部继承而来,这也是其命名为级联样式表的由来。我们以font属性为例,该属性往往是继承自父属性,因此我们并不需要再单独地为元素设置该属性。我们只需要在html或者body中添加该属性然后使其层次传递下去即可:
  html {  
   font: normal 16px/1.4 sans-serif;  
}
  使用transform添加CSS Animations
  不建议直接改变元素的width与height属性或者left/top/bottom/right这些属性来达到动画效果,而应该优先使用transform()属性来提供更平滑的变换效果,并且能使得代码的可读性会更好:
  .ball {  
   left: 50px;  
   transition: 0.4s ease-out;  
}/* Not Cool*/.ball.slide-out {  
   left: 500px;  
}/* Cool*/.ball.slide-out {  
   transform: translateX(450px);  
}
  Transform的几个属性translate、rotate、scale都具有比较好的浏览器兼容性可以放心使用。
  不要重复造轮子
  现在CSS社区已经非常庞大,并且不断地有新的各式各样的库开源出来。这些库可以帮助我们解决从小的代码片到用于构建完整的响应式应用的全框架。所以如果下次你再碰到什么CSS问题的时候,在打算撸起袖子自己上之前可以尝试在GitHUB或者CodePen上搜索可行方案。
  尽可能使用低优先级的选择器
  并不是所有的CSS选择器的优先级都一样,很多初学者在使用CSS选择器的时候都是考虑以新的特性去复写全部的继承特性,不过这一点在某个元素多状态时就麻烦了,譬如下面这个例子:
  a{  
   color: #fff;  
   padding: 15px;  
}  
a#blue-btn {  
   background-color: blue;  
}  
a.active {  
   background-color: red;  
}
  我们本来希望将.active类添加到按钮上然后使其显示为红色,不过在上面这个例子中很明显起不了作用,因为button已经以ID选择器设置过了背景色,也就是所谓的Higher Selector Specificity。一般来说,选择器的优先级顺序为:ID(#id) > Class(.class) > Type(header)
  避免使用!important
  认真的说,千万要避免使用!important,这可能会导致你在未来的开发中无尽的属性重写,你应该选择更合适的CSS选择器。而唯一的可以使用!important属性的场景就是当你想去复写某些行内样式的时候,不过行内样式本身也是需要避免的。
  使用text-transform属性设置文本大写
  Star Wars: The Force Awakens  
.movie-poster {  
   text-transform: uppercase;  
}
  Em, Rem, 以及 Pixel
  已经有很多关于人们应该如何使用em,rem,以及px作为元素尺寸与文本尺寸的讨论,而笔者认为,这三个尺寸单位都有其适用与不适用的地方。不同的开发与项目都有其特定的设置,因此并没有通用的规则来决定应该使用哪个单位,这里是我总结的几个考虑:
  在大型项目中使用预处理器
  估计你肯定听说过Sass,Less,PostCSS,Stylus这些预处理器与对应的语法。Preprocessors可以允许我们将未来的CSS特性应用在当前的代码开发中,譬如变量支持、函数、嵌套式的选择器以及很多其他的特性,这里我们以Sass为例:
  $accent-color: #2196F3;  
a {  
   padding: 10px 15px;  
   background-color: $accent-color;  
}  
a:hover {  
   background-color: darken($accent-color,10%);  
}
  使用Autoprefixers来提升浏览器兼容性
  使用特定的浏览器前缀是CSS开发中常见的工作之一,不同的浏览器、不同的属性对于前缀的要求也不一样,这就使得我们无法在编码过程中记住所有的前缀规则。并且在写样式代码的时候还需要加上特定的浏览器前缀支持也是个麻烦活,幸亏现在也是有很多工具可以辅助我们进行这样的开发:
  在生产环境下使用Minified代码
  为了提升页面的加载速度,在生产环境下我们应该默认使用压缩之后的资源代码。在压缩的过程中,会将所有的空白与重复剔除掉从而减少整个文件的体积大小。当然,经过压缩之后的代码毫无可读性,因此在开发阶段我们还是应该使用普通的版本。对于CSS的压缩有很多的现行工具:
  选择哪个工具肯定是依赖于你自己的工作流啦~
  多参阅Caniuse
  不同的浏览器在兼容性上差异很大,因此如果我们可以针对我们所需要适配的浏览器,在caniuse上我们可以查询某个特性的浏览器版本适配性,是否需要添加特定的前缀或者在某个平台上是否存在Bug等等。不过光光使用caniuse肯定是不够的,我们还需要使用些额外的服务来进行检测。
  Validate:校验
  对于CSS的校验可能不如HTML校验或者JavaScript校验那么重要,不过在正式发布之前用Lint工具校验一波你的CSS代码还是很有意义的。它会告诉你代码中潜在的错误,提示你一些不符合最佳实践的代码以及给你一些提升代码性能的建议。就像Minifers与Autoprefixers,也有很多可用的工具: 查看全部

  编写现代 CSS 代码的 20 个建议
  的背景图而不是直接使用img标签。基于这种方式配合上background-size与background-position这两个属性,可以很方便地按比例缩放:
  img {  
   width: 300px;  
   height: 200px;  
}  
div {  
   width: 300px;  
   height: 200px;  
   background: url('http://cdn.tutorialzine.com/wp-content/uploads/2016/08/bicycle.jpg');  
   background-position: center center;  
   background-size: cover;  
}  
section{  
   float: left;  
   margin: 15px;  
}
  不过这种方式也是存在缺陷的,譬如你无法设置图片的懒加载、图片无法被搜索引擎或者其他类似的工具抓取到,有个不错的属性叫object-fit可以解决这个问题,不过该属性目前的浏览器支持并不是很完善。
  Better Table Borders
  HTML中使用Tables进行布局一直是个很头疼的问题,它们使用起来很简单,但是无法进行响应式操作,并且也不方便进行全局样式设置。譬如,如果你打算为Table的边与单元的边添加样式,可能得到的结果如下:
  table {  
   width: 600px;  
   border: 1px solid #505050;  
   margin-bottom: 15px;  
   color:#505050;  
}  
td{  
   border: 1px solid #505050;  
   padding: 10px;  
}
  
  这里存在的问题是出现了很多的重复的边,会导致视觉上不协调的情况,那么我们可以通过设置border-collapse:collapse来进行处理:
  
  注释格式优化
  CSS虽然谈不上一门编程语言但是其仍然需要添加注释以保障整体代码的可读性,只要添加些简单的注释不仅可以方便你更好地组织整个样式表还能够让你的同事或者未来的自己更好地理解。对于CSS中整块的注释或者使用在Media-Query中的注释,建议是使用如下形式:
  /*---------------  
   #Header  
---------------*/header { }header nav { }/*---------------  
   #Slideshow  
---------------*/.slideshow { }
  而设计的细节说明或者一些不重要的组件可以用如下单行注释的方式:
  /*   Footer Buttons   */   .footer button { }  
.footer button:hover { }
  同时,不要忘了CSS中是没有//这种注释方式的:
  /*  Do  */p {  
   padding: 15px;  
   /*border: 1px solid #222;*/   }/*  Don't  */p {  
   padding: 15px;  
   // border: 1px solid #222;     }
  使用Kebab-case命名变量
  对于样式类名或者ID名的命名都需要在多个单词之间添加-符号,CSS本身是大小写不敏感的因此你是用不了camelCase的,另一方面,很久之前也不支持下划线,所以现在的默认的命名方式就是使用-:
  /*  Do     */   .footer-column-left { }  
/*  Don't  */   .footerColumnLeft { }  
.footer_column_left { }
  而涉及到具体的变量命名规范时,建议是使用BEM规范,只要遵循一些简单的原则即可以保证基于组件风格的命名一致性。你也可以参考CSS Tricks来获得更多的细节描述。
  避免重复代码
  大部分元素的CSS属性都是从DOM树根部继承而来,这也是其命名为级联样式表的由来。我们以font属性为例,该属性往往是继承自父属性,因此我们并不需要再单独地为元素设置该属性。我们只需要在html或者body中添加该属性然后使其层次传递下去即可:
  html {  
   font: normal 16px/1.4 sans-serif;  
}
  使用transform添加CSS Animations
  不建议直接改变元素的width与height属性或者left/top/bottom/right这些属性来达到动画效果,而应该优先使用transform()属性来提供更平滑的变换效果,并且能使得代码的可读性会更好:
  .ball {  
   left: 50px;  
   transition: 0.4s ease-out;  
}/* Not Cool*/.ball.slide-out {  
   left: 500px;  
}/* Cool*/.ball.slide-out {  
   transform: translateX(450px);  
}
  Transform的几个属性translate、rotate、scale都具有比较好的浏览器兼容性可以放心使用。
  不要重复造轮子
  现在CSS社区已经非常庞大,并且不断地有新的各式各样的库开源出来。这些库可以帮助我们解决从小的代码片到用于构建完整的响应式应用的全框架。所以如果下次你再碰到什么CSS问题的时候,在打算撸起袖子自己上之前可以尝试在GitHUB或者CodePen上搜索可行方案。
  尽可能使用低优先级的选择器
  并不是所有的CSS选择器的优先级都一样,很多初学者在使用CSS选择器的时候都是考虑以新的特性去复写全部的继承特性,不过这一点在某个元素多状态时就麻烦了,譬如下面这个例子:
  a{  
   color: #fff;  
   padding: 15px;  
}  
a#blue-btn {  
   background-color: blue;  
}  
a.active {  
   background-color: red;  
}
  我们本来希望将.active类添加到按钮上然后使其显示为红色,不过在上面这个例子中很明显起不了作用,因为button已经以ID选择器设置过了背景色,也就是所谓的Higher Selector Specificity。一般来说,选择器的优先级顺序为:ID(#id) > Class(.class) > Type(header)
  避免使用!important
  认真的说,千万要避免使用!important,这可能会导致你在未来的开发中无尽的属性重写,你应该选择更合适的CSS选择器。而唯一的可以使用!important属性的场景就是当你想去复写某些行内样式的时候,不过行内样式本身也是需要避免的。
  使用text-transform属性设置文本大写
  Star Wars: The Force Awakens  
.movie-poster {  
   text-transform: uppercase;  
}
  Em, Rem, 以及 Pixel
  已经有很多关于人们应该如何使用em,rem,以及px作为元素尺寸与文本尺寸的讨论,而笔者认为,这三个尺寸单位都有其适用与不适用的地方。不同的开发与项目都有其特定的设置,因此并没有通用的规则来决定应该使用哪个单位,这里是我总结的几个考虑:
  在大型项目中使用预处理器
  估计你肯定听说过Sass,Less,PostCSS,Stylus这些预处理器与对应的语法。Preprocessors可以允许我们将未来的CSS特性应用在当前的代码开发中,譬如变量支持、函数、嵌套式的选择器以及很多其他的特性,这里我们以Sass为例:
  $accent-color: #2196F3;  
a {  
   padding: 10px 15px;  
   background-color: $accent-color;  
}  
a:hover {  
   background-color: darken($accent-color,10%);  
}
  使用Autoprefixers来提升浏览器兼容性
  使用特定的浏览器前缀是CSS开发中常见的工作之一,不同的浏览器、不同的属性对于前缀的要求也不一样,这就使得我们无法在编码过程中记住所有的前缀规则。并且在写样式代码的时候还需要加上特定的浏览器前缀支持也是个麻烦活,幸亏现在也是有很多工具可以辅助我们进行这样的开发:
  在生产环境下使用Minified代码
  为了提升页面的加载速度,在生产环境下我们应该默认使用压缩之后的资源代码。在压缩的过程中,会将所有的空白与重复剔除掉从而减少整个文件的体积大小。当然,经过压缩之后的代码毫无可读性,因此在开发阶段我们还是应该使用普通的版本。对于CSS的压缩有很多的现行工具:
  选择哪个工具肯定是依赖于你自己的工作流啦~
  多参阅Caniuse
  不同的浏览器在兼容性上差异很大,因此如果我们可以针对我们所需要适配的浏览器,在caniuse上我们可以查询某个特性的浏览器版本适配性,是否需要添加特定的前缀或者在某个平台上是否存在Bug等等。不过光光使用caniuse肯定是不够的,我们还需要使用些额外的服务来进行检测。
  Validate:校验
  对于CSS的校验可能不如HTML校验或者JavaScript校验那么重要,不过在正式发布之前用Lint工具校验一波你的CSS代码还是很有意义的。它会告诉你代码中潜在的错误,提示你一些不符合最佳实践的代码以及给你一些提升代码性能的建议。就像Minifers与Autoprefixers,也有很多可用的工具:

不写代码也能爬取数据?试试这几个工具

网站优化优采云 发表了文章 • 0 个评论 • 69 次浏览 • 2022-05-08 09:43 • 来自相关话题

  不写代码也能爬取数据?试试这几个工具
  ↑关注 + 星标,后台回复【大礼包】送你2TPython自学资料
  
  前天,有个同学加我微信来咨询我:
  “我想抓取近期 5000 条新闻数据,但我是文科生,不会写代码,请问该怎么办?”
  对于这位同学的问题,我给安排上。
  先说说获取数据的方式:一是利用现成的工具,我们只需懂得如何使用工具就能获取数据,不需要关心工具是怎么实现。打个比方,假如我们在岸上,要去海上某个小岛,岸边有一艘船,我们第一想法是选择坐船过去,而不会想着自己来造一艘船再过去。
  第二种是自己针对场景需求做些定制化工具,这就需要有点编程基础。举个例子,我们还是要到海上某个小岛,同时还要求在 30 分钟内将 1 顿货物送到岛上。
  因此,前期只是单纯想获取数据,没有什么其他要求的话,优先选择现有工具,介绍几个能快速获取网上数据的工具。
  1.Microsoft Excel
  你没有看错,就是 Office 三剑客之一的 Excel。Excel 是一个强大的工具,能抓取数据就是它的功能之一。我以耳机作为关键字,抓取京东的商品列表。
  
  
  等待几秒后,Excel 会将页面上所有的文字信息抓取到表格中。这种方式确实能抓取到数据,但也会引入一些我们不需要的数据。如果你有更高的需求,可以选择后面几个工具。
  2.优采云采集器
  
  优采云是爬虫界的老品牌了,是目前使用人数最多的互联网数据抓取、处理、分析,挖掘软件。它的优势是采集不限网页,不限内容,同时还是分布式采集,效率会高一些。缺点是对小白用户不是很友好,有一定的知识门槛(了解如网页知识、HTTP 协议等方面知识),还需要花些时间熟悉工具操作。
  因为有学习门槛,掌握该工具之后,采集数据上限会很高。有时间和精力的同学可以去折腾折腾。
  官网地址:
  3.优采云采集器
  
  优采云采集器是一款非常适合新手的采集器。它具有简单易用的特点,让你能几分钟中就快手上手。优采云提供一些常见抓取网站的模板,使用模板就能快速抓取数据。如果想抓取没有模板的网站,官网也提供非常详细的图文教程和视频教程。
  优采云是基于浏览器内核实现可视化抓取数据,所以存在卡顿、采集数据慢的特点。但这瑕不掩瑜,能基本满足新手在短时间抓取数据的场景,比如翻页查询,Ajax 动态加载数据等。
  网站:
  4.GooSeeker 集搜客
  
  集搜客也是一款容易上手的可视化采集数据工具。同样能抓取动态网页,也支持可以抓取手机网站上的数据,还支持抓取在指数图表上悬浮显示的数据。集搜客是以浏览器插件形式抓取数据。虽然具有前面所述的有点,但缺点也有,无法多线程采集数据,出现浏览器卡顿也在所难免。
  网站:
  5.Scrapinghub
  
  如果你想抓取国外的网站数据,可以考虑 Scrapinghub。Scrapinghub 是一个基于Python 的 Scrapy 框架的云爬虫平台。Scrapehub 算是市场上非常复杂和强大的网络抓取平台,提供数据抓取的解决方案商。
  地址:
  6.WebScraper
  
  WebScraper 是一款优秀国外的浏览器插件。同样也是一款适合新手抓取数据的可视化工具。我们通过简单设置一些抓取规则,剩下的就交给浏览器去工作。
  地址: 查看全部

  不写代码也能爬取数据?试试这几个工具
  ↑关注 + 星标,后台回复【大礼包】送你2TPython自学资料
  
  前天,有个同学加我微信来咨询我:
  “我想抓取近期 5000 条新闻数据,但我是文科生,不会写代码,请问该怎么办?”
  对于这位同学的问题,我给安排上。
  先说说获取数据的方式:一是利用现成的工具,我们只需懂得如何使用工具就能获取数据,不需要关心工具是怎么实现。打个比方,假如我们在岸上,要去海上某个小岛,岸边有一艘船,我们第一想法是选择坐船过去,而不会想着自己来造一艘船再过去。
  第二种是自己针对场景需求做些定制化工具,这就需要有点编程基础。举个例子,我们还是要到海上某个小岛,同时还要求在 30 分钟内将 1 顿货物送到岛上。
  因此,前期只是单纯想获取数据,没有什么其他要求的话,优先选择现有工具,介绍几个能快速获取网上数据的工具。
  1.Microsoft Excel
  你没有看错,就是 Office 三剑客之一的 Excel。Excel 是一个强大的工具,能抓取数据就是它的功能之一。我以耳机作为关键字,抓取京东的商品列表。
  
  
  等待几秒后,Excel 会将页面上所有的文字信息抓取到表格中。这种方式确实能抓取到数据,但也会引入一些我们不需要的数据。如果你有更高的需求,可以选择后面几个工具。
  2.优采云采集
  
  优采云是爬虫界的老品牌了,是目前使用人数最多的互联网数据抓取、处理、分析,挖掘软件。它的优势是采集不限网页,不限内容,同时还是分布式采集,效率会高一些。缺点是对小白用户不是很友好,有一定的知识门槛(了解如网页知识、HTTP 协议等方面知识),还需要花些时间熟悉工具操作。
  因为有学习门槛,掌握该工具之后,采集数据上限会很高。有时间和精力的同学可以去折腾折腾。
  官网地址:
  3.优采云采集器
  
  优采云采集器是一款非常适合新手的采集器。它具有简单易用的特点,让你能几分钟中就快手上手。优采云提供一些常见抓取网站的模板,使用模板就能快速抓取数据。如果想抓取没有模板的网站,官网也提供非常详细的图文教程和视频教程。
  优采云是基于浏览器内核实现可视化抓取数据,所以存在卡顿、采集数据慢的特点。但这瑕不掩瑜,能基本满足新手在短时间抓取数据的场景,比如翻页查询,Ajax 动态加载数据等。
  网站:
  4.GooSeeker 集搜客
  
  集搜客也是一款容易上手的可视化采集数据工具。同样能抓取动态网页,也支持可以抓取手机网站上的数据,还支持抓取在指数图表上悬浮显示的数据。集搜客是以浏览器插件形式抓取数据。虽然具有前面所述的有点,但缺点也有,无法多线程采集数据,出现浏览器卡顿也在所难免。
  网站:
  5.Scrapinghub
  
  如果你想抓取国外的网站数据,可以考虑 Scrapinghub。Scrapinghub 是一个基于Python 的 Scrapy 框架的云爬虫平台。Scrapehub 算是市场上非常复杂和强大的网络抓取平台,提供数据抓取的解决方案商。
  地址:
  6.WebScraper
  
  WebScraper 是一款优秀国外的浏览器插件。同样也是一款适合新手抓取数据的可视化工具。我们通过简单设置一些抓取规则,剩下的就交给浏览器去工作。
  地址:

从零开发一款自动提取网页html并一键转换为md文件的工具(vue源码版)

网站优化优采云 发表了文章 • 0 个评论 • 73 次浏览 • 2022-05-08 09:42 • 来自相关话题

  从零开发一款自动提取网页html并一键转换为md文件的工具(vue源码版)
  
  最近几年涌现出了很多技术博客和技术社区, 也有很多技术同仁开始打造自己的博客, 我们可以把自己的博客同步到不同的技术平台, 但是随着技术平台的增多, 我们文章同步所花费的时间会越来越多, 那么有没有一个工具能快速的将博客发布到不同的平台呢? 或者有没有一个工具, 可以把html直接转化为技术平台能够识别的“语言”直接发布呢?
  我们都知道程序员最爱的写博客的“语言”就是makedown, 并且目前大部分的技术社区都支持makedown语法, 所以说只要有makedown, 我们就能快速的同步到不同的技术平台.
  也许有人会说, 我们写博客直接用makedown语法写不就好了? 的确这样做可以满足需求, 但缺点就是我们本地必须要保存一份makedown文件, 如果博客内容涉及到图片, 我们还需要维护一个img目录, 这样每次在不同技术社区发布文章还是会很麻烦, 所以综上我们开发了一款自动爬取html内容并一键转换为makedown的工具, 这样我们就可以“肆无忌惮的”发布博客了.
  你将收获
  github地址笔者将在文末附上, 感兴趣的朋友可以一起共建, 学习和探索.
  效果演示
  
  客户端思路
  先理一下思路:
  
  为什么选择turndown
  客户端最重要的一步是html转md,这里我们使用的 turndown。
  为什么使用turndown呢,原因如下:
  具体实现
    // 引入第三方插件<br />  import { gfm, tables, strikethrough } from 'turndown-plugin-gfm'<br /><br />  const turndownService = new TurndownService({ codeBlockStyle: 'fenced' })<br />  // Use the gfm plugin<br />  turndownService.use(gfm)<br /><br />  // Use the table and strikethrough plugins only<br />  turndownService.use([tables, strikethrough])<br /><br />  /**<br />   * 自定义配置(rule名不能重复)<br />   * 这里我们指定 `pre` 标签为代码块,并在代码块的前后加个换行,防止显示异常<br />   */<br />  turndownService.addRule('pre2Code', {<br />    filter: ['pre'],<br />    replacement (content) {<br />      return '```\n' + content + '\n```'<br />    }<br />  })<br />
  额外功能
  支持自动获取链接文章标题,无需手动去原文复制。
  服务端
  这里我们使用的服务端是node.js,用前端的框架写服务端,体验杠杠的。
  思路
  先理一下思路:
  
  具体实现获取前端传递的链接地址
  这里直接使用node的自带语法,我们采用的是get形式传递,用query即可
  const qUrl = req.query.url<br />
  通过请求获取html串
  这里我们是用request进行请求
   request({<br />   url: qUrl<br /> }, (error, response, body) => {<br />   if (error) {<br />     res.status(404).send('Url Error')<br />     return<br />   }<br />   // 这里的 body 就是文章的 `html`<br />   console.log(body)<br /> })<br />
  根据不同平台域名获取不同的dom
  由于技术平台众多,每个平台的文章内容标签、样式名或 id 会有差异,需要针对兼容。
  首先先用js-dom去模拟操作dom,封装一个方法
   /**<br />  * 获取准确的文章内容<br />  * @param {string} html html串<br />  * @param {string} selector css选择器<br />  * @return {string} htmlContent<br />  */<br /> const getDom = (html, selector) => {<br />   const dom = new JSDOM(html)<br />   const htmlContent = dom.window.document.querySelector(selector)<br />   return htmlContent<br /> }<br />
  兼容不同的平台,应用不同的 css 选择器
   // 比如掘金,内容块的样式名为 .markdown-body,内容里会有 style 标签样式和一些多余的复制代码文字,通过原生 dom 操作删掉<br /> if (qUrl.includes('juejin.cn')) {<br />   const htmlContent = getBySelector('.markdown-body')<br />   const extraDom = htmlContent.querySelector('style')<br />   const extraDomArr = htmlContent.querySelectorAll('.copy-code-btn')<br />   extraDom && extraDom.remove()<br />   extraDomArr.length > 0 && extraDomArr.forEach((v) => { v.remove() })<br />   return htmlContent<br /> }<br /><br /> // 再比如 oschina,内容块的样式名为 .article-detail,内容里会有多余的 .ad-wrap 内容,照样删掉<br /> if (qUrl.includes('oschina.net')) {<br />   const htmlContent = getBySelector('.article-detail')<br />   const extraDom = htmlContent.querySelector('.ad-wrap')<br />   extraDom && extraDom.remove()<br />   return htmlContent<br /> }<br /><br /> // 最后匹配通用标签。优先适配 article 标签,没有再用 body 标签<br /> const htmlArticle = getBySelector('article')<br /> if (htmlArticle) { return htmlArticle }<br /><br /> const htmlBody = getBySelector('body')<br /> if (htmlBody) { return htmlBody }<br />
  转换图片和链接的相对路径为绝对路径,方便以后查找源路径
   // 通过原生api - URL 获取链接的源域名<br /> const qOrigin = new URL(qUrl).origin || ''<br /><br /> // 获取图片、链接的绝对路径。通过 URL 将 `路径+源域名` 转换为绝对路径,不熟悉的同学请自行了解<br /> const getAbsoluteUrl = p => new URL(p, qOrigin).href<br /><br /> // 转换图片、链接的相对路径,不同平台的图片懒加载属性名不一样,需要做特定兼容<br /> const changeRelativeUrl = (dom) => {<br />   if (!dom) { return '内容出错~' }<br />   const copyDom = dom<br />   // 获取所有图片<br />   const imgs = copyDom.querySelectorAll('img')<br />   // 获取所有链接<br />   const links = copyDom.querySelectorAll('a')<br />   // 替换完所有路径返回新 dom<br />   imgs.length > 0 && imgs.forEach((v) => {<br />     /**<br />     * 处理懒加载路径<br />     * 简书:data-original-src<br />     * 掘金:data-src<br />     * segmentfault:data-src<br />     */<br />     const src = v.src || v.getAttribute('data-src') || v.getAttribute('data-original-src') || ''<br />     v.src = getAbsoluteUrl(src)<br />   })<br />   links.length > 0 && links.forEach((v) => {<br />     const href = v.href || qUrl<br />     v.href = getAbsoluteUrl(href)<br />   })<br />   return copyDom<br /> }<br /><br /> // 在获取不同平台的文章内容 getBody 方法里,应用 changeRelativeUrl 方法<br /> const getBody = (content) => {<br />   ...<br />   ...<br />   return changeRelativeUrl(htmlContent)<br /> }<br /> 查看全部

  从零开发一款自动提取网页html并一键转换为md文件的工具(vue源码版)
  
  最近几年涌现出了很多技术博客和技术社区, 也有很多技术同仁开始打造自己的博客, 我们可以把自己的博客同步到不同的技术平台, 但是随着技术平台的增多, 我们文章同步所花费的时间会越来越多, 那么有没有一个工具能快速的将博客发布到不同的平台呢? 或者有没有一个工具, 可以把html直接转化为技术平台能够识别的“语言”直接发布呢?
  我们都知道程序员最爱的写博客的“语言”就是makedown, 并且目前大部分的技术社区都支持makedown语法, 所以说只要有makedown, 我们就能快速的同步到不同的技术平台.
  也许有人会说, 我们写博客直接用makedown语法写不就好了? 的确这样做可以满足需求, 但缺点就是我们本地必须要保存一份makedown文件, 如果博客内容涉及到图片, 我们还需要维护一个img目录, 这样每次在不同技术社区发布文章还是会很麻烦, 所以综上我们开发了一款自动爬取html内容并一键转换为makedown的工具, 这样我们就可以“肆无忌惮的”发布博客了.
  你将收获
  github地址笔者将在文末附上, 感兴趣的朋友可以一起共建, 学习和探索.
  效果演示
  
  客户端思路
  先理一下思路:
  
  为什么选择turndown
  客户端最重要的一步是html转md,这里我们使用的 turndown。
  为什么使用turndown呢,原因如下:
  具体实现
    // 引入第三方插件<br />  import { gfm, tables, strikethrough } from 'turndown-plugin-gfm'<br /><br />  const turndownService = new TurndownService({ codeBlockStyle: 'fenced' })<br />  // Use the gfm plugin<br />  turndownService.use(gfm)<br /><br />  // Use the table and strikethrough plugins only<br />  turndownService.use([tables, strikethrough])<br /><br />  /**<br />   * 自定义配置(rule名不能重复)<br />   * 这里我们指定 `pre` 标签为代码块,并在代码块的前后加个换行,防止显示异常<br />   */<br />  turndownService.addRule('pre2Code', {<br />    filter: ['pre'],<br />    replacement (content) {<br />      return '```\n' + content + '\n```'<br />    }<br />  })<br />
  额外功能
  支持自动获取链接文章标题,无需手动去原文复制。
  服务端
  这里我们使用的服务端是node.js,用前端的框架写服务端,体验杠杠的。
  思路
  先理一下思路:
  
  具体实现获取前端传递的链接地址
  这里直接使用node的自带语法,我们采用的是get形式传递,用query即可
  const qUrl = req.query.url<br />
  通过请求获取html串
  这里我们是用request进行请求
   request({<br />   url: qUrl<br /> }, (error, response, body) => {<br />   if (error) {<br />     res.status(404).send('Url Error')<br />     return<br />   }<br />   // 这里的 body 就是文章的 `html`<br />   console.log(body)<br /> })<br />
  根据不同平台域名获取不同的dom
  由于技术平台众多,每个平台的文章内容标签、样式名或 id 会有差异,需要针对兼容。
  首先先用js-dom去模拟操作dom,封装一个方法
   /**<br />  * 获取准确的文章内容<br />  * @param {string} html html串<br />  * @param {string} selector css选择器<br />  * @return {string} htmlContent<br />  */<br /> const getDom = (html, selector) => {<br />   const dom = new JSDOM(html)<br />   const htmlContent = dom.window.document.querySelector(selector)<br />   return htmlContent<br /> }<br />
  兼容不同的平台,应用不同的 css 选择器
   // 比如掘金,内容块的样式名为 .markdown-body,内容里会有 style 标签样式和一些多余的复制代码文字,通过原生 dom 操作删掉<br /> if (qUrl.includes('juejin.cn')) {<br />   const htmlContent = getBySelector('.markdown-body')<br />   const extraDom = htmlContent.querySelector('style')<br />   const extraDomArr = htmlContent.querySelectorAll('.copy-code-btn')<br />   extraDom && extraDom.remove()<br />   extraDomArr.length > 0 && extraDomArr.forEach((v) => { v.remove() })<br />   return htmlContent<br /> }<br /><br /> // 再比如 oschina,内容块的样式名为 .article-detail,内容里会有多余的 .ad-wrap 内容,照样删掉<br /> if (qUrl.includes('oschina.net')) {<br />   const htmlContent = getBySelector('.article-detail')<br />   const extraDom = htmlContent.querySelector('.ad-wrap')<br />   extraDom && extraDom.remove()<br />   return htmlContent<br /> }<br /><br /> // 最后匹配通用标签。优先适配 article 标签,没有再用 body 标签<br /> const htmlArticle = getBySelector('article')<br /> if (htmlArticle) { return htmlArticle }<br /><br /> const htmlBody = getBySelector('body')<br /> if (htmlBody) { return htmlBody }<br />
  转换图片和链接的相对路径为绝对路径,方便以后查找源路径
   // 通过原生api - URL 获取链接的源域名<br /> const qOrigin = new URL(qUrl).origin || ''<br /><br /> // 获取图片、链接的绝对路径。通过 URL 将 `路径+源域名` 转换为绝对路径,不熟悉的同学请自行了解<br /> const getAbsoluteUrl = p => new URL(p, qOrigin).href<br /><br /> // 转换图片、链接的相对路径,不同平台的图片懒加载属性名不一样,需要做特定兼容<br /> const changeRelativeUrl = (dom) => {<br />   if (!dom) { return '内容出错~' }<br />   const copyDom = dom<br />   // 获取所有图片<br />   const imgs = copyDom.querySelectorAll('img')<br />   // 获取所有链接<br />   const links = copyDom.querySelectorAll('a')<br />   // 替换完所有路径返回新 dom<br />   imgs.length > 0 && imgs.forEach((v) => {<br />     /**<br />     * 处理懒加载路径<br />     * 简书:data-original-src<br />     * 掘金:data-src<br />     * segmentfault:data-src<br />     */<br />     const src = v.src || v.getAttribute('data-src') || v.getAttribute('data-original-src') || ''<br />     v.src = getAbsoluteUrl(src)<br />   })<br />   links.length > 0 && links.forEach((v) => {<br />     const href = v.href || qUrl<br />     v.href = getAbsoluteUrl(href)<br />   })<br />   return copyDom<br /> }<br /><br /> // 在获取不同平台的文章内容 getBody 方法里,应用 changeRelativeUrl 方法<br /> const getBody = (content) => {<br />   ...<br />   ...<br />   return changeRelativeUrl(htmlContent)<br /> }<br />

不写代码,也能随心所欲的抓取网页上的数据?

网站优化优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2022-05-08 00:16 • 来自相关话题

  不写代码,也能随心所欲的抓取网页上的数据?
  
  当你需要从互联网上收集信息时,是不是很希望有一个机器人能自动的帮你抓取你想要的数据?而不是新建了一个文档,边浏览网页,边复制粘贴,重复机械乏味的操作....。
  数据分析现在被用于各行各业,使用场景众多:
  新媒体从业者经常都需要对各种大号进行数据分析;
  做产品的童鞋也经常需要统计互联网上产品的用户评论;
  如果你打算自主创业,就更需要从互联网上获取该行业相关公司的动向和该行业的舆情信息;
  如果没有数据,一切都是空谈!
  当然你可以选择编写一个自动抓取数据的爬虫程序,但是python、Java......会学到怀疑人生。
  有没有什么办法,可以不用编写任何代码,又能根据具体情况,轻松的帮你从网页上获取你所需要的数据信息?
  
  答案是,有!
  一款基于Chrome的Web Scraper插件!你只要打开目标网页,设置好抓取格式,喝杯咖啡的工夫,就能轻松获取你需要的数据。
  Web Scraper插件只有英文界面,刚开始使用会有一定的难度。易灵微课早期的用户“明白”,是个程序员,从事过网络、云计算、web 前后端等方向的软件开发工作,还翻译过一本技术书籍《深入理解OpenStack Trove》,他希望分享这款软件的使用方法,帮助没有技术背景的朋友轻松上手这个软件。
  为了确保教程直白易懂,邀请了没有技术背景的热心学员进行内测,并针对性的做了多次改进。
  
  
  
  
  希望不仅教会大家如何抓取数据,还能帮助大家理解为什么这样抓取数据。让大家都能得心应手地去抓取网页数据。
  
  此软件除了简单易用、方便快捷,还有个很大的优点,不受操作系统的限制,MacOS 和 windows 都可以使用,完全基于Chrome的Web Scraper插件。
  本次课程适合不会编程,但对收集分析数据有较多需求的人;Python大神,各路Geek请绕行!
  说明:软件需要在谷歌浏览器内运行,只有能在web端显示的数据,才有可能抓取。有些移动端的APP,如果没有网页版,数据是抓不到的,请慎重选择。
  如果课程内容不符合预期,在进入课堂起一小时内,是可以无条件退款的。
  课程详情
  第一节课:
  基础元素
  1. 环境配置
  2. 统计知乎大 V 所有文章标题
  3. 抓取知乎大 V 所有文章详情页
  4. 批量获取喜爱的图片
  5. 统计 58 同城的租房信息
  开课时间:2017年12月12号 20:00
  第二节课:
  高级元素
  6. 抓取大 V 历史微博 查看全部

  不写代码,也能随心所欲的抓取网页上的数据?
  
  当你需要从互联网上收集信息时,是不是很希望有一个机器人能自动的帮你抓取你想要的数据?而不是新建了一个文档,边浏览网页,边复制粘贴,重复机械乏味的操作....。
  数据分析现在被用于各行各业,使用场景众多:
  新媒体从业者经常都需要对各种大号进行数据分析;
  做产品的童鞋也经常需要统计互联网上产品的用户评论;
  如果你打算自主创业,就更需要从互联网上获取该行业相关公司的动向和该行业的舆情信息;
  如果没有数据,一切都是空谈!
  当然你可以选择编写一个自动抓取数据的爬虫程序,但是python、Java......会学到怀疑人生。
  有没有什么办法,可以不用编写任何代码,又能根据具体情况,轻松的帮你从网页上获取你所需要的数据信息?
  
  答案是,有!
  一款基于Chrome的Web Scraper插件!你只要打开目标网页,设置好抓取格式,喝杯咖啡的工夫,就能轻松获取你需要的数据。
  Web Scraper插件只有英文界面,刚开始使用会有一定的难度。易灵微课早期的用户“明白”,是个程序员,从事过网络、云计算、web 前后端等方向的软件开发工作,还翻译过一本技术书籍《深入理解OpenStack Trove》,他希望分享这款软件的使用方法,帮助没有技术背景的朋友轻松上手这个软件。
  为了确保教程直白易懂,邀请了没有技术背景的热心学员进行内测,并针对性的做了多次改进。
  
  
  
  
  希望不仅教会大家如何抓取数据,还能帮助大家理解为什么这样抓取数据。让大家都能得心应手地去抓取网页数据。
  
  此软件除了简单易用、方便快捷,还有个很大的优点,不受操作系统的限制,MacOS 和 windows 都可以使用,完全基于Chrome的Web Scraper插件。
  本次课程适合不会编程,但对收集分析数据有较多需求的人;Python大神,各路Geek请绕行!
  说明:软件需要在谷歌浏览器内运行,只有能在web端显示的数据,才有可能抓取。有些移动端的APP,如果没有网页版,数据是抓不到的,请慎重选择。
  如果课程内容不符合预期,在进入课堂起一小时内,是可以无条件退款的。
  课程详情
  第一节课:
  基础元素
  1. 环境配置
  2. 统计知乎大 V 所有文章标题
  3. 抓取知乎大 V 所有文章详情页
  4. 批量获取喜爱的图片
  5. 统计 58 同城的租房信息
  开课时间:2017年12月12号 20:00
  第二节课:
  高级元素
  6. 抓取大 V 历史微博

WEB 漏洞之逻辑越权漏洞详解

网站优化优采云 发表了文章 • 0 个评论 • 83 次浏览 • 2022-04-29 17:20 • 来自相关话题

  WEB 漏洞之逻辑越权漏洞详解
  本公众号提供的工具、教程、学习路线、精品文章均为原创或互联网收集,旨在提高网络安全技术水平为目的,只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如果您对文章内容有疑问,可以尝试加入交流群讨论或留言私信,如有侵权请联系小编处理。
  2
  内容速览
  越权访问(Broken Access Control,简称BAC)是Web应用程序中一种常见的漏洞,由于其存在范围广、危害大,被OWASP列为Web应用十大安全隐患的第二名。
  该漏洞是指应用在检查授权时存在纰漏,使得攻击者在获得低权限用户账户后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限才能访问到的页面或数据。
  在实际的代码审计中,这种漏洞往往很难通过工具进行自动化监测,因此在实际应用中危害很大。目前存在着两种越权操作类型,横向越权操作(水平越权)和纵向越权操作(垂直越权),水平越权指的是攻击者越权访问到了一个和他拥有相同权限用户的资源,而垂直越权指的是一个低到高权限的过程.
  在判断时,先分析网站的业务逻辑,通过拦截数据包进行业务逻辑判断,判断数据包中的各个参数的意义
  
  水平越权用户在权限相同级别下的组,可以进行越权访问、修改、删除数据测试方法:垂直越权用户可以在不同权限的组下,进行高级别的权限访问测试方法:漏洞产生原理:代码逻辑问题数据库问题 越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定修复防御方案演示案例:Pikachu-本地越权演示(漏洞成因)水平越权
  
  更改username lucy——&gt;kobe
  
  垂直越权前提条件:获取的添加用户的数据包1.普通用户前端有操作界面可以抓取数据包2.通过网站源码本地搭建自己去模拟抓取3.盲猜管理员账户:admin普通用户:pikachu管理员账户界面
  
  普通账户界面
  
  抓取admin添加账户的包,并且更改为普通用户pikachu的phpsession
  
  放包后,在刷新普通用户界面,出现添加账户
  
  查看代码
  
  数据库表
  
  
  
  
  
  如果想要系统学习网络安全技术
  不妨加入知识星球课程
  《60天入门网络安全渗透测试》
  从入门到案例,贴合实战
  轻松易懂、好玩实用
  
  扫码进入知识星球
  
  
  跟着一起学
  期待你的到来!
  
  往期推荐 查看全部

  WEB 漏洞之逻辑越权漏洞详解
  本公众号提供的工具、教程、学习路线、精品文章均为原创或互联网收集,旨在提高网络安全技术水平为目的,只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如果您对文章内容有疑问,可以尝试加入交流群讨论或留言私信,如有侵权请联系小编处理。
  2
  内容速览
  越权访问(Broken Access Control,简称BAC)是Web应用程序中一种常见的漏洞,由于其存在范围广、危害大,被OWASP列为Web应用十大安全隐患的第二名。
  该漏洞是指应用在检查授权时存在纰漏,使得攻击者在获得低权限用户账户后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限才能访问到的页面或数据。
  在实际的代码审计中,这种漏洞往往很难通过工具进行自动化监测,因此在实际应用中危害很大。目前存在着两种越权操作类型,横向越权操作(水平越权)和纵向越权操作(垂直越权),水平越权指的是攻击者越权访问到了一个和他拥有相同权限用户的资源,而垂直越权指的是一个低到高权限的过程.
  在判断时,先分析网站的业务逻辑,通过拦截数据包进行业务逻辑判断,判断数据包中的各个参数的意义
  
  水平越权用户在权限相同级别下的组,可以进行越权访问、修改、删除数据测试方法:垂直越权用户可以在不同权限的组下,进行高级别的权限访问测试方法:漏洞产生原理:代码逻辑问题数据库问题 越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定修复防御方案演示案例:Pikachu-本地越权演示(漏洞成因)水平越权
  
  更改username lucy——&gt;kobe
  
  垂直越权前提条件:获取的添加用户的数据包1.普通用户前端有操作界面可以抓取数据包2.通过网站源码本地搭建自己去模拟抓取3.盲猜管理员账户:admin普通用户:pikachu管理员账户界面
  
  普通账户界面
  
  抓取admin添加账户的包,并且更改为普通用户pikachu的phpsession
  
  放包后,在刷新普通用户界面,出现添加账户
  
  查看代码
  
  数据库表
  
  
  
  
  
  如果想要系统学习网络安全技术
  不妨加入知识星球课程
  《60天入门网络安全渗透测试》
  从入门到案例,贴合实战
  轻松易懂、好玩实用
  
  扫码进入知识星球
  
  
  跟着一起学
  期待你的到来!
  
  往期推荐

芜湖网站制作优化,公众号定制,微信公众号制作网站怎么弄,上门预约小程序开发

网站优化优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-04-29 17:08 • 来自相关话题

  芜湖网站制作优化,公众号定制,微信公众号制作网站怎么弄,上门预约小程序开发
  系统开发
  网站制作|网络推广
  小程序商城系统|微信商城制作
  电话:(微信)
  
  点击一键拨打电话:
  网站制作建设,企业宣传官网网站建设,网站优化公司,商城源码设计制作,微信公众号怎么制作网站,制作一套网站多少钱,分销微信公众号设计,做网站模板网站快速搭建,手机网站建设
  
  公司主营:微信公众号推广开发,小程序制作,网站制作,网络关键词推广排名,app制作开发,微信商城制作等等。
  为网站选择合适的目标关键词,然后对这些目标关键词进行排名优化,这个过程就是关键词优化,我们也可以将关键词优化定义为网站关键词的排名过程。对于长尾关键词,排名的前提是要保证内容页面的“百度快速收录”,主要原因是要承担快速排名的责任。标签的标题属性的使用。
  在不影响页面功能的情况下,我们可以尝试在标签中添加标题属性,这样更有利于蜘蛛爬行信息。直击引流推广现场 整站优化:所谓的整站优化是网站搜索引擎优化(SEO)的高层次应用,是一种高层次的网站营销策略,整个网站的优化服务不是针对特定的关键词,而是以提升网站搜索引擎的友好性为核心,通过提高网站的质量,可以获得更好的排名权重和搜索流量。避免关键字累积 这里主要指的是新闻源站点软件发布,通常根据不同站点的价格计算,如果你能用关键字相关的“软文本”来实现首页使用SEO,那么在这方面的好处是相当可观的。
  这个决定也会影响你的SEO策略。我强调转型或品牌强化。大多数的实际案例告诉我们,在品牌薄弱的情况下,基于在线平台的大型广告转化率相对较低,往往超出了你的能力。
  
  将百度蜘蛛引入目标站点实际上是一个做百度快速收集的过程,通常以以下形式:锚链接是否与关键字相关?SEO不变 外部入口 很多SEO人员,在做长尾关键词排名时,经常会问一个问题,就是我能否用:长尾关键词排名系统。需要明确的是:长尾关键词排名是为了获得点击量,所以尽量避免长尾内容的贡献。在回答这个问题之前,我们先简单了解一下长尾关键词排名系统,它类似于市场上推出的所谓云推广,利用蜘蛛池引导爬行这些需要排名的长尾页面,通常的原则是使用大量的站点进行操作。
  关键词优化只是对少量网站进行修改和优化,优化效果不能一直保持,存在一定的风险,它只能优化少量的关键词,不利于效果的转化。百度相关关键词及常见问题 理论上,我们应该在核心关键字中添加反向链接。为了避免链接的独立和简化,我们通常会在相关关键字的锚文本中添加一些合理的链接,以使链接结构看起来自然而不是人为的。
  在第一种情况下,自我积累的权重是缓慢的,但广告单价高,流量准确而有价值。利用新闻电台制作所谓的“新闻投稿”已经存在多年了。通常,结算成本是以50元300条新闻链为基础计算的。一般情况是一系列文章。网站的结构是扁树,目录结构不应该太深。每个页面从主页上单击的次数不超过三次,这对于搜索引擎来说太深了。
  
  关键词优化与整站优化效果 此前,许多专家博客强调,使用社交媒体运行长尾搜索引擎优化是通过社交媒体发布长尾内容,这其实是一个错误的想法,主要原因是:大型网站转发。搜索引擎优化的变化 关键词优化只能保证排名,而排名必须通过点击才能获得流量,才能获得访问者,而访问者是转化的基础。在图片中使用alt属性。
  此属性可以在无法加载图片时在页面上显示相关的文本信息,效果相同。虽然我们可以在站点中用长尾关键词对交通入口进行排名,但对于蜘蛛来说,我们需要在站点外建立少量高质量的链接,引导蜘蛛继续爬行。长尾关键词排名中的常见问题 一旦权威站点转发长尾内容,就很难把自己的站点排在前排的大型站点中,至少在这个阶段,即使有原始链接,作用也是有限的。
  提高页面加载速度。CSS可以用来解决不使用背景图片的问题,也可以尝试压缩背景图片的大小,你可以在一张图片上放置几个图标,使用CSSsprite,使用背景位置来找到所需的图像位置。减少HTTP请求的数量,提高网页加载的速度。
  
  提高内容相关性 随着熊掌号的推出,搜索引擎优化技术的排名方法正在被削弱。换言之,过去基于超链接技术的搜索排名将被打破,这使得全新的SEO更加注重内容质量和社会影响力。集中网站权重。
  由于蜘蛛分配给每个页面的权重是确定的,并且这些权重将平均分配给每个链接,为了集中网站的权重,我们可以使用“rel=nofollow”属性,告诉蜘蛛可以将权重分配给其他链接而不必抓取目标页面。关键词优化与整站优化的转化效果 在第二种情况下,自己的网站获得了快速的流量,但广告单价低,洪水泛滥,转化率不高。主要区别在于:使用关键字挖掘工具进行查询。
  当你试图写一篇关于热门关键词的文章时,我们通常会查询相关关键词的数量。通过对多个相关关键词进行分类,并在段落内容中合理分配,可以增加内容的广度,从而提高核心关键词和文章的权威性。“内容为王”仍然发挥着非常重要的作用,特别是在新的搜索时代,百度对高质量内容的支持正在不断深化,基于区块链技术对原创内容进行识别保护,使高质量的内容能够得到合理的展示。 查看全部

  芜湖网站制作优化,公众号定制,微信公众号制作网站怎么弄,上门预约小程序开发
  系统开发
  网站制作|网络推广
  小程序商城系统|微信商城制作
  电话:(微信)
  
  点击一键拨打电话:
  网站制作建设,企业宣传官网网站建设,网站优化公司,商城源码设计制作,微信公众号怎么制作网站,制作一套网站多少钱,分销微信公众号设计,做网站模板网站快速搭建,手机网站建设
  
  公司主营:微信公众号推广开发,小程序制作,网站制作,网络关键词推广排名,app制作开发,微信商城制作等等。
  为网站选择合适的目标关键词,然后对这些目标关键词进行排名优化,这个过程就是关键词优化,我们也可以将关键词优化定义为网站关键词的排名过程。对于长尾关键词,排名的前提是要保证内容页面的“百度快速收录”,主要原因是要承担快速排名的责任。标签的标题属性的使用。
  在不影响页面功能的情况下,我们可以尝试在标签中添加标题属性,这样更有利于蜘蛛爬行信息。直击引流推广现场 整站优化:所谓的整站优化是网站搜索引擎优化(SEO)的高层次应用,是一种高层次的网站营销策略,整个网站的优化服务不是针对特定的关键词,而是以提升网站搜索引擎的友好性为核心,通过提高网站的质量,可以获得更好的排名权重和搜索流量。避免关键字累积 这里主要指的是新闻源站点软件发布,通常根据不同站点的价格计算,如果你能用关键字相关的“软文本”来实现首页使用SEO,那么在这方面的好处是相当可观的。
  这个决定也会影响你的SEO策略。我强调转型或品牌强化。大多数的实际案例告诉我们,在品牌薄弱的情况下,基于在线平台的大型广告转化率相对较低,往往超出了你的能力。
  
  将百度蜘蛛引入目标站点实际上是一个做百度快速收集的过程,通常以以下形式:锚链接是否与关键字相关?SEO不变 外部入口 很多SEO人员,在做长尾关键词排名时,经常会问一个问题,就是我能否用:长尾关键词排名系统。需要明确的是:长尾关键词排名是为了获得点击量,所以尽量避免长尾内容的贡献。在回答这个问题之前,我们先简单了解一下长尾关键词排名系统,它类似于市场上推出的所谓云推广,利用蜘蛛池引导爬行这些需要排名的长尾页面,通常的原则是使用大量的站点进行操作。
  关键词优化只是对少量网站进行修改和优化,优化效果不能一直保持,存在一定的风险,它只能优化少量的关键词,不利于效果的转化。百度相关关键词及常见问题 理论上,我们应该在核心关键字中添加反向链接。为了避免链接的独立和简化,我们通常会在相关关键字的锚文本中添加一些合理的链接,以使链接结构看起来自然而不是人为的。
  在第一种情况下,自我积累的权重是缓慢的,但广告单价高,流量准确而有价值。利用新闻电台制作所谓的“新闻投稿”已经存在多年了。通常,结算成本是以50元300条新闻链为基础计算的。一般情况是一系列文章。网站的结构是扁树,目录结构不应该太深。每个页面从主页上单击的次数不超过三次,这对于搜索引擎来说太深了。
  
  关键词优化与整站优化效果 此前,许多专家博客强调,使用社交媒体运行长尾搜索引擎优化是通过社交媒体发布长尾内容,这其实是一个错误的想法,主要原因是:大型网站转发。搜索引擎优化的变化 关键词优化只能保证排名,而排名必须通过点击才能获得流量,才能获得访问者,而访问者是转化的基础。在图片中使用alt属性。
  此属性可以在无法加载图片时在页面上显示相关的文本信息,效果相同。虽然我们可以在站点中用长尾关键词对交通入口进行排名,但对于蜘蛛来说,我们需要在站点外建立少量高质量的链接,引导蜘蛛继续爬行。长尾关键词排名中的常见问题 一旦权威站点转发长尾内容,就很难把自己的站点排在前排的大型站点中,至少在这个阶段,即使有原始链接,作用也是有限的。
  提高页面加载速度。CSS可以用来解决不使用背景图片的问题,也可以尝试压缩背景图片的大小,你可以在一张图片上放置几个图标,使用CSSsprite,使用背景位置来找到所需的图像位置。减少HTTP请求的数量,提高网页加载的速度。
  
  提高内容相关性 随着熊掌号的推出,搜索引擎优化技术的排名方法正在被削弱。换言之,过去基于超链接技术的搜索排名将被打破,这使得全新的SEO更加注重内容质量和社会影响力。集中网站权重。
  由于蜘蛛分配给每个页面的权重是确定的,并且这些权重将平均分配给每个链接,为了集中网站的权重,我们可以使用“rel=nofollow”属性,告诉蜘蛛可以将权重分配给其他链接而不必抓取目标页面。关键词优化与整站优化的转化效果 在第二种情况下,自己的网站获得了快速的流量,但广告单价低,洪水泛滥,转化率不高。主要区别在于:使用关键字挖掘工具进行查询。
  当你试图写一篇关于热门关键词的文章时,我们通常会查询相关关键词的数量。通过对多个相关关键词进行分类,并在段落内容中合理分配,可以增加内容的广度,从而提高核心关键词和文章的权威性。“内容为王”仍然发挥着非常重要的作用,特别是在新的搜索时代,百度对高质量内容的支持正在不断深化,基于区块链技术对原创内容进行识别保护,使高质量的内容能够得到合理的展示。

Woocommerce网站怎么加Google Ads动态再营销代码

网站优化优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2022-04-29 05:15 • 来自相关话题

  Woocommerce网站怎么加Google Ads动态再营销代码
  看这篇文章的小伙伴应该都已经对Google Ads动态再营销是什么,有什么优势有了解了,我就不再赘述,如果还不清楚的小伙伴,可以看下谷歌官方说明:
  要实现动态再营销,在代码层面我们需要做到:
  1. 能抓取到用户浏览产品的ID
  2. 动态再营销Feed中包含相同ID的产品。
  这两点也同样是大家在配置Google Ads动态再营销代码时遇到的问题,要么不会配置代码,抓不到ID,要么虽然抓到ID了,但是Feed里的ID和我们代码抓取的ID不匹配。
  举个常见的例子,再营销Feed的ID的是网站自动生成的Product id,但是代码里抓取的是我们手动设置的SKU,而SKU和product ID不匹配,这时候Ads里就会提示“代码中的值与您 Feed 中的值不匹配“,动态再营销实际就做不到”动态“(代码抓取到用户浏览了产品ABC,系统想要再投ABC产品广告给用户,去Feed里找ABC的产品信息,怎么也找不到,就”动态“不起来了)
  要做到第一点,抓取到用户浏览产品的ID,需要设置数据层,从数据层中抓取。对于第二点,则要注意抓取的ID和Feed里的ID保持一致。对于Woocommerce网站,过去推荐大家使用的google tag manager for wordpress这个插件可以做到以上两点,且设置简单,以下为操作流程:
  一
  Google Ads里设置动态再营销数据源
  1. 点击工具与设置- 受众群体管理器
  
  2. 点击左侧“您的数据源“-设置代码
  
  3. 选择“收集用户在您网站上执行的特定操作数据,以展示个性化广告“,业务类型选“零售”,点击继续
  
  4. 选择“使用Google跟踪代码管理器“,获取转化ID
  
  二
  插件后里做再营销相关设置
  2. 做动态再营销相关设置
  Google Ads Remarketing: 不勾选
  Google Ads Business Vertical: Retail
  
  Woocomerce网站的product id是特殊的post id, 由wp自动生成。而SKU则是我们手动设置的。如果用插件上传Feed,具体抓取哪个取决于插件和我们的设置。
  根据Feed ID设置方式的不同,product id prefix和use sku instead of ID的设置不同,具体判断方法如下:
  
  以上设置完后,点击Save Changes.
  三
  GTM中设置动态再营销代码
  1. 打开GTM,选择之前导入了GA4电子商务事件的工作区,点击新建代码
  
  2. 如下设置代码
  此代码中引用的动态再营销事件变量和触发器,都是上一篇文章预设好的,直接引用即可。如果还没设置,按此教程设置:
  
  3. 预览与测试
  GTM预览中走一遍完整的电子商务流程,确认每个环节都触发了动态再营销代码,且代码中抓取到了动态参数.
  以查看产品为例,点击触发成功的代码,然后点击右上角“Value“,确认value中抓到了item id等参数:
  PS:注意核对这里抓取到的Item id与Feed中的ID对应
  
  4. 确认无误后,发布代码,Google Ads动态再营销代码即开始生效
  相关文章:
  参考文章:
  交流更多GA GTM相关内容,欢迎加入豌豆出海笔记GA GTM交流群
   查看全部

  Woocommerce网站怎么加Google Ads动态再营销代码
  看这篇文章的小伙伴应该都已经对Google Ads动态再营销是什么,有什么优势有了解了,我就不再赘述,如果还不清楚的小伙伴,可以看下谷歌官方说明:
  要实现动态再营销,在代码层面我们需要做到:
  1. 能抓取到用户浏览产品的ID
  2. 动态再营销Feed中包含相同ID的产品。
  这两点也同样是大家在配置Google Ads动态再营销代码时遇到的问题,要么不会配置代码,抓不到ID,要么虽然抓到ID了,但是Feed里的ID和我们代码抓取的ID不匹配。
  举个常见的例子,再营销Feed的ID的是网站自动生成的Product id,但是代码里抓取的是我们手动设置的SKU,而SKU和product ID不匹配,这时候Ads里就会提示“代码中的值与您 Feed 中的值不匹配“,动态再营销实际就做不到”动态“(代码抓取到用户浏览了产品ABC,系统想要再投ABC产品广告给用户,去Feed里找ABC的产品信息,怎么也找不到,就”动态“不起来了)
  要做到第一点,抓取到用户浏览产品的ID,需要设置数据层,从数据层中抓取。对于第二点,则要注意抓取的ID和Feed里的ID保持一致。对于Woocommerce网站,过去推荐大家使用的google tag manager for wordpress这个插件可以做到以上两点,且设置简单,以下为操作流程:
  一
  Google Ads里设置动态再营销数据源
  1. 点击工具与设置- 受众群体管理器
  
  2. 点击左侧“您的数据源“-设置代码
  
  3. 选择“收集用户在您网站上执行的特定操作数据,以展示个性化广告“,业务类型选“零售”,点击继续
  
  4. 选择“使用Google跟踪代码管理器“,获取转化ID
  
  二
  插件后里做再营销相关设置
  2. 做动态再营销相关设置
  Google Ads Remarketing: 不勾选
  Google Ads Business Vertical: Retail
  
  Woocomerce网站的product id是特殊的post id, 由wp自动生成。而SKU则是我们手动设置的。如果用插件上传Feed,具体抓取哪个取决于插件和我们的设置。
  根据Feed ID设置方式的不同,product id prefix和use sku instead of ID的设置不同,具体判断方法如下:
  
  以上设置完后,点击Save Changes.
  三
  GTM中设置动态再营销代码
  1. 打开GTM,选择之前导入了GA4电子商务事件的工作区,点击新建代码
  
  2. 如下设置代码
  此代码中引用的动态再营销事件变量和触发器,都是上一篇文章预设好的,直接引用即可。如果还没设置,按此教程设置:
  
  3. 预览与测试
  GTM预览中走一遍完整的电子商务流程,确认每个环节都触发了动态再营销代码,且代码中抓取到了动态参数.
  以查看产品为例,点击触发成功的代码,然后点击右上角“Value“,确认value中抓到了item id等参数:
  PS:注意核对这里抓取到的Item id与Feed中的ID对应
  
  4. 确认无误后,发布代码,Google Ads动态再营销代码即开始生效
  相关文章:
  参考文章:
  交流更多GA GTM相关内容,欢迎加入豌豆出海笔记GA GTM交流群
  

网络爬虫之BeautifulSoup详解(含多个案例)

网站优化优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2022-04-29 05:14 • 来自相关话题

  网络爬虫之BeautifulSoup详解(含多个案例)
  在文章中,我们可以很方便的获取网页内容即网页源代码,但通常我们所需要的只是里面的部分数据,这时就需要对网页内容进行解析,从而提取出有意义的数据。比较常见的方法有正则表达式、HTML或XML解析库等。本文我们就给大家介绍一个非常流行、实用、高效的网页解析第三方库-BeautifulSoup。
  BeautifulSoup是Python的一个HTML或XML的第三方解析库,可以用它方便地从网页中提取数据。它提供一些简单的、Python式的函数来处理导航、搜索、修改分析树等功能。它是一个工具箱,利用它可以省去很多烦琐的提取工作,提高了解析效率。
  (1)安装BeautifulSoup库和lxml库:pip install BeautifulSoup4 和pip install lxml
  (2)导入BeautifulSoup类:from bs4 import BeautifulSoup
  (3)创建BeautifulSoup对象,传递网页内容以及解析的方法,例如:
  soup = BeautifulSoup(text, "html.parser")
  (4)通过soup.prettify()方法对网页内容进行格式化输出。
  (5)获取网页中的标签及其内容,例如:soup.标签名、soup.标签名.string等。
  BeautifulSoup类的基本元素
  
  简单程序演示基本元素用法
  m_page.html文件内容如下:
   手把手教你学编程 手把手教你学编程系列资源 手把手教你学Python系列 (1)手把手教你学Python(基础篇): 腾讯课堂 CSDN学院 (2)手把手教你学Python(进阶篇): 腾讯课堂 CSDN学院 手把手教你学Android系列 (1)手把手教你学Android(基础篇):腾讯课堂 (2)手把手教你学Android(案例篇):腾讯课堂 联系方式:1281147324(QQ)
  页面效果如下:
  
  
  网页标签遍历的主要属性
  
  标签树遍历示意图(m_page.html文件)
  
  标签树遍历示例
  
  m_test.html文件内容如下:
   手把手教你学编程 .python{ background-color:#9DF; padding:10; } .android{ background-color:#9CF; padding:10; } body{ background-color:#000; width:1000px; margin:auto; } #content{ background-color:#dFF; height:800px; } .title{ font-size:20px; font-weight:bold; color:#00F; } .stress{ font-weight:bold; font-style:italic; text-decoration:underline; padding-left:2px; padding-right:6px; color:#F00; } a{ color:#909; text-decoration:underline; } a:hover{ color:#00F; font-size:large; } 手把手教你学编程系列资源 手把手教你学Python系列 (1)手把手教你学Python(基础篇): 腾讯课堂 CSDN学院 (2)手把手教你学Python(进阶篇): 腾讯课堂 CSDN学院 手把手教你学Android系列 (1)手把手教你学Android(基础篇):腾讯课堂 (2)手把手教你学Android(案例篇):腾讯课堂 联系方式:1281147324(QQ)
  页面效果如下:
  
  
  想一想,尝试实现下述要求。(提示:class属性值是一个列表。)
  通过标签遍历虽然可以查找到每一个标签,但过程比较繁琐,效率不高。在BeautifulSoup中为我们提供了一些高效的方法可以根据条件快速查找到符合条件的标签。
  标准选择器
  标 准 选 择 器 示 例
  
  CSS 选 择 器 示 例
  
  实战案例-获取各省份的大学信息
  
  代码参考
  import requestsfrom bs4 import BeautifulSoup<br /><br />def get_text(url): try: headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '} # 构建请求头 res = requests.get(url, headers=headers) # 发送请求 res.encoding = res.apparent_encoding # 设置编码格式 res.raise_for_status() # 是否成功访问 return res.text # 返回网页源代码 except Exception as e: print(e) # 抛出异常, 打印异常信息<br /><br />def parse_province(text): # 解析网页获取省份及其链接 b_soup = BeautifulSoup(text, "html.parser") # 构建BeautifulSoup对象 ul_tag = b_soup.find(class_="txt3 center") # 找到ul标签 a_tags = ul_tag.select("li a") # 找到所有a标签 province_dict = {} # 定义字典 for item in a_tags: # 循环遍历每一个超链接 province_dict[item.string] = item["href"][2:] # 以省份为键,链接为值构建字典 province_dict.pop("海外") # 删除不需要的记录 return province_dict # 返回结果<br /><br />def get_schools_by_province(url): # 获取某个省份的所有学校信息 temp_content = get_text(url) # 请求网页,得到网页源代码 b_soup = BeautifulSoup(temp_content, "html.parser") # 构建BeautifulSoup对象 a_tags = b_soup.select("ul.l4 li a") # 获取所有的学校超链接 schools = [] # 定义列表,保存该省份所有的学校 for item in a_tags: # 循环遍历每一个标签 schools.append(item.string) # 获取标签内容即学校信息 return schools # 返回学校信息<br /><br />if __name__ == '__main__': index_url = "https://daxue.911cha.com/" # 起始页网址 content = get_text(index_url) # 请求网页获取源代码 provinces = parse_province(content) # 获取省份及其链接 with open("schools.txt", mode="w", encoding="utf-8") as fp: # 保存到文件 for key, value in provinces.items(): print("当前解析的省份为:", key, index_url + value) school_list = get_schools_by_province(index_url + value) # 获取某个省份的院校列表 for school in school_list: fp.write(",".join([school, key]) + "\n") # 保存学校、省份信息,单独占一行<br />
  相关代码资源,可关注Python资源分享微信公众号,回复 bs即可获取。 查看全部

  网络爬虫之BeautifulSoup详解(含多个案例)
  在文章中,我们可以很方便的获取网页内容即网页源代码,但通常我们所需要的只是里面的部分数据,这时就需要对网页内容进行解析,从而提取出有意义的数据。比较常见的方法有正则表达式、HTML或XML解析库等。本文我们就给大家介绍一个非常流行、实用、高效的网页解析第三方库-BeautifulSoup。
  BeautifulSoup是Python的一个HTML或XML的第三方解析库,可以用它方便地从网页中提取数据。它提供一些简单的、Python式的函数来处理导航、搜索、修改分析树等功能。它是一个工具箱,利用它可以省去很多烦琐的提取工作,提高了解析效率。
  (1)安装BeautifulSoup库和lxml库:pip install BeautifulSoup4 和pip install lxml
  (2)导入BeautifulSoup类:from bs4 import BeautifulSoup
  (3)创建BeautifulSoup对象,传递网页内容以及解析的方法,例如:
  soup = BeautifulSoup(text, "html.parser")
  (4)通过soup.prettify()方法对网页内容进行格式化输出。
  (5)获取网页中的标签及其内容,例如:soup.标签名、soup.标签名.string等。
  BeautifulSoup类的基本元素
  
  简单程序演示基本元素用法
  m_page.html文件内容如下:
   手把手教你学编程 手把手教你学编程系列资源 手把手教你学Python系列 (1)手把手教你学Python(基础篇): 腾讯课堂 CSDN学院 (2)手把手教你学Python(进阶篇): 腾讯课堂 CSDN学院 手把手教你学Android系列 (1)手把手教你学Android(基础篇):腾讯课堂 (2)手把手教你学Android(案例篇):腾讯课堂 联系方式:1281147324(QQ)
  页面效果如下:
  
  
  网页标签遍历的主要属性
  
  标签树遍历示意图(m_page.html文件)
  
  标签树遍历示例
  
  m_test.html文件内容如下:
   手把手教你学编程 .python{ background-color:#9DF; padding:10; } .android{ background-color:#9CF; padding:10; } body{ background-color:#000; width:1000px; margin:auto; } #content{ background-color:#dFF; height:800px; } .title{ font-size:20px; font-weight:bold; color:#00F; } .stress{ font-weight:bold; font-style:italic; text-decoration:underline; padding-left:2px; padding-right:6px; color:#F00; } a{ color:#909; text-decoration:underline; } a:hover{ color:#00F; font-size:large; } 手把手教你学编程系列资源 手把手教你学Python系列 (1)手把手教你学Python(基础篇): 腾讯课堂 CSDN学院 (2)手把手教你学Python(进阶篇): 腾讯课堂 CSDN学院 手把手教你学Android系列 (1)手把手教你学Android(基础篇):腾讯课堂 (2)手把手教你学Android(案例篇):腾讯课堂 联系方式:1281147324(QQ)
  页面效果如下:
  
  
  想一想,尝试实现下述要求。(提示:class属性值是一个列表。)
  通过标签遍历虽然可以查找到每一个标签,但过程比较繁琐,效率不高。在BeautifulSoup中为我们提供了一些高效的方法可以根据条件快速查找到符合条件的标签。
  标准选择器
  标 准 选 择 器 示 例
  
  CSS 选 择 器 示 例
  
  实战案例-获取各省份的大学信息
  
  代码参考
  import requestsfrom bs4 import BeautifulSoup<br /><br />def get_text(url): try: headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '} # 构建请求头 res = requests.get(url, headers=headers) # 发送请求 res.encoding = res.apparent_encoding # 设置编码格式 res.raise_for_status() # 是否成功访问 return res.text # 返回网页源代码 except Exception as e: print(e) # 抛出异常, 打印异常信息<br /><br />def parse_province(text): # 解析网页获取省份及其链接 b_soup = BeautifulSoup(text, "html.parser") # 构建BeautifulSoup对象 ul_tag = b_soup.find(class_="txt3 center") # 找到ul标签 a_tags = ul_tag.select("li a") # 找到所有a标签 province_dict = {} # 定义字典 for item in a_tags: # 循环遍历每一个超链接 province_dict[item.string] = item["href"][2:] # 以省份为键,链接为值构建字典 province_dict.pop("海外") # 删除不需要的记录 return province_dict # 返回结果<br /><br />def get_schools_by_province(url): # 获取某个省份的所有学校信息 temp_content = get_text(url) # 请求网页,得到网页源代码 b_soup = BeautifulSoup(temp_content, "html.parser") # 构建BeautifulSoup对象 a_tags = b_soup.select("ul.l4 li a") # 获取所有的学校超链接 schools = [] # 定义列表,保存该省份所有的学校 for item in a_tags: # 循环遍历每一个标签 schools.append(item.string) # 获取标签内容即学校信息 return schools # 返回学校信息<br /><br />if __name__ == '__main__': index_url = "https://daxue.911cha.com/" # 起始页网址 content = get_text(index_url) # 请求网页获取源代码 provinces = parse_province(content) # 获取省份及其链接 with open("schools.txt", mode="w", encoding="utf-8") as fp: # 保存到文件 for key, value in provinces.items(): print("当前解析的省份为:", key, index_url + value) school_list = get_schools_by_province(index_url + value) # 获取某个省份的院校列表 for school in school_list: fp.write(",".join([school, key]) + "\n") # 保存学校、省份信息,单独占一行<br />
  相关代码资源,可关注Python资源分享微信公众号,回复 bs即可获取。

网页源代码抓取工具(网页源代码抓取工具实例之vuerpe自定义轮播图实例)

网站优化优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2022-04-20 13:04 • 来自相关话题

  网页源代码抓取工具(网页源代码抓取工具实例之vuerpe自定义轮播图实例)
  网页源代码抓取工具实例之vuerpe自定义轮播图实例-微信大学-微信大学
  px换一个东西算然后带过去就可以了。如果是不换东西算px那就要加一些特殊处理,参考react有点复杂,就不推荐了。
  生成一下页面,看看每一块都转换了多少像素进去,算一下重算一遍,
  有swiper这个插件可以自定义轮播图的大小如果想学习可以看看他的博客twidere/swiper-bootcamp
  mux,
  可以用wxwidget自己定义浏览器尺寸嘛
  这个问题不是很简单吗,你要做什么样的轮播?只是轮播一张图吗?如果你是想做组件的话,jquery-bootstrap-轮播组件就可以,如果你只是想作为代码在页面中划分区域那就css-margin-top-9x如果只是简单的放大缩小轮播图的话可以自己做,
  手机上其实有一个轮播扩展库叫dagel-panel,可以实现。如果用ppt的话可以看看万彩办公大师模拟演示一下。
  百度有个更好的。
  可以将需要放大缩小的源码发给我,px换百分比。
  使用px-margin-top-9x这个拓展,用9的图,然后确保页面左右两端宽度不重叠。
  轮播拼页可以用jquery/jquery-bootstrap-bars
  用百度吧,可以实现。
  ppt
  虽然能够实现,但一旦遇到这种需求,我一般的处理方法是装两套扩展,一套在windows上,一套在mac上,重点突出一个跨浏览器,如果在mac上只需要2步:swiper-booth-9x或webkit-bootstrap-9x如果要用png可以到pnglayer这个app中去插入, 查看全部

  网页源代码抓取工具(网页源代码抓取工具实例之vuerpe自定义轮播图实例)
  网页源代码抓取工具实例之vuerpe自定义轮播图实例-微信大学-微信大学
  px换一个东西算然后带过去就可以了。如果是不换东西算px那就要加一些特殊处理,参考react有点复杂,就不推荐了。
  生成一下页面,看看每一块都转换了多少像素进去,算一下重算一遍,
  有swiper这个插件可以自定义轮播图的大小如果想学习可以看看他的博客twidere/swiper-bootcamp
  mux,
  可以用wxwidget自己定义浏览器尺寸嘛
  这个问题不是很简单吗,你要做什么样的轮播?只是轮播一张图吗?如果你是想做组件的话,jquery-bootstrap-轮播组件就可以,如果你只是想作为代码在页面中划分区域那就css-margin-top-9x如果只是简单的放大缩小轮播图的话可以自己做,
  手机上其实有一个轮播扩展库叫dagel-panel,可以实现。如果用ppt的话可以看看万彩办公大师模拟演示一下。
  百度有个更好的。
  可以将需要放大缩小的源码发给我,px换百分比。
  使用px-margin-top-9x这个拓展,用9的图,然后确保页面左右两端宽度不重叠。
  轮播拼页可以用jquery/jquery-bootstrap-bars
  用百度吧,可以实现。
  ppt
  虽然能够实现,但一旦遇到这种需求,我一般的处理方法是装两套扩展,一套在windows上,一套在mac上,重点突出一个跨浏览器,如果在mac上只需要2步:swiper-booth-9x或webkit-bootstrap-9x如果要用png可以到pnglayer这个app中去插入,

网页源代码抓取工具(爬取在豆瓣网上的电影《超时空同居》导演和演员信息 )

网站优化优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2022-04-19 09:13 • 来自相关话题

  网页源代码抓取工具(爬取在豆瓣网上的电影《超时空同居》导演和演员信息
)
  接下来,我们将分享一个非常简单的例子。我们想在豆瓣上爬取电影《时空同居》的导演和演员信息。
  首先我们找到电影的网址:
  
  右键查看网页查看页面源码的源码(也可以进入开发者模式(inspect)):
  
  接下来,我们输入网页的源代码。我们要采集的信息在源代码中,输入关键字即可查看。比如这里我们输入'雷佳音'来定位我们要找的位置:
  
  接下来我们需要对TML格式进行分析,比如我们要找出所有的主角:
  
  可以看到有一个通用的规则:star的名字对应的节点的名字是a,属性都是rel="v:starring",这样我们就可以很方便的使用xpath语法来定位拥有的元素这个元素。节点,然后找出所有结果。
  同理,director名字对应的节点名命名为a,属性都是rel="v:dir​​ectedBy"。我们也可以通过这个定位找到对应的文字:
  
  具体代码如下:
  import requests

from lxml import etree





url=&#39;https://movie.douban.com/subje ... 39%3B #输入我们的url

get = requests.get(url).text # get(url) 得到我们的网页, text将源网页转化为字符串





selector = etree.HTML(get) # 将源码转换为xpath可以识别的TML格式





info = {} #字典用于储存信息

info[&#39;电影&#39;] = selector.xpath(&#39;//title/text()&#39;)[0].strip() # 定位电影名字

info[&#39;导演&#39;]=selector.xpath(&#39;//a[@rel="v:directedBy"]/text()&#39;) # 定位导演名字

info[&#39;演员&#39;]=selector.xpath(&#39;//a[@rel="v:starring"]/text()&#39;) # 定位演员名字

print(info)
  最后我们得到一个字典集的结果:
  {&#39;电影&#39;: &#39;超时空同居 (豆瓣)&#39;, &#39;导演&#39;: [&#39;苏伦&#39;], &#39;演员&#39;: [&#39;雷佳音&#39;, &#39;佟丽娅&#39;, &#39;张衣&#39;, &#39;于和伟&#39;, &#39;王正佳&#39;, &#39;陶虹&#39;, &#39;李念&#39;, &#39;李光洁&#39;, &#39;杨玏&#39;, &#39;范明&#39;, &#39;徐峥&#39;, &#39;杨迪&#39;, &#39;方龄&#39;, &#39;陈昊&#39;]}
  实例分享2——爬取json格式的豆瓣电影信息
  首先,json是一种轻量级的数据交换格式。其简洁明了的层次结构使JSON成为一种理想的数据交换语言,易于人类读写,也易于机器解析生成,有效改善网络传输。效率。
  在我们爬取的过程中,有时可以在开发者模式返回的网页中找到完整的json格式数据。这时候我们可以使用requests包中的json函数将爬取的原文转换成格式,方便我们提取内容。我们以豆瓣电影为例:
  
  这是我们点击分类后看到的电影信息。如果我们想爬取这些电影的信息,可以右键进入开发者模式(inspector)。
  
  开启开发者模式后一定要刷新一次,否则之前收到的页面信息将无法显示。然后我们在右侧选项卡上选择网络,点击下面的XHR选项,我们会看到一个返回的网页,双击它。
  
  上图是打开的json文件。因为我的电脑已经下载了json插件,所以格式比较清晰(使用Chrome浏览器的同学可以进入Chrome商店下载Juan Ramón JSON Beautifier Chrome插件)。其实Json文件也可以理解为一个大字典,里面有很多层的小字典和列表。我们找到json网页后,只需要使用requests将其转换成json格式,就可以很方便的提取信息了。代码显示如下:
  import requests
url=&#39;https://movie.douban.com/j/new ... e%3D0,10&tags=&start=0&#39;
get = requests.get(url).json() #用json()函数得到网页源码

get = get[&#39;data&#39;]

info = {}

for i in range(len(get)):



info[get[i][&#39;title&#39;]] = [get[i][&#39;directors&#39;], get[i][&#39;rate&#39;] ] #提取每部电影的导演和评分

print(info) 查看全部

  网页源代码抓取工具(爬取在豆瓣网上的电影《超时空同居》导演和演员信息
)
  接下来,我们将分享一个非常简单的例子。我们想在豆瓣上爬取电影《时空同居》的导演和演员信息。
  首先我们找到电影的网址:
  
  右键查看网页查看页面源码的源码(也可以进入开发者模式(inspect)):
  
  接下来,我们输入网页的源代码。我们要采集的信息在源代码中,输入关键字即可查看。比如这里我们输入'雷佳音'来定位我们要找的位置:
  
  接下来我们需要对TML格式进行分析,比如我们要找出所有的主角:
  
  可以看到有一个通用的规则:star的名字对应的节点的名字是a,属性都是rel="v:starring",这样我们就可以很方便的使用xpath语法来定位拥有的元素这个元素。节点,然后找出所有结果。
  同理,director名字对应的节点名命名为a,属性都是rel="v:dir​​ectedBy"。我们也可以通过这个定位找到对应的文字:
  
  具体代码如下:
  import requests

from lxml import etree





url=&#39;https://movie.douban.com/subje ... 39%3B #输入我们的url

get = requests.get(url).text # get(url) 得到我们的网页, text将源网页转化为字符串





selector = etree.HTML(get) # 将源码转换为xpath可以识别的TML格式





info = {} #字典用于储存信息

info[&#39;电影&#39;] = selector.xpath(&#39;//title/text()&#39;)[0].strip() # 定位电影名字

info[&#39;导演&#39;]=selector.xpath(&#39;//a[@rel="v:directedBy"]/text()&#39;) # 定位导演名字

info[&#39;演员&#39;]=selector.xpath(&#39;//a[@rel="v:starring"]/text()&#39;) # 定位演员名字

print(info)
  最后我们得到一个字典集的结果:
  {&#39;电影&#39;: &#39;超时空同居 (豆瓣)&#39;, &#39;导演&#39;: [&#39;苏伦&#39;], &#39;演员&#39;: [&#39;雷佳音&#39;, &#39;佟丽娅&#39;, &#39;张衣&#39;, &#39;于和伟&#39;, &#39;王正佳&#39;, &#39;陶虹&#39;, &#39;李念&#39;, &#39;李光洁&#39;, &#39;杨玏&#39;, &#39;范明&#39;, &#39;徐峥&#39;, &#39;杨迪&#39;, &#39;方龄&#39;, &#39;陈昊&#39;]}
  实例分享2——爬取json格式的豆瓣电影信息
  首先,json是一种轻量级的数据交换格式。其简洁明了的层次结构使JSON成为一种理想的数据交换语言,易于人类读写,也易于机器解析生成,有效改善网络传输。效率。
  在我们爬取的过程中,有时可以在开发者模式返回的网页中找到完整的json格式数据。这时候我们可以使用requests包中的json函数将爬取的原文转换成格式,方便我们提取内容。我们以豆瓣电影为例:
  
  这是我们点击分类后看到的电影信息。如果我们想爬取这些电影的信息,可以右键进入开发者模式(inspector)。
  
  开启开发者模式后一定要刷新一次,否则之前收到的页面信息将无法显示。然后我们在右侧选项卡上选择网络,点击下面的XHR选项,我们会看到一个返回的网页,双击它。
  
  上图是打开的json文件。因为我的电脑已经下载了json插件,所以格式比较清晰(使用Chrome浏览器的同学可以进入Chrome商店下载Juan Ramón JSON Beautifier Chrome插件)。其实Json文件也可以理解为一个大字典,里面有很多层的小字典和列表。我们找到json网页后,只需要使用requests将其转换成json格式,就可以很方便的提取信息了。代码显示如下:
  import requests
url=&#39;https://movie.douban.com/j/new ... e%3D0,10&tags=&start=0&#39;
get = requests.get(url).json() #用json()函数得到网页源码

get = get[&#39;data&#39;]

info = {}

for i in range(len(get)):



info[get[i][&#39;title&#39;]] = [get[i][&#39;directors&#39;], get[i][&#39;rate&#39;] ] #提取每部电影的导演和评分

print(info)

还能有 Selenium 都抓取不到的内容?

网站优化优采云 发表了文章 • 0 个评论 • 58 次浏览 • 2022-05-25 21:12 • 来自相关话题

  还能有 Selenium 都抓取不到的内容?
  有一些同学在写爬虫的时候,过于依赖 Selenium,觉得只要使用模拟浏览器,在不被网站屏蔽的情况下,就可以爬到任何内容。
  今天我们不讨论字体反爬虫和 CSS 反爬虫这两种情况。我们来看一段非常简单的网页。这个网页只有一个HTML 文件,不加载特殊字体,不加载 CSS 文件。
  
  这个网页的奇怪之处在哪里呢?我们试一试使用 XPath Helper 来提取网页上面的红色文字,发现XPath 竟然无法找到这段文字,如下图所示:
  
  然后我们使用 Selenium 来试一试:
  
  Selenium果然无法获取 红字到内容。我们再打印一下网页的源代码:
  
  这一次,Selenium 获取到的源代码,竟然跟 Chrome 开发者工具里面显示的源代码不一样?这个问题的关键,就在开发者工具里面的这样一段文字:
  
  因为这个节点是一个shadow DOM[1]。shadow DOM 的行为跟 iframe很像,都是把一段HTML 信息嵌入到另一个 HTML 中。但不同的是,iframe被嵌入的地址需要额外再搭建一个 HTTP服务,而 shadow DOM 可以只嵌入一段 HTML 代码,所以它比 iframe 更节省资源。在上面的截图中,通过下面这三行代码,我们把一个新的
  标签嵌入到了原来的 HTML 中:
      var content = document.querySelector('.content');<br />    var root = content.attachShadow({mode: 'open'});<br />    root.innerHTML = '<p class="real_content" style="color: red">你抓不到这段文字的!'<br /></p>
  而这个被嵌入的影子标签,就像 iframe 一样,是无法直接使用 Selenium 提取的。如果强行提取,那么,我们需要使用 JavaScript 获取 shadow DOM,然后再进行提取。我们来看一段可以正常工作的代码:
  shadow = driver.execute_script('return document.querySelector(".content").shadowRoot')<br />content = shadow.find_element_by_class_name('real_content')<br />print(content.text)<br />
  运行效果如下图所示:
  
  这段代码,首先通过 JavaScript 找到shadow-root的父节点元素,然后返回这个元素的.shadowRoot属性。在 Python 里面拿到这个属性以后,使用.find_element_by_class_name()方法获取里面的内容。要特别注意的是,拿到shadow-root节点以后,只能通过 CSS 选择器进一步筛选里面的内容,不能用 XPath,否则会导致报错。参考资料[1]
  shadow DOM: 查看全部

  还能有 Selenium 都抓取不到的内容?
  有一些同学在写爬虫的时候,过于依赖 Selenium,觉得只要使用模拟浏览器,在不被网站屏蔽的情况下,就可以爬到任何内容。
  今天我们不讨论字体反爬虫和 CSS 反爬虫这两种情况。我们来看一段非常简单的网页。这个网页只有一个HTML 文件,不加载特殊字体,不加载 CSS 文件。
  
  这个网页的奇怪之处在哪里呢?我们试一试使用 XPath Helper 来提取网页上面的红色文字,发现XPath 竟然无法找到这段文字,如下图所示:
  
  然后我们使用 Selenium 来试一试:
  
  Selenium果然无法获取 红字到内容。我们再打印一下网页的源代码:
  
  这一次,Selenium 获取到的源代码,竟然跟 Chrome 开发者工具里面显示的源代码不一样?这个问题的关键,就在开发者工具里面的这样一段文字:
  
  因为这个节点是一个shadow DOM[1]。shadow DOM 的行为跟 iframe很像,都是把一段HTML 信息嵌入到另一个 HTML 中。但不同的是,iframe被嵌入的地址需要额外再搭建一个 HTTP服务,而 shadow DOM 可以只嵌入一段 HTML 代码,所以它比 iframe 更节省资源。在上面的截图中,通过下面这三行代码,我们把一个新的
  标签嵌入到了原来的 HTML 中:
      var content = document.querySelector('.content');<br />    var root = content.attachShadow({mode: 'open'});<br />    root.innerHTML = '<p class="real_content" style="color: red">你抓不到这段文字的!'<br /></p>
  而这个被嵌入的影子标签,就像 iframe 一样,是无法直接使用 Selenium 提取的。如果强行提取,那么,我们需要使用 JavaScript 获取 shadow DOM,然后再进行提取。我们来看一段可以正常工作的代码:
  shadow = driver.execute_script('return document.querySelector(".content").shadowRoot')<br />content = shadow.find_element_by_class_name('real_content')<br />print(content.text)<br />
  运行效果如下图所示:
  
  这段代码,首先通过 JavaScript 找到shadow-root的父节点元素,然后返回这个元素的.shadowRoot属性。在 Python 里面拿到这个属性以后,使用.find_element_by_class_name()方法获取里面的内容。要特别注意的是,拿到shadow-root节点以后,只能通过 CSS 选择器进一步筛选里面的内容,不能用 XPath,否则会导致报错。参考资料[1]
  shadow DOM:

抓取崔庆才个人博客网站前端源码

网站优化优采云 发表了文章 • 0 个评论 • 40 次浏览 • 2022-05-23 10:36 • 来自相关话题

  抓取崔庆才个人博客网站前端源码
  微信公众号『stormsha』,后台回复『仿站工具』获取工具
  工具获取方式二:仿站小工具官网
  崔庆才博客
  从网站源码来看此博客应该是使用的wordpress框架,原站用什么写的不重要,重要的是快速使用python实现全栈开发
  2、开扒
  下载工具后,解压直接打开exe程序,按如下步骤抓取即可
  
  
  3、扒取结果
  
  4、整理
  新建一个templates文件
  把扒下的除static文件之外,其它文件中的html文件都放入templates文件中,把static文件和templates放于同级目录,结果
  
  
  5、发现什么了吗?
  django项目文件:static、templates
  把index.html打开看一下效果,完美运行
  
  6、总结:
  学习python只有两个方向是最好找工作的,python web、python爬虫,之前我也在《让每行代码产生价值》一文中提到,如果你是因为数据科学的兴起才有了学习python的想法,那你错了,你应该去学习数据科学。对于数据科学而言python只是一个工具。
  如果你没有一个好的学历背景,学习python数据科学仍然是没有什么竞争力的。学习python web和python爬虫你可以从事数据科学相关工作,比如数据可视化、数据分析、数据抓取等。
  学习python web只有具备全栈开发能力才有竞争力。只会python你就是一块砖,搬到哪里都一样,会全栈开发你就是一个设计师,其实也不需要全栈,会点python web 加 爬虫就可以搞很多有意思的事情了。如果想快速入门python全栈那基本是不现实。按我的思路来,快速学习找到一份工作问题不大。扒取网站前端的源码应该是一个学习python web开发人员必备的技能,具备了此能力你可以快速搭建起一个网站。
  学习python就应该从实际需求出发去学习。接下来我会把崔大佬的个人博客网站使用django实现。最终部署上线,一个人的精力有限,计划每天在工作之余花费四个小时左右一点点把这个项目完善,后期我会把项目放在github上,每天进步一点点。
  今天看到的一段鸡汤文:
  如何评估一个人的职业化程度?
  ①、时间感强、时间颗粒度小,最大限度地提升自己的时间价值。
  ②、能够分清事实与观点,只用实力佐证事实,而不用情绪陈述观点。
  
  长按识别二维码
  
   查看全部

  抓取崔庆才个人博客网站前端源码
  微信公众号『stormsha』,后台回复『仿站工具』获取工具
  工具获取方式二:仿站小工具官网
  崔庆才博客
  从网站源码来看此博客应该是使用的wordpress框架,原站用什么写的不重要,重要的是快速使用python实现全栈开发
  2、开扒
  下载工具后,解压直接打开exe程序,按如下步骤抓取即可
  
  
  3、扒取结果
  
  4、整理
  新建一个templates文件
  把扒下的除static文件之外,其它文件中的html文件都放入templates文件中,把static文件和templates放于同级目录,结果
  
  
  5、发现什么了吗?
  django项目文件:static、templates
  把index.html打开看一下效果,完美运行
  
  6、总结:
  学习python只有两个方向是最好找工作的,python web、python爬虫,之前我也在《让每行代码产生价值》一文中提到,如果你是因为数据科学的兴起才有了学习python的想法,那你错了,你应该去学习数据科学。对于数据科学而言python只是一个工具。
  如果你没有一个好的学历背景,学习python数据科学仍然是没有什么竞争力的。学习python web和python爬虫你可以从事数据科学相关工作,比如数据可视化、数据分析、数据抓取等。
  学习python web只有具备全栈开发能力才有竞争力。只会python你就是一块砖,搬到哪里都一样,会全栈开发你就是一个设计师,其实也不需要全栈,会点python web 加 爬虫就可以搞很多有意思的事情了。如果想快速入门python全栈那基本是不现实。按我的思路来,快速学习找到一份工作问题不大。扒取网站前端的源码应该是一个学习python web开发人员必备的技能,具备了此能力你可以快速搭建起一个网站。
  学习python就应该从实际需求出发去学习。接下来我会把崔大佬的个人博客网站使用django实现。最终部署上线,一个人的精力有限,计划每天在工作之余花费四个小时左右一点点把这个项目完善,后期我会把项目放在github上,每天进步一点点。
  今天看到的一段鸡汤文:
  如何评估一个人的职业化程度?
  ①、时间感强、时间颗粒度小,最大限度地提升自己的时间价值。
  ②、能够分清事实与观点,只用实力佐证事实,而不用情绪陈述观点。
  
  长按识别二维码
  
  

不用写代码的爬虫工具教程——推荐

网站优化优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2022-05-21 18:52 • 来自相关话题

  不用写代码的爬虫工具教程——推荐
  最近一直在写课程,网上找资料,找到一个Web Scraper 的工具教程,对于那些不想写爬虫代码又想获取信息的人来说,非常友好。
  
  不过要提醒的是,Web Scraper 是一款专注于文本爬取的爬虫工具。也就是这个工具只能爬取文本类的信息,多媒体类的图片,视频爬取不了。
  下面是博主列出的优点,缺点及简答的总结:
  Web Scraper 的优点Web Scraper 的缺点总结
  掌握了 Web Scraper 的使用,基本上可以应付学习工作中90%的数据爬取需求。相对于 python 爬虫,虽然灵活度上受到了限制,但是低廉的学习成本可以大大节省学习时间,快速解决手头的工作,提高整体的工作效率。综合来看,Web Scraper 还是非常值得去学习的。
  博主网址:
  %E7%AE%80%E6%98%93%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/
  
  互联网上总有一群默默耕耘的人,写了很多好的内容。而搜索引擎尽管非常发达,但是依然存在很大的信息差,并且会一直存在。
  看到一本书上说,搜索引擎中可检索的网址占整个互联网不过一小部分,还存在很大一部分检索不到,也叫暗网,挖掘信息的能力真的非常重要,也非常有用,这个需要一直练习。
  <p data-darkmode-bgcolor-15964675795346="rgb(25, 25, 25)" data-darkmode-original-bgcolor-15964675795346="rgb(255, 255, 255)" data-darkmode-color-15964675795346="rgb(156, 156, 156)" data-darkmode-original-color-15964675795346="rgb(74, 74, 74)" data-style="margin-bottom: 15px; max-width: 100%; box-sizing: border-box; background-color: rgb(255, 255, 255); color: rgb(74, 74, 74); min-height: 1em; letter-spacing: 0.544px; font-size: 16px; white-space: pre-line; line-height: 30px; font-family: Avenir, -apple-system-font, 微软雅黑, sans-serif; text-align: start; overflow-wrap: break-word !important;" class="js_darkmode__3" data-darkmode-bgcolor-15982707083969="rgb(25, 25, 25)" data-darkmode-original-bgcolor-15982707083969="rgb(255, 255, 255)" data-darkmode-color-15982707083969="rgb(156, 156, 156)" data-darkmode-original-color-15982707083969="rgb(74, 74, 74)" style="margin-bottom: 15px;outline: 0px;max-width: 100%;box-sizing: border-box;letter-spacing: 0.544px;font-size: 16px;color: rgb(74, 74, 74);white-space: pre-line;line-height: 30px;font-family: Avenir, -apple-system-font, 微软雅黑, sans-serif;text-align: start;overflow-wrap: break-word !important;">(全文完)
  长按二维码,加关注!叶子陪你玩
  </p> 查看全部

  不用写代码的爬虫工具教程——推荐
  最近一直在写课程,网上找资料,找到一个Web Scraper 的工具教程,对于那些不想写爬虫代码又想获取信息的人来说,非常友好。
  
  不过要提醒的是,Web Scraper 是一款专注于文本爬取的爬虫工具。也就是这个工具只能爬取文本类的信息,多媒体类的图片,视频爬取不了。
  下面是博主列出的优点,缺点及简答的总结:
  Web Scraper 的优点Web Scraper 的缺点总结
  掌握了 Web Scraper 的使用,基本上可以应付学习工作中90%的数据爬取需求。相对于 python 爬虫,虽然灵活度上受到了限制,但是低廉的学习成本可以大大节省学习时间,快速解决手头的工作,提高整体的工作效率。综合来看,Web Scraper 还是非常值得去学习的。
  博主网址:
  %E7%AE%80%E6%98%93%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/
  
  互联网上总有一群默默耕耘的人,写了很多好的内容。而搜索引擎尽管非常发达,但是依然存在很大的信息差,并且会一直存在。
  看到一本书上说,搜索引擎中可检索的网址占整个互联网不过一小部分,还存在很大一部分检索不到,也叫暗网,挖掘信息的能力真的非常重要,也非常有用,这个需要一直练习。
  <p data-darkmode-bgcolor-15964675795346="rgb(25, 25, 25)" data-darkmode-original-bgcolor-15964675795346="rgb(255, 255, 255)" data-darkmode-color-15964675795346="rgb(156, 156, 156)" data-darkmode-original-color-15964675795346="rgb(74, 74, 74)" data-style="margin-bottom: 15px; max-width: 100%; box-sizing: border-box; background-color: rgb(255, 255, 255); color: rgb(74, 74, 74); min-height: 1em; letter-spacing: 0.544px; font-size: 16px; white-space: pre-line; line-height: 30px; font-family: Avenir, -apple-system-font, 微软雅黑, sans-serif; text-align: start; overflow-wrap: break-word !important;" class="js_darkmode__3" data-darkmode-bgcolor-15982707083969="rgb(25, 25, 25)" data-darkmode-original-bgcolor-15982707083969="rgb(255, 255, 255)" data-darkmode-color-15982707083969="rgb(156, 156, 156)" data-darkmode-original-color-15982707083969="rgb(74, 74, 74)" style="margin-bottom: 15px;outline: 0px;max-width: 100%;box-sizing: border-box;letter-spacing: 0.544px;font-size: 16px;color: rgb(74, 74, 74);white-space: pre-line;line-height: 30px;font-family: Avenir, -apple-system-font, 微软雅黑, sans-serif;text-align: start;overflow-wrap: break-word !important;">(全文完)
  长按二维码,加关注!叶子陪你玩
  </p>

20行Python代码爬取网站美女图,哇太多了,看不过来了,我U盘装满了!

网站优化优采云 发表了文章 • 0 个评论 • 79 次浏览 • 2022-05-21 18:49 • 来自相关话题

  20行Python代码爬取网站美女图,哇太多了,看不过来了,我U盘装满了!
  淘女郎爬虫,可动态抓取淘女郎的信息和照片。
  
  需要额外安装的第三方库模块功能
  哦对了,先说明一下,我这里有一套Python编程入门教程,由于平台不能发资料文件,所以我把资料整理在Python编程学习群:808713721里面,大家加入就可以免费领取这套教程了
  
  原理
  淘女郎的网站使用了AJAX技术。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。这意味着通过直接抓取网页源代码然后分析出信息的方式是行不通的,因为网站是动态加载的,直接抓取的方式只能抓到网页原始的源代码,并不能抓到动态加载出的淘女郎的信息。
  
  对于这一类网站,一般有两种抓取办法:
  利用selenium库来模拟浏览器的用户行为,让服务器以为是真正的用户在浏览网页,从而获得完整的网页源代码
  利用Chrome等浏览器自带的分析工具,对网页的Network进行监控,分析出数据交换的API,从而利用API抓取到数据交换的JSON数据,从而进行抓取。
  一般来讲,第一种方法速度较慢,并且运行时占用较多的系统资源,所以,条件允许的情况下,尽量使用第二种方法。
  在Chrome浏览器中打开淘女郎: 按F12切换到开发者模式,在Network一栏选择XHR可以看到目前没有网络活动,但是,在网页中按下一页的时候,会出现一个POST活动,当再次按下下一页的时候,会再次出现一次该活动,所以,可以断定,数据交换使用的就是这个API。
  然后我们再来对比这两次请求,在Headers框的FromData栏中,可以看到两次请求的差别在currentPage的不同,一个是2,一个是3,这说明,要想得到第几页的数据,这个currentPage的值就是多少。所以我们就根据这个,来编写请求,从而得到全部淘女郎信息的JSON文件。
  
  发送请求,得到JSON数据,将其加工并转化为Python的字典类型返回
  
  连接到MongoDB, 将信息保存
  
  抽取出照片的网址,下载,保存在pic文件夹中
  
  爬完了,成果斐然啊
  
  最后,别忘了来我的Python学习QQ群:808713721,获取全套Python编程入门资料哦!
   查看全部

  20行Python代码爬取网站美女图,哇太多了,看不过来了,我U盘装满了!
  淘女郎爬虫,可动态抓取淘女郎的信息和照片。
  
  需要额外安装的第三方库模块功能
  哦对了,先说明一下,我这里有一套Python编程入门教程,由于平台不能发资料文件,所以我把资料整理在Python编程学习群:808713721里面,大家加入就可以免费领取这套教程了
  
  原理
  淘女郎的网站使用了AJAX技术。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。这意味着通过直接抓取网页源代码然后分析出信息的方式是行不通的,因为网站是动态加载的,直接抓取的方式只能抓到网页原始的源代码,并不能抓到动态加载出的淘女郎的信息。
  
  对于这一类网站,一般有两种抓取办法:
  利用selenium库来模拟浏览器的用户行为,让服务器以为是真正的用户在浏览网页,从而获得完整的网页源代码
  利用Chrome等浏览器自带的分析工具,对网页的Network进行监控,分析出数据交换的API,从而利用API抓取到数据交换的JSON数据,从而进行抓取。
  一般来讲,第一种方法速度较慢,并且运行时占用较多的系统资源,所以,条件允许的情况下,尽量使用第二种方法。
  在Chrome浏览器中打开淘女郎: 按F12切换到开发者模式,在Network一栏选择XHR可以看到目前没有网络活动,但是,在网页中按下一页的时候,会出现一个POST活动,当再次按下下一页的时候,会再次出现一次该活动,所以,可以断定,数据交换使用的就是这个API。
  然后我们再来对比这两次请求,在Headers框的FromData栏中,可以看到两次请求的差别在currentPage的不同,一个是2,一个是3,这说明,要想得到第几页的数据,这个currentPage的值就是多少。所以我们就根据这个,来编写请求,从而得到全部淘女郎信息的JSON文件。
  
  发送请求,得到JSON数据,将其加工并转化为Python的字典类型返回
  
  连接到MongoDB, 将信息保存
  
  抽取出照片的网址,下载,保存在pic文件夹中
  
  爬完了,成果斐然啊
  
  最后,别忘了来我的Python学习QQ群:808713721,获取全套Python编程入门资料哦!
  

不用写代码怎么爬数据

网站优化优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2022-05-21 18:49 • 来自相关话题

  不用写代码怎么爬数据
  今天说一个不用写代码,怎么来抓取数据的方式,这种方式能满足相当部分人群的需求。
  爬数据通常要用程序写一段网络请求代码来获取网页,遇到有些网页是异步加载或者用JS混淆了,又要耗费精力去分析。尤其是很多爬虫选手是非专业选手,写起代码其实挺吃力的,在我的了解来看大部分公司或者爬数据的需求都是一次性的,而且获取数据的量级很小,万或数十万条数据这样的规模,而且是一次性的。这可以不用去开发程序,使用一些工具就能办到,比如Web Scraper工具。
  Web Scraper
  Web Scraper是一个网页抓取工具,不需要复杂的安装配置,是以Chrome 插件的形式运行在Chrome浏览器上。不用担心抓取的网页是否异步加载或者有JS混淆之类的,是所见即所得的抓取方式,熟练情况下抓取数据只需要花10-20分钟完成配置就能开始抓取(写代码可能需要数小时乃至数天)。非常适合一次性/短期/非爬虫专业选手爬数据的需求。
  
  演示一下,比如我们要抓这个网站URL下面的商店名称和用户评论。
  如何安装和配置Web Scraper?
  1.Chrome浏览器里的插件商店里搜索Web Scraper即可安装,如果你不能访问Chrome插件商店,在公众号回复 Web Scraper ,可以在本地安装Chrome插件,怎么操作就不再赘述了。
  2.安装好Web Scraper插件后,打开Chrome浏览器的开发者工具,能看到Web Scraper选项代表安装成功。
  
  3.配置抓取规则
  配置也很简单,先科普下,我们在写程序抓取网页时,通常需要一个入口页面(这个页面通常是一个频道页,列表页之类的),程序抽取入口页面的URL,接着访问这些URL再抽取里面我们需要的详细信息。
  比如,要抽取点评网上的私房菜分类下的店名和小店里面的评论。我们首先需要一个入口页面(即 私房菜频道的URL),抽取该页面里的小店URL,程序访问这些小店URL,再抽取小店里面的店名,评论等信息。
  配置Web Scraper也是一样的道理,需要一个入口页面(Start URL),然后配置抽取入口页面的URL规则,配置好后紧接着再配置抽取详细页信息的规则。详细的Web Scraper教程可以查看原文,我在猿人学网站上写了个简单的Web Scraper配置教程。
  比如你要抓取点评网私房菜频道里的小店和点评评论。
  第一步把私房菜频道的URL当着Start URL。
  
  如果你想翻页的话,检查一下点评网的翻页规则,它的翻页是这样:
  第二页
  第三页
  就可以把翻页规则写成这样
  [0-5]
  表示从第1页翻到第5页
  第二步创建一个抽取入口页面里URL的规则,即抽取小店URL,看gif最直观:
  完全是可视化操作,Type里选择Link,Selector上选择Select,然后鼠标先选几下页面上的小店,自动把抽取小店url的xpath规则就写好了。点击Data preview可以检查和预览抽取规则是否生效。
  第三步常见抽取小店详细页信息的规则,比如抽取评论:
  熟练的话,10-20分钟就能配置好一个抓取规则,当然更复杂的数据抽取规则你可以看它官网的文档。
  使用Web Scraper这种抓取方法一次抓取上千条数据不成问题,适用想少量抓取用来数据分析,或者补充抓取数据。当然再配合使用切换代理ip软件的话,也可以做到长时间大量抓取数据用,只是效率没那么高。
  总结Web Scraper的优点:
  1.可以抓取动态加载的数据,比如通过ajax翻页的数据;
  2.抓取的数据可以CSV文件格式导出到本地;
  3.抓取需要登录的数据较方便,因为这个插件是运行在浏览器上的;
  4.不用担心JS/CSS混淆数据;
  5.配置简单,可视化配置抽取规则。 查看全部

  不用写代码怎么爬数据
  今天说一个不用写代码,怎么来抓取数据的方式,这种方式能满足相当部分人群的需求。
  爬数据通常要用程序写一段网络请求代码来获取网页,遇到有些网页是异步加载或者用JS混淆了,又要耗费精力去分析。尤其是很多爬虫选手是非专业选手,写起代码其实挺吃力的,在我的了解来看大部分公司或者爬数据的需求都是一次性的,而且获取数据的量级很小,万或数十万条数据这样的规模,而且是一次性的。这可以不用去开发程序,使用一些工具就能办到,比如Web Scraper工具。
  Web Scraper
  Web Scraper是一个网页抓取工具,不需要复杂的安装配置,是以Chrome 插件的形式运行在Chrome浏览器上。不用担心抓取的网页是否异步加载或者有JS混淆之类的,是所见即所得的抓取方式,熟练情况下抓取数据只需要花10-20分钟完成配置就能开始抓取(写代码可能需要数小时乃至数天)。非常适合一次性/短期/非爬虫专业选手爬数据的需求。
  
  演示一下,比如我们要抓这个网站URL下面的商店名称和用户评论。
  如何安装和配置Web Scraper?
  1.Chrome浏览器里的插件商店里搜索Web Scraper即可安装,如果你不能访问Chrome插件商店,在公众号回复 Web Scraper ,可以在本地安装Chrome插件,怎么操作就不再赘述了。
  2.安装好Web Scraper插件后,打开Chrome浏览器的开发者工具,能看到Web Scraper选项代表安装成功。
  
  3.配置抓取规则
  配置也很简单,先科普下,我们在写程序抓取网页时,通常需要一个入口页面(这个页面通常是一个频道页,列表页之类的),程序抽取入口页面的URL,接着访问这些URL再抽取里面我们需要的详细信息。
  比如,要抽取点评网上的私房菜分类下的店名和小店里面的评论。我们首先需要一个入口页面(即 私房菜频道的URL),抽取该页面里的小店URL,程序访问这些小店URL,再抽取小店里面的店名,评论等信息。
  配置Web Scraper也是一样的道理,需要一个入口页面(Start URL),然后配置抽取入口页面的URL规则,配置好后紧接着再配置抽取详细页信息的规则。详细的Web Scraper教程可以查看原文,我在猿人学网站上写了个简单的Web Scraper配置教程。
  比如你要抓取点评网私房菜频道里的小店和点评评论。
  第一步把私房菜频道的URL当着Start URL。
  
  如果你想翻页的话,检查一下点评网的翻页规则,它的翻页是这样:
  第二页
  第三页
  就可以把翻页规则写成这样
  [0-5]
  表示从第1页翻到第5页
  第二步创建一个抽取入口页面里URL的规则,即抽取小店URL,看gif最直观:
  完全是可视化操作,Type里选择Link,Selector上选择Select,然后鼠标先选几下页面上的小店,自动把抽取小店url的xpath规则就写好了。点击Data preview可以检查和预览抽取规则是否生效。
  第三步常见抽取小店详细页信息的规则,比如抽取评论:
  熟练的话,10-20分钟就能配置好一个抓取规则,当然更复杂的数据抽取规则你可以看它官网的文档。
  使用Web Scraper这种抓取方法一次抓取上千条数据不成问题,适用想少量抓取用来数据分析,或者补充抓取数据。当然再配合使用切换代理ip软件的话,也可以做到长时间大量抓取数据用,只是效率没那么高。
  总结Web Scraper的优点:
  1.可以抓取动态加载的数据,比如通过ajax翻页的数据;
  2.抓取的数据可以CSV文件格式导出到本地;
  3.抓取需要登录的数据较方便,因为这个插件是运行在浏览器上的;
  4.不用担心JS/CSS混淆数据;
  5.配置简单,可视化配置抽取规则。

这些Python代码技巧,你肯定还不知道

网站优化优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2022-05-21 06:00 • 来自相关话题

  这些Python代码技巧,你肯定还不知道
  它可以帮助你从大量顶级国际出版物中检索到新闻文章和相关元数据。你可以检索图像、文本和作者名。
  它还有一些内置的 NLP 功能。
  地址:#performing-nlp-on-an-article
  如果你想在下一个项目中使用 BeautifulSoup 或其它 DIY 网页抓取库,那么不如使用$ pip install newspaper3k,既省时又省事,何乐而不为呢?
  运算符重载(Operator overloading)
  Python 支持运算符重载。
  它实际上是一个简单的概念。你有没有想过为什么 Python 允许用户使用 + 运算符来将数字相加,并级联字符串?这就是运算符重载在发挥作用。
  你可以使用 Python 的标准运算符号来定义对象,这样你可以在与这些对象相关的语境中使用它们。
  class Thing:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    def __init__(self, value):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />        self.__value = value<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    def __gt__(self, other):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />        return self.__value > other.__value<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    def __lt__(self, other):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />        return self.__value  nothing<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" /># False<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />something >> file = open('file.txt', 'r')<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />>>> print(file)<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />
  这使代码 debug 变得简单很多。将字符串添加到类别定义,如下所示:
  class someClass:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    def __repr__(self):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />        return ""<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />someInstance = someClass()<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" /># prints <br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />print(someInstance)
  sh
  Python 是一种伟大的脚本语言,不过有时使用标准 os 和 subprocess 库会有点棘手。
  sh 库提供了一种不错的替代方案。
  sh 库:
  该库允许用户像使用普通函数一样调用任意程序,这对自动化工作流和任务非常有用。
  from sh import *<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.pwd()<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.mkdir('new_folder')<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.touch('new_file.txt')<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.whoami()<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.echo('This is great!')
  类型提示(Type hints)
  Python 是动态语言。在定义变量、函数、类别等时无需指定数据类型。
  这有利于缩短开发周期。但是,简单的类型错误(typing issue)导致的运行时错误真的太烦了。
  从 Python 3.5 版本开始,用户可以选择在定义函数时开启类型提示。
  def addTwo(x : Int) -> Int:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    return x + 2
  你还可以定义类型别名:
  from typing import List<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />Vector = List[float]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />Matrix = List[Vector]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />def addMatrix(a : Matrix, b : Matrix) -> Matrix:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />  result = []<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />  for i,row in enumerate(a):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    result_row =[]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    for j, col in enumerate(row):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />      result_row += [a[i][j] + b[i][j]]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    result += [result_row]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />  return result<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />x = [[1.0, 0.0], [0.0, 1.0]]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />y = [[2.0, 1.0], [0.0, -2.0]]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />z = addMatrix(x, y)
  尽管非强制,但类型注释可以使代码更易理解。
  它们还允许你在运行之前使用类型检查工具捕捉 TypeError。在进行大型复杂项目时执行此类操作是值得的。
  uuid
  生成通用唯一标识符(Universally Unique ID,UUID)的一种快速简单方法就是使用 Python 标准库的 uuid 模块。
  uuid 模块:
  import uuid<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />user_id = uuid.uuid4()<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />print(user_id)
  这创建了一个随机化后的 128 比特数字,该数字几乎必然是唯一的。
  事实上,可以生成 2¹²²可能的 UUID。这个数字超过了 5,000,000,000,000,000,000,000,000,000,000,000,000。
  在给定集合中找出重复数字的可能性极低。即使有一万亿 UUID,重复数字存在的概率也远远低于十亿分之一。
  虚拟环境(Virtual environment)
  这可能是 Python 中我最喜欢的事物了。
  你可能同时处理多个 Python 项目。不幸的是,有时候两个项目依赖于相同依赖项的不同版本。那你要安装哪个版本呢?
  幸运的是,Python 支持虚拟环境,这使得用户能够充分利用两种环境。见下列行:
  python -m venv my-project<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />source my-project/bin/activate<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />pip install all-the-modules 
  现在你在一台机器上具备独立的多个 Python 版本了。问题解决!
  wikipedia
  Wikipedia 拥有一个很棒的 API,允许用户以编程方式访问巨大体量的免费知识和信息。
  wikipedia 模块使得访问该 API 非常便捷。
  Wikipedia 模块:
  import wikipedia<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />result = wikipedia.page('freeCodeCamp')<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />print(result.summary)<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />for link in result.links:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    print(link)
  和真实的维基百科网站类似,该模块支持多种语言、页面消歧、随机页面检索,甚至还具备 donate() 方法。
  xkcd
  humour 是 Python 语言的一个关键特征,其名称来自英国喜剧片《蒙提·派森的飞行马戏团》(Monty Python and the Flying Circus)。Python 的很多官方文档引用了该喜剧片最著名的剧情。
  幽默感并不限于文档。试着运行下列行:
  import antigravity
  将打开 xkcd 画的 Python 漫画。不要改变这一点,Python。不要改变。
  YAML
  YAML 代表 『YAML Ain』t Markup Language』。它是一种数据格式语言,是 JSON 的超集。
  与 JSON 不同,它可以存储更复杂的对象并引用自己的元素。你还可以编写注释,使其尤其适用于编写配置文件。
  PyYAML 模块()可以让你在 Python 中使用 YAML。安装:
  $ pip install pyyaml
  然后导入到项目中:
  import yaml
  PyYAML 使你能够存储任何数据类型的 Python 对象,以及任何用户定义类别的实例。
  zip
  给你支最后一招,非常酷。还在用两个列表来组成一部词典吗?
  keys = ['a', 'b', 'c']<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />vals = [1, 2, 3]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />zipped = dict(zip(keys, vals))
  zip() 内置函数使用多个可迭代对象作为输入并返回元组列表。每个元组按位置索引对输入对象的元素进行分组。
  你也可以通过调用*zip() 来「解压」对象。
  
  原文链接:
   查看全部

  这些Python代码技巧,你肯定还不知道
  它可以帮助你从大量顶级国际出版物中检索到新闻文章和相关元数据。你可以检索图像、文本和作者名。
  它还有一些内置的 NLP 功能。
  地址:#performing-nlp-on-an-article
  如果你想在下一个项目中使用 BeautifulSoup 或其它 DIY 网页抓取库,那么不如使用$ pip install newspaper3k,既省时又省事,何乐而不为呢?
  运算符重载(Operator overloading)
  Python 支持运算符重载。
  它实际上是一个简单的概念。你有没有想过为什么 Python 允许用户使用 + 运算符来将数字相加,并级联字符串?这就是运算符重载在发挥作用。
  你可以使用 Python 的标准运算符号来定义对象,这样你可以在与这些对象相关的语境中使用它们。
  class Thing:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    def __init__(self, value):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />        self.__value = value<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    def __gt__(self, other):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />        return self.__value > other.__value<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    def __lt__(self, other):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />        return self.__value  nothing<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" /># False<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />something >> file = open('file.txt', 'r')<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />>>> print(file)<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />
  这使代码 debug 变得简单很多。将字符串添加到类别定义,如下所示:
  class someClass:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    def __repr__(self):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />        return ""<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />someInstance = someClass()<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" /># prints <br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />print(someInstance)
  sh
  Python 是一种伟大的脚本语言,不过有时使用标准 os 和 subprocess 库会有点棘手。
  sh 库提供了一种不错的替代方案。
  sh 库:
  该库允许用户像使用普通函数一样调用任意程序,这对自动化工作流和任务非常有用。
  from sh import *<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.pwd()<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.mkdir('new_folder')<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.touch('new_file.txt')<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.whoami()<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />sh.echo('This is great!')
  类型提示(Type hints)
  Python 是动态语言。在定义变量、函数、类别等时无需指定数据类型。
  这有利于缩短开发周期。但是,简单的类型错误(typing issue)导致的运行时错误真的太烦了。
  从 Python 3.5 版本开始,用户可以选择在定义函数时开启类型提示。
  def addTwo(x : Int) -> Int:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    return x + 2
  你还可以定义类型别名:
  from typing import List<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />Vector = List[float]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />Matrix = List[Vector]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />def addMatrix(a : Matrix, b : Matrix) -> Matrix:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />  result = []<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />  for i,row in enumerate(a):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    result_row =[]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    for j, col in enumerate(row):<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />      result_row += [a[i][j] + b[i][j]]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    result += [result_row]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />  return result<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />x = [[1.0, 0.0], [0.0, 1.0]]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />y = [[2.0, 1.0], [0.0, -2.0]]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />z = addMatrix(x, y)
  尽管非强制,但类型注释可以使代码更易理解。
  它们还允许你在运行之前使用类型检查工具捕捉 TypeError。在进行大型复杂项目时执行此类操作是值得的。
  uuid
  生成通用唯一标识符(Universally Unique ID,UUID)的一种快速简单方法就是使用 Python 标准库的 uuid 模块。
  uuid 模块:
  import uuid<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />user_id = uuid.uuid4()<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />print(user_id)
  这创建了一个随机化后的 128 比特数字,该数字几乎必然是唯一的。
  事实上,可以生成 2¹²²可能的 UUID。这个数字超过了 5,000,000,000,000,000,000,000,000,000,000,000,000。
  在给定集合中找出重复数字的可能性极低。即使有一万亿 UUID,重复数字存在的概率也远远低于十亿分之一。
  虚拟环境(Virtual environment)
  这可能是 Python 中我最喜欢的事物了。
  你可能同时处理多个 Python 项目。不幸的是,有时候两个项目依赖于相同依赖项的不同版本。那你要安装哪个版本呢?
  幸运的是,Python 支持虚拟环境,这使得用户能够充分利用两种环境。见下列行:
  python -m venv my-project<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />source my-project/bin/activate<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />pip install all-the-modules 
  现在你在一台机器上具备独立的多个 Python 版本了。问题解决!
  wikipedia
  Wikipedia 拥有一个很棒的 API,允许用户以编程方式访问巨大体量的免费知识和信息。
  wikipedia 模块使得访问该 API 非常便捷。
  Wikipedia 模块:
  import wikipedia<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />result = wikipedia.page('freeCodeCamp')<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />print(result.summary)<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />for link in result.links:<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />    print(link)
  和真实的维基百科网站类似,该模块支持多种语言、页面消歧、随机页面检索,甚至还具备 donate() 方法。
  xkcd
  humour 是 Python 语言的一个关键特征,其名称来自英国喜剧片《蒙提·派森的飞行马戏团》(Monty Python and the Flying Circus)。Python 的很多官方文档引用了该喜剧片最著名的剧情。
  幽默感并不限于文档。试着运行下列行:
  import antigravity
  将打开 xkcd 画的 Python 漫画。不要改变这一点,Python。不要改变。
  YAML
  YAML 代表 『YAML Ain』t Markup Language』。它是一种数据格式语言,是 JSON 的超集。
  与 JSON 不同,它可以存储更复杂的对象并引用自己的元素。你还可以编写注释,使其尤其适用于编写配置文件。
  PyYAML 模块()可以让你在 Python 中使用 YAML。安装:
  $ pip install pyyaml
  然后导入到项目中:
  import yaml
  PyYAML 使你能够存储任何数据类型的 Python 对象,以及任何用户定义类别的实例。
  zip
  给你支最后一招,非常酷。还在用两个列表来组成一部词典吗?
  keys = ['a', 'b', 'c']<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />vals = [1, 2, 3]<br style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" />zipped = dict(zip(keys, vals))
  zip() 内置函数使用多个可迭代对象作为输入并返回元组列表。每个元组按位置索引对输入对象的元素进行分组。
  你也可以通过调用*zip() 来「解压」对象。
  
  原文链接:
  

拿好这段代码,愿你求职路上不再迷茫

网站优化优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2022-05-21 05:55 • 来自相关话题

  拿好这段代码,愿你求职路上不再迷茫
  如需转载,发送「转载」二字查看说明
  涉及知识:数据库(mongodb)node.js
  建议阅读:3分钟
  经常有人问:“我是该学Angular还是React?该用gulp还是webpack…”
  这篇文章就是要 交给大家一把钥匙,专门解答这类问题。
  解答思路
  我一直提倡的是 学以致用,知行合一,所以当我们学习和储备技能的时候应该要和市场相结合,准确的说应该是人才市场。
  要了解人才市场有个非常简单的方法——招聘网站。我们上招聘网站搜一搜,看看企业在招聘的时候都有哪些技能需求就一目了然了。
  可问题就是数据那么多,如果只抽取部分做参考不够准确,一个个去看又效率太低。
  我觉得身为开发人员最大的优势就是 可以用代码等技术手段定制所需的工具。所以我们只需要写一段爬虫代码,把招聘网站上的数据“同步”到数据库,然后进行统计分析,就可以进行有的放矢地学习了。先看一下统计分析结果:
  
  动手实践
  以个人比较喜欢的某招聘网站为例。
  网页分析
  搜索“前端”,人往高处看齐,我们添加一个过滤条件“25k-50k”,看看市场对高级前端的要求。同时按下F12打开调试,发现这里发送了ajax请求(凡事有利有弊,前后端分离虽然开发效率提高了,但同时也为爬虫程序降低了难度)。
  补充一下:一般分两种情况:json数据和html页面,本文两种情况皆有涉及。
  
  通过列表我们只能知道公司和职位,点击链接跳转到详情页看到我们想要的信息:岗位职责和要求。
  
  这里没有看到ajax请求,应该是后端利用模板直接生成的静态页面,所以需要解析html,会略微麻烦一些。
  编写代码
  整个编码的思路变得很清晰了:
  1.分页查询职位列表
  用request模块发送get请求,获取json数据,然后按照id查询html。
  2.按职位查询详情并入库
  用jsdom模块对获取的html进行dom解析,这个模块很容易上手,可用jquery语法。
  将解析的数据过滤,保留岗位职责和要求信息,利用mongoose保存至数据库。
  3.从数据库中查询结果
  查询统计各技能占比。结果如开头截图所示。
  统计结果只代表了某招聘网站对高级前端的技能要求,仅供参考。 程序代码100多行,具体细节可戳
  源码地址:
  总结优化
  换个搜索关键词,换个网站都可以使用么?
  换个关键词可以,换个网站直接使用肯定不行的,首先用开发者工具找出查询数据的url,然后json数据直接处理,如果是html再解析,方法相同,只是解析的字段不同。
  明明是写个爬虫,却说是职业规划,不是标题党么?
  爬虫跟文中所提的手工统计、抽样查看方法一样,都是手段,只是更高效一些。文章的重点是利用统计分析的方法来解决“xx与yy,我该如何选择”这类问题。目标思维很重要,黑猫白猫抓到老鼠就是好猫。
  我不用数据库直接在内存中分析不是更简单么?
  这样的确能减少代码量,但是每次分析都需要重新抓取数据,效率太低而且容易被反爬虫发现,所以 建议还是将查询结果统计入库。绘图,出表格…后续想怎么玩都行~
  有没有更可靠的分析方法?
  当然有。文中所提的搜索匹配的分析方式太简单了,最理想的方式应该是 自动挑选出topN的关键词然后按占比排序。咨询了一下做大数据的朋友,可以使用 word2vec,有兴趣的读者可以试试。
  关注「前端大全」
  看更多精选前端技术文章
  ↓↓↓
  
  专栏作者简介()
  亚里士朱德:JSP工程师,多年大型国际项目开发经验。WEB前端工程师,擅长PC端以及移动端开发。js全栈工程师,熟悉node.js、mongoDB。
  
  打赏支持作者写出更多好文章,谢谢! 查看全部

  拿好这段代码,愿你求职路上不再迷茫
  如需转载,发送「转载」二字查看说明
  涉及知识:数据库(mongodb)node.js
  建议阅读:3分钟
  经常有人问:“我是该学Angular还是React?该用gulp还是webpack…”
  这篇文章就是要 交给大家一把钥匙,专门解答这类问题。
  解答思路
  我一直提倡的是 学以致用,知行合一,所以当我们学习和储备技能的时候应该要和市场相结合,准确的说应该是人才市场。
  要了解人才市场有个非常简单的方法——招聘网站。我们上招聘网站搜一搜,看看企业在招聘的时候都有哪些技能需求就一目了然了。
  可问题就是数据那么多,如果只抽取部分做参考不够准确,一个个去看又效率太低。
  我觉得身为开发人员最大的优势就是 可以用代码等技术手段定制所需的工具。所以我们只需要写一段爬虫代码,把招聘网站上的数据“同步”到数据库,然后进行统计分析,就可以进行有的放矢地学习了。先看一下统计分析结果:
  
  动手实践
  以个人比较喜欢的某招聘网站为例。
  网页分析
  搜索“前端”,人往高处看齐,我们添加一个过滤条件“25k-50k”,看看市场对高级前端的要求。同时按下F12打开调试,发现这里发送了ajax请求(凡事有利有弊,前后端分离虽然开发效率提高了,但同时也为爬虫程序降低了难度)。
  补充一下:一般分两种情况:json数据和html页面,本文两种情况皆有涉及。
  
  通过列表我们只能知道公司和职位,点击链接跳转到详情页看到我们想要的信息:岗位职责和要求。
  
  这里没有看到ajax请求,应该是后端利用模板直接生成的静态页面,所以需要解析html,会略微麻烦一些。
  编写代码
  整个编码的思路变得很清晰了:
  1.分页查询职位列表
  用request模块发送get请求,获取json数据,然后按照id查询html。
  2.按职位查询详情并入库
  用jsdom模块对获取的html进行dom解析,这个模块很容易上手,可用jquery语法。
  将解析的数据过滤,保留岗位职责和要求信息,利用mongoose保存至数据库。
  3.从数据库中查询结果
  查询统计各技能占比。结果如开头截图所示。
  统计结果只代表了某招聘网站对高级前端的技能要求,仅供参考。 程序代码100多行,具体细节可戳
  源码地址:
  总结优化
  换个搜索关键词,换个网站都可以使用么?
  换个关键词可以,换个网站直接使用肯定不行的,首先用开发者工具找出查询数据的url,然后json数据直接处理,如果是html再解析,方法相同,只是解析的字段不同。
  明明是写个爬虫,却说是职业规划,不是标题党么?
  爬虫跟文中所提的手工统计、抽样查看方法一样,都是手段,只是更高效一些。文章的重点是利用统计分析的方法来解决“xx与yy,我该如何选择”这类问题。目标思维很重要,黑猫白猫抓到老鼠就是好猫。
  我不用数据库直接在内存中分析不是更简单么?
  这样的确能减少代码量,但是每次分析都需要重新抓取数据,效率太低而且容易被反爬虫发现,所以 建议还是将查询结果统计入库。绘图,出表格…后续想怎么玩都行~
  有没有更可靠的分析方法?
  当然有。文中所提的搜索匹配的分析方式太简单了,最理想的方式应该是 自动挑选出topN的关键词然后按占比排序。咨询了一下做大数据的朋友,可以使用 word2vec,有兴趣的读者可以试试。
  关注「前端大全」
  看更多精选前端技术文章
  ↓↓↓
  
  专栏作者简介()
  亚里士朱德:JSP工程师,多年大型国际项目开发经验。WEB前端工程师,擅长PC端以及移动端开发。js全栈工程师,熟悉node.js、mongoDB。
  
  打赏支持作者写出更多好文章,谢谢!

20个编写现代CSS代码的建议

网站优化优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2022-05-21 05:54 • 来自相关话题

  20个编写现代CSS代码的建议
  的背景图而不是直接使用img标签。基于这种方式配合上background-size与background-position这两个属性,可以很方便地按比例缩放:
  img {
   width: 300px;
   height: 200px;
}
div {
   width: 300px;
   height: 200px;
   background: url('http://cdn.tutorialzine.com/wp-content/uploads/2016/08/bicycle.jpg');
   background-position: center center;
   background-size: cover;
}
section{
   float: left;
   margin: 15px;
}
  不过这种方式也是存在缺陷的,譬如你无法设置图片的懒加载、图片无法被搜索引擎或者其他类似的工具抓取到,有个不错的属性叫object-fit可以解决这个问题,不过该属性目前的浏览器支持并不是很完善。
  Better Table Borders
  HTML中使用Tables进行布局一直是个很头疼的问题,它们使用起来很简单,但是无法进行响应式操作,并且也不方便进行全局样式设置。譬如,如果你打算为Table的边与单元的边添加样式,可能得到的结果如下:
  table {
   width: 600px;
   border: 1px solid #505050;
   margin-bottom: 15px;
   color:#505050;
}
td{
   border: 1px solid #505050;
   padding: 10px;
}
  
  这里存在的问题是出现了很多的重复的边,会导致视觉上不协调的情况,那么我们可以通过设置border-collapse:collapse来进行处理:
  
  注释格式优化
  CSS虽然谈不上一门编程语言但是其仍然需要添加注释以保障整体代码的可读性,只要添加些简单的注释不仅可以方便你更好地组织整个样式表还能够让你的同事或者未来的自己更好地理解。对于CSS中整块的注释或者使用在Media-Query中的注释,建议是使用如下形式:
  /*---------------
   #Header
---------------*/header { }header nav { }/*---------------
   #Slideshow
---------------*/.slideshow { }
  而设计的细节说明或者一些不重要的组件可以用如下单行注释的方式:
  /*   Footer Buttons   */
.footer button { }
.footer button:hover { }
  同时,不要忘了CSS中是没有//这种注释方式的:
  /*  Do  */p {
   padding: 15px;
   /*border: 1px solid #222;*/
}/*  Don't  */p {
   padding: 15px;
   // border: 1px solid #222;  
}
  使用Kebab-case命名变量
  对于样式类名或者ID名的命名都需要在多个单词之间添加-符号,CSS本身是大小写不敏感的因此你是用不了camelCase的,另一方面,很久之前也不支持下划线,所以现在的默认的命名方式就是使用-:
  /*  Do     */
.footer-column-left { }
/*  Don't  */
.footerColumnLeft { }
.footer_column_left { }
  而涉及到具体的变量命名规范时,建议是使用BEM规范,只要遵循一些简单的原则即可以保证基于组件风格的命名一致性。你也可以参考CSS Tricks来获得更多的细节描述。
  避免重复代码
  大部分元素的CSS属性都是从DOM树根部继承而来,这也是其命名为级联样式表的由来。我们以font属性为例,该属性往往是继承自父属性,因此我们并不需要再单独地为元素设置该属性。我们只需要在html或者body中添加该属性然后使其层次传递下去即可:
  html {
   font: normal 16px/1.4 sans-serif;
}
  使用transform添加CSS Animations
  不建议直接改变元素的width与height属性或者left/top/bottom/right这些属性来达到动画效果,而应该优先使用transform()属性来提供更平滑的变换效果,并且能使得代码的可读性会更好:
  .ball {
   left: 50px;
   transition: 0.4s ease-out;
}/* Not Cool*/.ball.slide-out {
   left: 500px;
}/* Cool*/.ball.slide-out {
   transform: translateX(450px);
}
  Transform的几个属性translate、rotate、scale都具有比较好的浏览器兼容性可以放心使用。
  不要重复造轮子
  现在CSS社区已经非常庞大,并且不断地有新的各式各样的库开源出来。这些库可以帮助我们解决从小的代码片到用于构建完整的响应式应用的全框架。所以如果下次你再碰到什么CSS问题的时候,在打算撸起袖子自己上之前可以尝试在GitHUB或者CodePen上搜索可行方案。
  尽可能使用低优先级的选择器
  并不是所有的CSS选择器的优先级都一样,很多初学者在使用CSS选择器的时候都是考虑以新的特性去复写全部的继承特性,不过这一点在某个元素多状态时就麻烦了,譬如下面这个例子:
  a{
   color: #fff;
   padding: 15px;
}
a#blue-btn {
   background-color: blue;
}
a.active {
   background-color: red;
}
  我们本来希望将.active类添加到按钮上然后使其显示为红色,不过在上面这个例子中很明显起不了作用,因为button已经以ID选择器设置过了背景色,也就是所谓的Higher Selector Specificity。一般来说,选择器的优先级顺序为:ID(#id) > Class(.class) > Type(header)
  避免使用!important
  认真的说,千万要避免使用!important,这可能会导致你在未来的开发中无尽的属性重写,你应该选择更合适的CSS选择器。而唯一的可以使用!important属性的场景就是当你想去复写某些行内样式的时候,不过行内样式本身也是需要避免的。
  使用text-transform属性设置文本大写
  Star Wars: The Force Awakens
.movie-poster {
   text-transform: uppercase;
}
  Em, Rem, 以及 Pixel
  已经有很多关于人们应该如何使用em,rem,以及px作为元素尺寸与文本尺寸的讨论,而笔者认为,这三个尺寸单位都有其适用与不适用的地方。不同的开发与项目都有其特定的设置,因此并没有通用的规则来决定应该使用哪个单位,这里是我总结的几个考虑:
  在大型项目中使用预处理器
  估计你肯定听说过 Sass, Less, PostCSS, Stylus这些预处理器与对应的语法。Preprocessors可以允许我们将未来的CSS特性应用在当前的代码开发中,譬如变量支持、函数、嵌套式的选择器以及很多其他的特性,这里我们以Sass为例:
  $accent-color: #2196F3;
a {
   padding: 10px 15px;
   background-color: $accent-color;
}
a:hover {
   background-color: darken($accent-color,10%);
}
  使用Autoprefixers来提升浏览器兼容性
  使用特定的浏览器前缀是CSS开发中常见的工作之一,不同的浏览器、不同的属性对于前缀的要求也不一样,这就使得我们无法在编码过程中记住所有的前缀规则。并且在写样式代码的时候还需要加上特定的浏览器前缀支持也是个麻烦活,幸亏现在也是有很多工具可以辅助我们进行这样的开发:
  在生产环境下使用Minified代码
  为了提升页面的加载速度,在生产环境下我们应该默认使用压缩之后的资源代码。在压缩的过程中,会将所有的空白与重复剔除掉从而减少整个文件的体积大小。当然,经过压缩之后的代码毫无可读性,因此在开发阶段我们还是应该使用普通的版本。对于CSS的压缩有很多的现行工具:
  选择哪个工具肯定是依赖于你自己的工作流啦~
  多参阅Caniuse
  不同的浏览器在兼容性上差异很大,因此如果我们可以针对我们所需要适配的浏览器,在caniuse上我们可以查询某个特性的浏览器版本适配性,是否需要添加特定的前缀或者在某个平台上是否存在Bug等等。不过光光使用caniuse肯定是不够的,我们还需要使用些额外的服务来进行检测。
  Validate:校验
  对于CSS的校验可能不如HTML校验或者JavaScript校验那么重要,不过在正式发布之前用Lint工具校验一波你的CSS代码还是很有意义的。它会告诉你代码中潜在的错误,提示你一些不符合最佳实践的代码以及给你一些提升代码性能的建议。就像Minifers与Autoprefixers,也有很多可用的工具:
  原文:
  译文:
   查看全部

  20个编写现代CSS代码的建议
  的背景图而不是直接使用img标签。基于这种方式配合上background-size与background-position这两个属性,可以很方便地按比例缩放:
  img {
   width: 300px;
   height: 200px;
}
div {
   width: 300px;
   height: 200px;
   background: url('http://cdn.tutorialzine.com/wp-content/uploads/2016/08/bicycle.jpg');
   background-position: center center;
   background-size: cover;
}
section{
   float: left;
   margin: 15px;
}
  不过这种方式也是存在缺陷的,譬如你无法设置图片的懒加载、图片无法被搜索引擎或者其他类似的工具抓取到,有个不错的属性叫object-fit可以解决这个问题,不过该属性目前的浏览器支持并不是很完善。
  Better Table Borders
  HTML中使用Tables进行布局一直是个很头疼的问题,它们使用起来很简单,但是无法进行响应式操作,并且也不方便进行全局样式设置。譬如,如果你打算为Table的边与单元的边添加样式,可能得到的结果如下:
  table {
   width: 600px;
   border: 1px solid #505050;
   margin-bottom: 15px;
   color:#505050;
}
td{
   border: 1px solid #505050;
   padding: 10px;
}
  
  这里存在的问题是出现了很多的重复的边,会导致视觉上不协调的情况,那么我们可以通过设置border-collapse:collapse来进行处理:
  
  注释格式优化
  CSS虽然谈不上一门编程语言但是其仍然需要添加注释以保障整体代码的可读性,只要添加些简单的注释不仅可以方便你更好地组织整个样式表还能够让你的同事或者未来的自己更好地理解。对于CSS中整块的注释或者使用在Media-Query中的注释,建议是使用如下形式:
  /*---------------
   #Header
---------------*/header { }header nav { }/*---------------
   #Slideshow
---------------*/.slideshow { }
  而设计的细节说明或者一些不重要的组件可以用如下单行注释的方式:
  /*   Footer Buttons   */
.footer button { }
.footer button:hover { }
  同时,不要忘了CSS中是没有//这种注释方式的:
  /*  Do  */p {
   padding: 15px;
   /*border: 1px solid #222;*/
}/*  Don't  */p {
   padding: 15px;
   // border: 1px solid #222;  
}
  使用Kebab-case命名变量
  对于样式类名或者ID名的命名都需要在多个单词之间添加-符号,CSS本身是大小写不敏感的因此你是用不了camelCase的,另一方面,很久之前也不支持下划线,所以现在的默认的命名方式就是使用-:
  /*  Do     */
.footer-column-left { }
/*  Don't  */
.footerColumnLeft { }
.footer_column_left { }
  而涉及到具体的变量命名规范时,建议是使用BEM规范,只要遵循一些简单的原则即可以保证基于组件风格的命名一致性。你也可以参考CSS Tricks来获得更多的细节描述。
  避免重复代码
  大部分元素的CSS属性都是从DOM树根部继承而来,这也是其命名为级联样式表的由来。我们以font属性为例,该属性往往是继承自父属性,因此我们并不需要再单独地为元素设置该属性。我们只需要在html或者body中添加该属性然后使其层次传递下去即可:
  html {
   font: normal 16px/1.4 sans-serif;
}
  使用transform添加CSS Animations
  不建议直接改变元素的width与height属性或者left/top/bottom/right这些属性来达到动画效果,而应该优先使用transform()属性来提供更平滑的变换效果,并且能使得代码的可读性会更好:
  .ball {
   left: 50px;
   transition: 0.4s ease-out;
}/* Not Cool*/.ball.slide-out {
   left: 500px;
}/* Cool*/.ball.slide-out {
   transform: translateX(450px);
}
  Transform的几个属性translate、rotate、scale都具有比较好的浏览器兼容性可以放心使用。
  不要重复造轮子
  现在CSS社区已经非常庞大,并且不断地有新的各式各样的库开源出来。这些库可以帮助我们解决从小的代码片到用于构建完整的响应式应用的全框架。所以如果下次你再碰到什么CSS问题的时候,在打算撸起袖子自己上之前可以尝试在GitHUB或者CodePen上搜索可行方案。
  尽可能使用低优先级的选择器
  并不是所有的CSS选择器的优先级都一样,很多初学者在使用CSS选择器的时候都是考虑以新的特性去复写全部的继承特性,不过这一点在某个元素多状态时就麻烦了,譬如下面这个例子:
  a{
   color: #fff;
   padding: 15px;
}
a#blue-btn {
   background-color: blue;
}
a.active {
   background-color: red;
}
  我们本来希望将.active类添加到按钮上然后使其显示为红色,不过在上面这个例子中很明显起不了作用,因为button已经以ID选择器设置过了背景色,也就是所谓的Higher Selector Specificity。一般来说,选择器的优先级顺序为:ID(#id) > Class(.class) > Type(header)
  避免使用!important
  认真的说,千万要避免使用!important,这可能会导致你在未来的开发中无尽的属性重写,你应该选择更合适的CSS选择器。而唯一的可以使用!important属性的场景就是当你想去复写某些行内样式的时候,不过行内样式本身也是需要避免的。
  使用text-transform属性设置文本大写
  Star Wars: The Force Awakens
.movie-poster {
   text-transform: uppercase;
}
  Em, Rem, 以及 Pixel
  已经有很多关于人们应该如何使用em,rem,以及px作为元素尺寸与文本尺寸的讨论,而笔者认为,这三个尺寸单位都有其适用与不适用的地方。不同的开发与项目都有其特定的设置,因此并没有通用的规则来决定应该使用哪个单位,这里是我总结的几个考虑:
  在大型项目中使用预处理器
  估计你肯定听说过 Sass, Less, PostCSS, Stylus这些预处理器与对应的语法。Preprocessors可以允许我们将未来的CSS特性应用在当前的代码开发中,譬如变量支持、函数、嵌套式的选择器以及很多其他的特性,这里我们以Sass为例:
  $accent-color: #2196F3;
a {
   padding: 10px 15px;
   background-color: $accent-color;
}
a:hover {
   background-color: darken($accent-color,10%);
}
  使用Autoprefixers来提升浏览器兼容性
  使用特定的浏览器前缀是CSS开发中常见的工作之一,不同的浏览器、不同的属性对于前缀的要求也不一样,这就使得我们无法在编码过程中记住所有的前缀规则。并且在写样式代码的时候还需要加上特定的浏览器前缀支持也是个麻烦活,幸亏现在也是有很多工具可以辅助我们进行这样的开发:
  在生产环境下使用Minified代码
  为了提升页面的加载速度,在生产环境下我们应该默认使用压缩之后的资源代码。在压缩的过程中,会将所有的空白与重复剔除掉从而减少整个文件的体积大小。当然,经过压缩之后的代码毫无可读性,因此在开发阶段我们还是应该使用普通的版本。对于CSS的压缩有很多的现行工具:
  选择哪个工具肯定是依赖于你自己的工作流啦~
  多参阅Caniuse
  不同的浏览器在兼容性上差异很大,因此如果我们可以针对我们所需要适配的浏览器,在caniuse上我们可以查询某个特性的浏览器版本适配性,是否需要添加特定的前缀或者在某个平台上是否存在Bug等等。不过光光使用caniuse肯定是不够的,我们还需要使用些额外的服务来进行检测。
  Validate:校验
  对于CSS的校验可能不如HTML校验或者JavaScript校验那么重要,不过在正式发布之前用Lint工具校验一波你的CSS代码还是很有意义的。它会告诉你代码中潜在的错误,提示你一些不符合最佳实践的代码以及给你一些提升代码性能的建议。就像Minifers与Autoprefixers,也有很多可用的工具:
  原文:
  译文:
  

7 款从 HTML 文档提取文本的工具

网站优化优采云 发表了文章 • 0 个评论 • 704 次浏览 • 2022-05-15 01:35 • 来自相关话题

  7 款从 HTML 文档提取文本的工具
  
  来自:Dzone
  编译:局长
  下面的工具包括了由为初学者和小项目而设计的非常简单的工具到需要一定的编码知识,旨在用于更大,更困难的任务的高级工具。
  
  收集电子邮件地址、竞争分析、网站检查、定价分析和客户数据收集 — 这些可能只是你需要从 HTML 文档中提取文本和其他数据的几个原因。不幸的是,手动做这种事是很痛苦的而且效率很低,在某些情况下甚至不可能实现。幸运的是,现在有各种各样的工具可以实现这些需求。下面的 7 个工具包括了由为初学者和小项目而设计的非常简单的工具到需要一定的编码知识,旨在用于更大,更困难的任务的高级工具。
  Iconico HTML 文本提取器 (Iconico HTML Text Extractor)
  试想一下,你正在浏览竞争对手的网站,然后想提取出文本内容,又或是想看看页面背后的 HTML 代码。但十分不幸,你发现右键被禁用了,复制和粘贴也是如此。现在许多 Web 开发人员正在采取措施禁用查看源代码,否则锁定其页面。幸运的是,Iconico 有一个 HTML 文本提取器,你可以用来绕过所有的这些限制,而且这个产品非常易于使用。你可以高亮和复制文本,提取功能的运行使用轻易得像上网一样。
  UiPath
  UIPath 有一套自动化过程工具,里面包含了一个 Web 内容抓取实用程序。要使用该工具,并获得所需的几乎任何数据十分简单 — 只需打开页面,转到工具中的设计菜单,然后单击“网络抓取(web scraping)”。 除了网络抓取工具,屏幕抓取工具允许您从网页中拉取任何内容。 使用这两种工具意味着您可以从任何网页抓取文本,表格数据和其他相关信息。
  Mozenda
  Mozenda 允许用户提取 Web数据,并将该信息导出到各种智能商务工具。它不仅可以提取文本内容,还可以从 PDF 文件中提取出图像,文件和内容。然后,你可以将这些数据导出到 XML 文件,CSV 文件,JSON 或者可以选择使用 API。 提取和导出数据后,就可以使用 BI 工具进行分析和报告。
  HTMLtoText
  这款在线工具可以从 HTML 源代码中提取文本,甚至只是一个 URL 也可以。你所需要做的只是复制和粘贴,提供一个 URL 或者上传文件。 单击选项按钮,让工具知道你需要的输出格式和一些其他的细节,然后点击转换,你将获得你需要的文本信息。
  (还有一个类似的工具 —)
  Octoparse
  Octoparse的特征是它提供的是“点击”用户界面。即便是没有过编码知识的用户也可以从网站提取数据并将其发送到各种文件格式。这个工具包括从页面中提取电子邮件地址,从招聘板上提取职位列表等功能。该工具适用于动态和静态网页以及云采集(配置好采集任务关机也能采集数据)。它提供了一个免费版本,对于大多数使用场景应该足够应付,而付费版本则有更多丰富的功能。
  如果你是为了进行竞争分析而抓取网站,可能会因为此活动而被禁止。因为 Octoparse 包含一个循环识别你的 IP 地址的功能,并能通过你的 IP 禁止你使用。
  Scrapy
  这个免费的开源工具使用网络爬虫从网站提取信息,使用这个工具需要一些高级技能和编码知识。但如果你愿意以你的方式去学习使用它,Scrapy 是抓取大型 Web 项目的理想选择。该工具已被 CareerBuilder 和其他主要品牌使用。因为它是一个开源工具,所以这为用户提供了很多良好的社区支持。
  Kimono
  Kimono 是一个免费的工具,从网页获取非结构化数据,并将该信息提取为具有 XML 文件的结构化格式。该工具可以交互使用,也可以创建计划作业以在特定时间提取你需要的数据。你可以从搜索引擎结果、网页、甚至幻灯片演示中提取数据。最重要的是,当你设置好每个工作流时,Kimono 会创建一个 API。这意味着当你返回到网站以提取更多数据时,不必再重新造轮子。
  结论
  如果你遇到需要从一个或多个网页中提取非结构化数据的任务,那么此列表中至少有一个工具应该包含你需要的解决方案。而且无论你的期望价格是什么,你都应该能找到你所需要的工具。了解清楚然后决定哪个是最适合你的。要知道,大数据在企业蓬勃发展中的重要性,并且收集所需信息的能力对于你来说也是至关重要。
   查看全部

  7 款从 HTML 文档提取文本的工具
  
  来自:Dzone
  编译:局长
  下面的工具包括了由为初学者和小项目而设计的非常简单的工具到需要一定的编码知识,旨在用于更大,更困难的任务的高级工具。
  
  收集电子邮件地址、竞争分析、网站检查、定价分析和客户数据收集 — 这些可能只是你需要从 HTML 文档中提取文本和其他数据的几个原因。不幸的是,手动做这种事是很痛苦的而且效率很低,在某些情况下甚至不可能实现。幸运的是,现在有各种各样的工具可以实现这些需求。下面的 7 个工具包括了由为初学者和小项目而设计的非常简单的工具到需要一定的编码知识,旨在用于更大,更困难的任务的高级工具。
  Iconico HTML 文本提取器 (Iconico HTML Text Extractor)
  试想一下,你正在浏览竞争对手的网站,然后想提取出文本内容,又或是想看看页面背后的 HTML 代码。但十分不幸,你发现右键被禁用了,复制和粘贴也是如此。现在许多 Web 开发人员正在采取措施禁用查看源代码,否则锁定其页面。幸运的是,Iconico 有一个 HTML 文本提取器,你可以用来绕过所有的这些限制,而且这个产品非常易于使用。你可以高亮和复制文本,提取功能的运行使用轻易得像上网一样。
  UiPath
  UIPath 有一套自动化过程工具,里面包含了一个 Web 内容抓取实用程序。要使用该工具,并获得所需的几乎任何数据十分简单 — 只需打开页面,转到工具中的设计菜单,然后单击“网络抓取(web scraping)”。 除了网络抓取工具,屏幕抓取工具允许您从网页中拉取任何内容。 使用这两种工具意味着您可以从任何网页抓取文本,表格数据和其他相关信息。
  Mozenda
  Mozenda 允许用户提取 Web数据,并将该信息导出到各种智能商务工具。它不仅可以提取文本内容,还可以从 PDF 文件中提取出图像,文件和内容。然后,你可以将这些数据导出到 XML 文件,CSV 文件,JSON 或者可以选择使用 API。 提取和导出数据后,就可以使用 BI 工具进行分析和报告。
  HTMLtoText
  这款在线工具可以从 HTML 源代码中提取文本,甚至只是一个 URL 也可以。你所需要做的只是复制和粘贴,提供一个 URL 或者上传文件。 单击选项按钮,让工具知道你需要的输出格式和一些其他的细节,然后点击转换,你将获得你需要的文本信息。
  (还有一个类似的工具 —)
  Octoparse
  Octoparse的特征是它提供的是“点击”用户界面。即便是没有过编码知识的用户也可以从网站提取数据并将其发送到各种文件格式。这个工具包括从页面中提取电子邮件地址,从招聘板上提取职位列表等功能。该工具适用于动态和静态网页以及云采集(配置好采集任务关机也能采集数据)。它提供了一个免费版本,对于大多数使用场景应该足够应付,而付费版本则有更多丰富的功能。
  如果你是为了进行竞争分析而抓取网站,可能会因为此活动而被禁止。因为 Octoparse 包含一个循环识别你的 IP 地址的功能,并能通过你的 IP 禁止你使用。
  Scrapy
  这个免费的开源工具使用网络爬虫从网站提取信息,使用这个工具需要一些高级技能和编码知识。但如果你愿意以你的方式去学习使用它,Scrapy 是抓取大型 Web 项目的理想选择。该工具已被 CareerBuilder 和其他主要品牌使用。因为它是一个开源工具,所以这为用户提供了很多良好的社区支持。
  Kimono
  Kimono 是一个免费的工具,从网页获取非结构化数据,并将该信息提取为具有 XML 文件的结构化格式。该工具可以交互使用,也可以创建计划作业以在特定时间提取你需要的数据。你可以从搜索引擎结果、网页、甚至幻灯片演示中提取数据。最重要的是,当你设置好每个工作流时,Kimono 会创建一个 API。这意味着当你返回到网站以提取更多数据时,不必再重新造轮子。
  结论
  如果你遇到需要从一个或多个网页中提取非结构化数据的任务,那么此列表中至少有一个工具应该包含你需要的解决方案。而且无论你的期望价格是什么,你都应该能找到你所需要的工具。了解清楚然后决定哪个是最适合你的。要知道,大数据在企业蓬勃发展中的重要性,并且收集所需信息的能力对于你来说也是至关重要。
  

手把手 | 范例+代码:一文带你上手Python网页抓取神器BeautifulS

网站优化优采云 发表了文章 • 0 个评论 • 98 次浏览 • 2022-05-15 01:23 • 来自相关话题

  手把手 | 范例+代码:一文带你上手Python网页抓取神器BeautifulS
  代码段落并提取相应值
  name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})
  在我们得到标签之后,我们可以用name_box的text属性获取相应值
  name = name_box.text.strip() # strip() 函数用于去除前后空格
  print name
  采用相似的方法,我们可以得到股指价格数据。
  # 获取股指价格数据
  price_box = soup.find(‘div’, attrs={‘class’:’price’})
  price = price_box.text
  print price
  
  当你运行程序时,应该可以看到程序输出当前的标普500指数的价格。
  导出Excel CSV格式数据
  我们已经学会如何获取数据,现在来学习如何存储数据了。Excel逗号隔开的数据格式(CSV)不失为一个好选择。这样我们就可以在Excel中打开数据文件进行查看和进一步处理。
  在此之前,我们需要导入Python的csv模块和datetime模块。Datetime模块用于获取数据记录时间。请将下面几行代码插入您的导入代码部分。
  import csv
  from datetime import datetime
  在您代码的最下方,加上把数据写入CSV文件的代码。
  # 以“添加”模式打开一个csv文件, 以保证文件原有信息不被覆盖
  with open(‘index.csv’, ‘a’) as csv_file:
  writer = csv.writer(csv_file)
  writer.writerow([name, price, datetime.now()])
  
  现在如果运行程序,您应该可以导出一个index.csv文件。您可以在Excel中打开文件,看到里面有如图所示的一行数据。
  所以如果您每天都运行这个程序,您就可以很简单的获取标准普尔指数价格,不需要像之前一样在网站上翻找。
  更进一步(高级用法)
  多个股指
  抓取一个股指信息对您来说不够,对吗?我们可以试试同时提取多个股指信息。首先,我们需要修改quote_page,把它定义为网址的数组。
  quote_page = [‘:IND', ‘:IND']
  然后我们把数据提取部分代码改成一个for循环。这个循环可以一一处理网址,并以元组(tuple)类型把所有数据存入变量data.
  # for 循环
  data = []
  for pg in quote_page:
  # 检索网站并返回HTML代码,存入变量‘page’
  page = urllib2.urlopen(pg)
  # 用 beautifulSoup 解析HTML代码并存入变量 `soup`
  soup = BeautifulSoup(page, ‘html.parser’)
  # 获取“名称”类的
  代码段落并提取相应值
  name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})
  name = name_box.text.strip() # strip() is used to remove starting and trailing
  # 获取股指价格数据
  price_box = soup.find(‘div’, attrs={‘class’:’price’})
  price = price_box.text
  # 用元组类型存储数据
  data.append((name, price))
  并且,修改保存部分以便一行行保存数据
  # 以“添加”模式打开一个csv文件, 以保证文件原有信息不被覆盖
  with open(‘index.csv’, ‘a’) as csv_file:
  writer = csv.writer(csv_file)
  # for 循环
  for name, price in data:
  writer.writerow([name, price, datetime.now()])
  重新运行程序,您应该可以同时提取两个股指价格信息了!
  高级抓取技术
  BeautifulSoup 库使用简单,能很好的完成小量的网站抓取。但是如果您对大量的抓取信息感兴趣,您可以考虑其他方法:
  1. 强大的Python数据抓取框架Scrapy。
  2. 您可以试试把一些公共应用程序接口(Application programming interface, API) 整合入您的代码。这个获取数据的方法远比网页抓取高效。举个例子来说,您可以试试Facebook Graph API,这个应用程序接口可以帮助您获取脸书网站上不显示的隐藏信息。
  3. 如果数据量过大,您可以考虑使用类似MySQL的数据库后端来存储数据。
  采取“别重复”方法
  
  DRY是“别重复你做过的事”的英文简写。您可以尝试像链接中的这个人一样把日常的工作自动化。同时您还可以考虑其他有趣的项目,比如说掌握您的脸书好友的上线时间(当然在征得他们同意的情况下),或者获取某个论坛的讲座主题列表来尝试自然语言处理(这是目前人工智能的热门话题)!
  原文链接:
  2017年7月《顶级数据团队建设全景报告》下载
  
  <p style="margin-top: -1.4em; margin-bottom: 15px; max-width: 100%; min-height: 1em; border: none; line-height: 1.75em; box-sizing: border-box !important; word-wrap: break-word !important;">关于转载
  如需转载,请在开篇显著位置注明作者和出处(转自:大数据文摘 | bigdatadigest),并在文章结尾放置大数据文摘醒目二维码。无原创标识文章请按照转载要求编辑,可直接转载,转载后请将转载链接发送给我们;有原创标识文章,请发送【文章名称-待授权公众号名称及ID】给我们申请白名单授权。未经许可的转载以及改编者,我们将依法追究其法律责任。联系邮箱:zz@bigdatadigest.cn。</p>
  志愿者介绍 查看全部

  手把手 | 范例+代码:一文带你上手Python网页抓取神器BeautifulS
  代码段落并提取相应值
  name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})
  在我们得到标签之后,我们可以用name_box的text属性获取相应值
  name = name_box.text.strip() # strip() 函数用于去除前后空格
  print name
  采用相似的方法,我们可以得到股指价格数据。
  # 获取股指价格数据
  price_box = soup.find(‘div’, attrs={‘class’:’price’})
  price = price_box.text
  print price
  
  当你运行程序时,应该可以看到程序输出当前的标普500指数的价格。
  导出Excel CSV格式数据
  我们已经学会如何获取数据,现在来学习如何存储数据了。Excel逗号隔开的数据格式(CSV)不失为一个好选择。这样我们就可以在Excel中打开数据文件进行查看和进一步处理。
  在此之前,我们需要导入Python的csv模块和datetime模块。Datetime模块用于获取数据记录时间。请将下面几行代码插入您的导入代码部分。
  import csv
  from datetime import datetime
  在您代码的最下方,加上把数据写入CSV文件的代码。
  # 以“添加”模式打开一个csv文件, 以保证文件原有信息不被覆盖
  with open(‘index.csv’, ‘a’) as csv_file:
  writer = csv.writer(csv_file)
  writer.writerow([name, price, datetime.now()])
  
  现在如果运行程序,您应该可以导出一个index.csv文件。您可以在Excel中打开文件,看到里面有如图所示的一行数据。
  所以如果您每天都运行这个程序,您就可以很简单的获取标准普尔指数价格,不需要像之前一样在网站上翻找。
  更进一步(高级用法)
  多个股指
  抓取一个股指信息对您来说不够,对吗?我们可以试试同时提取多个股指信息。首先,我们需要修改quote_page,把它定义为网址的数组。
  quote_page = [‘:IND', ‘:IND']
  然后我们把数据提取部分代码改成一个for循环。这个循环可以一一处理网址,并以元组(tuple)类型把所有数据存入变量data.
  # for 循环
  data = []
  for pg in quote_page:
  # 检索网站并返回HTML代码,存入变量‘page’
  page = urllib2.urlopen(pg)
  # 用 beautifulSoup 解析HTML代码并存入变量 `soup`
  soup = BeautifulSoup(page, ‘html.parser’)
  # 获取“名称”类的
  代码段落并提取相应值
  name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})
  name = name_box.text.strip() # strip() is used to remove starting and trailing
  # 获取股指价格数据
  price_box = soup.find(‘div’, attrs={‘class’:’price’})
  price = price_box.text
  # 用元组类型存储数据
  data.append((name, price))
  并且,修改保存部分以便一行行保存数据
  # 以“添加”模式打开一个csv文件, 以保证文件原有信息不被覆盖
  with open(‘index.csv’, ‘a’) as csv_file:
  writer = csv.writer(csv_file)
  # for 循环
  for name, price in data:
  writer.writerow([name, price, datetime.now()])
  重新运行程序,您应该可以同时提取两个股指价格信息了!
  高级抓取技术
  BeautifulSoup 库使用简单,能很好的完成小量的网站抓取。但是如果您对大量的抓取信息感兴趣,您可以考虑其他方法:
  1. 强大的Python数据抓取框架Scrapy。
  2. 您可以试试把一些公共应用程序接口(Application programming interface, API) 整合入您的代码。这个获取数据的方法远比网页抓取高效。举个例子来说,您可以试试Facebook Graph API,这个应用程序接口可以帮助您获取脸书网站上不显示的隐藏信息。
  3. 如果数据量过大,您可以考虑使用类似MySQL的数据库后端来存储数据。
  采取“别重复”方法
  
  DRY是“别重复你做过的事”的英文简写。您可以尝试像链接中的这个人一样把日常的工作自动化。同时您还可以考虑其他有趣的项目,比如说掌握您的脸书好友的上线时间(当然在征得他们同意的情况下),或者获取某个论坛的讲座主题列表来尝试自然语言处理(这是目前人工智能的热门话题)!
  原文链接:
  2017年7月《顶级数据团队建设全景报告》下载
  
  <p style="margin-top: -1.4em; margin-bottom: 15px; max-width: 100%; min-height: 1em; border: none; line-height: 1.75em; box-sizing: border-box !important; word-wrap: break-word !important;">关于转载
  如需转载,请在开篇显著位置注明作者和出处(转自:大数据文摘 | bigdatadigest),并在文章结尾放置大数据文摘醒目二维码。无原创标识文章请按照转载要求编辑,可直接转载,转载后请将转载链接发送给我们;有原创标识文章,请发送【文章名称-待授权公众号名称及ID】给我们申请白名单授权。未经许可的转载以及改编者,我们将依法追究其法律责任。联系邮箱:zz@bigdatadigest.cn。</p>
  志愿者介绍

编写现代 CSS 代码的 20 个建议

网站优化优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2022-05-12 23:11 • 来自相关话题

  编写现代 CSS 代码的 20 个建议
  的背景图而不是直接使用img标签。基于这种方式配合上background-size与background-position这两个属性,可以很方便地按比例缩放:
  img {  
   width: 300px;  
   height: 200px;  
}  
div {  
   width: 300px;  
   height: 200px;  
   background: url('http://cdn.tutorialzine.com/wp-content/uploads/2016/08/bicycle.jpg');  
   background-position: center center;  
   background-size: cover;  
}  
section{  
   float: left;  
   margin: 15px;  
}
  不过这种方式也是存在缺陷的,譬如你无法设置图片的懒加载、图片无法被搜索引擎或者其他类似的工具抓取到,有个不错的属性叫object-fit可以解决这个问题,不过该属性目前的浏览器支持并不是很完善。
  Better Table Borders
  HTML中使用Tables进行布局一直是个很头疼的问题,它们使用起来很简单,但是无法进行响应式操作,并且也不方便进行全局样式设置。譬如,如果你打算为Table的边与单元的边添加样式,可能得到的结果如下:
  table {  
   width: 600px;  
   border: 1px solid #505050;  
   margin-bottom: 15px;  
   color:#505050;  
}  
td{  
   border: 1px solid #505050;  
   padding: 10px;  
}
  
  这里存在的问题是出现了很多的重复的边,会导致视觉上不协调的情况,那么我们可以通过设置border-collapse:collapse来进行处理:
  
  注释格式优化
  CSS虽然谈不上一门编程语言但是其仍然需要添加注释以保障整体代码的可读性,只要添加些简单的注释不仅可以方便你更好地组织整个样式表还能够让你的同事或者未来的自己更好地理解。对于CSS中整块的注释或者使用在Media-Query中的注释,建议是使用如下形式:
  /*---------------  
   #Header  
---------------*/header { }header nav { }/*---------------  
   #Slideshow  
---------------*/.slideshow { }
  而设计的细节说明或者一些不重要的组件可以用如下单行注释的方式:
  /*   Footer Buttons   */   .footer button { }  
.footer button:hover { }
  同时,不要忘了CSS中是没有//这种注释方式的:
  /*  Do  */p {  
   padding: 15px;  
   /*border: 1px solid #222;*/   }/*  Don't  */p {  
   padding: 15px;  
   // border: 1px solid #222;     }
  使用Kebab-case命名变量
  对于样式类名或者ID名的命名都需要在多个单词之间添加-符号,CSS本身是大小写不敏感的因此你是用不了camelCase的,另一方面,很久之前也不支持下划线,所以现在的默认的命名方式就是使用-:
  /*  Do     */   .footer-column-left { }  
/*  Don't  */   .footerColumnLeft { }  
.footer_column_left { }
  而涉及到具体的变量命名规范时,建议是使用BEM规范,只要遵循一些简单的原则即可以保证基于组件风格的命名一致性。你也可以参考CSS Tricks来获得更多的细节描述。
  避免重复代码
  大部分元素的CSS属性都是从DOM树根部继承而来,这也是其命名为级联样式表的由来。我们以font属性为例,该属性往往是继承自父属性,因此我们并不需要再单独地为元素设置该属性。我们只需要在html或者body中添加该属性然后使其层次传递下去即可:
  html {  
   font: normal 16px/1.4 sans-serif;  
}
  使用transform添加CSS Animations
  不建议直接改变元素的width与height属性或者left/top/bottom/right这些属性来达到动画效果,而应该优先使用transform()属性来提供更平滑的变换效果,并且能使得代码的可读性会更好:
  .ball {  
   left: 50px;  
   transition: 0.4s ease-out;  
}/* Not Cool*/.ball.slide-out {  
   left: 500px;  
}/* Cool*/.ball.slide-out {  
   transform: translateX(450px);  
}
  Transform的几个属性translate、rotate、scale都具有比较好的浏览器兼容性可以放心使用。
  不要重复造轮子
  现在CSS社区已经非常庞大,并且不断地有新的各式各样的库开源出来。这些库可以帮助我们解决从小的代码片到用于构建完整的响应式应用的全框架。所以如果下次你再碰到什么CSS问题的时候,在打算撸起袖子自己上之前可以尝试在GitHUB或者CodePen上搜索可行方案。
  尽可能使用低优先级的选择器
  并不是所有的CSS选择器的优先级都一样,很多初学者在使用CSS选择器的时候都是考虑以新的特性去复写全部的继承特性,不过这一点在某个元素多状态时就麻烦了,譬如下面这个例子:
  a{  
   color: #fff;  
   padding: 15px;  
}  
a#blue-btn {  
   background-color: blue;  
}  
a.active {  
   background-color: red;  
}
  我们本来希望将.active类添加到按钮上然后使其显示为红色,不过在上面这个例子中很明显起不了作用,因为button已经以ID选择器设置过了背景色,也就是所谓的Higher Selector Specificity。一般来说,选择器的优先级顺序为:ID(#id) > Class(.class) > Type(header)
  避免使用!important
  认真的说,千万要避免使用!important,这可能会导致你在未来的开发中无尽的属性重写,你应该选择更合适的CSS选择器。而唯一的可以使用!important属性的场景就是当你想去复写某些行内样式的时候,不过行内样式本身也是需要避免的。
  使用text-transform属性设置文本大写
  Star Wars: The Force Awakens  
.movie-poster {  
   text-transform: uppercase;  
}
  Em, Rem, 以及 Pixel
  已经有很多关于人们应该如何使用em,rem,以及px作为元素尺寸与文本尺寸的讨论,而笔者认为,这三个尺寸单位都有其适用与不适用的地方。不同的开发与项目都有其特定的设置,因此并没有通用的规则来决定应该使用哪个单位,这里是我总结的几个考虑:
  在大型项目中使用预处理器
  估计你肯定听说过Sass,Less,PostCSS,Stylus这些预处理器与对应的语法。Preprocessors可以允许我们将未来的CSS特性应用在当前的代码开发中,譬如变量支持、函数、嵌套式的选择器以及很多其他的特性,这里我们以Sass为例:
  $accent-color: #2196F3;  
a {  
   padding: 10px 15px;  
   background-color: $accent-color;  
}  
a:hover {  
   background-color: darken($accent-color,10%);  
}
  使用Autoprefixers来提升浏览器兼容性
  使用特定的浏览器前缀是CSS开发中常见的工作之一,不同的浏览器、不同的属性对于前缀的要求也不一样,这就使得我们无法在编码过程中记住所有的前缀规则。并且在写样式代码的时候还需要加上特定的浏览器前缀支持也是个麻烦活,幸亏现在也是有很多工具可以辅助我们进行这样的开发:
  在生产环境下使用Minified代码
  为了提升页面的加载速度,在生产环境下我们应该默认使用压缩之后的资源代码。在压缩的过程中,会将所有的空白与重复剔除掉从而减少整个文件的体积大小。当然,经过压缩之后的代码毫无可读性,因此在开发阶段我们还是应该使用普通的版本。对于CSS的压缩有很多的现行工具:
  选择哪个工具肯定是依赖于你自己的工作流啦~
  多参阅Caniuse
  不同的浏览器在兼容性上差异很大,因此如果我们可以针对我们所需要适配的浏览器,在caniuse上我们可以查询某个特性的浏览器版本适配性,是否需要添加特定的前缀或者在某个平台上是否存在Bug等等。不过光光使用caniuse肯定是不够的,我们还需要使用些额外的服务来进行检测。
  Validate:校验
  对于CSS的校验可能不如HTML校验或者JavaScript校验那么重要,不过在正式发布之前用Lint工具校验一波你的CSS代码还是很有意义的。它会告诉你代码中潜在的错误,提示你一些不符合最佳实践的代码以及给你一些提升代码性能的建议。就像Minifers与Autoprefixers,也有很多可用的工具: 查看全部

  编写现代 CSS 代码的 20 个建议
  的背景图而不是直接使用img标签。基于这种方式配合上background-size与background-position这两个属性,可以很方便地按比例缩放:
  img {  
   width: 300px;  
   height: 200px;  
}  
div {  
   width: 300px;  
   height: 200px;  
   background: url('http://cdn.tutorialzine.com/wp-content/uploads/2016/08/bicycle.jpg');  
   background-position: center center;  
   background-size: cover;  
}  
section{  
   float: left;  
   margin: 15px;  
}
  不过这种方式也是存在缺陷的,譬如你无法设置图片的懒加载、图片无法被搜索引擎或者其他类似的工具抓取到,有个不错的属性叫object-fit可以解决这个问题,不过该属性目前的浏览器支持并不是很完善。
  Better Table Borders
  HTML中使用Tables进行布局一直是个很头疼的问题,它们使用起来很简单,但是无法进行响应式操作,并且也不方便进行全局样式设置。譬如,如果你打算为Table的边与单元的边添加样式,可能得到的结果如下:
  table {  
   width: 600px;  
   border: 1px solid #505050;  
   margin-bottom: 15px;  
   color:#505050;  
}  
td{  
   border: 1px solid #505050;  
   padding: 10px;  
}
  
  这里存在的问题是出现了很多的重复的边,会导致视觉上不协调的情况,那么我们可以通过设置border-collapse:collapse来进行处理:
  
  注释格式优化
  CSS虽然谈不上一门编程语言但是其仍然需要添加注释以保障整体代码的可读性,只要添加些简单的注释不仅可以方便你更好地组织整个样式表还能够让你的同事或者未来的自己更好地理解。对于CSS中整块的注释或者使用在Media-Query中的注释,建议是使用如下形式:
  /*---------------  
   #Header  
---------------*/header { }header nav { }/*---------------  
   #Slideshow  
---------------*/.slideshow { }
  而设计的细节说明或者一些不重要的组件可以用如下单行注释的方式:
  /*   Footer Buttons   */   .footer button { }  
.footer button:hover { }
  同时,不要忘了CSS中是没有//这种注释方式的:
  /*  Do  */p {  
   padding: 15px;  
   /*border: 1px solid #222;*/   }/*  Don't  */p {  
   padding: 15px;  
   // border: 1px solid #222;     }
  使用Kebab-case命名变量
  对于样式类名或者ID名的命名都需要在多个单词之间添加-符号,CSS本身是大小写不敏感的因此你是用不了camelCase的,另一方面,很久之前也不支持下划线,所以现在的默认的命名方式就是使用-:
  /*  Do     */   .footer-column-left { }  
/*  Don't  */   .footerColumnLeft { }  
.footer_column_left { }
  而涉及到具体的变量命名规范时,建议是使用BEM规范,只要遵循一些简单的原则即可以保证基于组件风格的命名一致性。你也可以参考CSS Tricks来获得更多的细节描述。
  避免重复代码
  大部分元素的CSS属性都是从DOM树根部继承而来,这也是其命名为级联样式表的由来。我们以font属性为例,该属性往往是继承自父属性,因此我们并不需要再单独地为元素设置该属性。我们只需要在html或者body中添加该属性然后使其层次传递下去即可:
  html {  
   font: normal 16px/1.4 sans-serif;  
}
  使用transform添加CSS Animations
  不建议直接改变元素的width与height属性或者left/top/bottom/right这些属性来达到动画效果,而应该优先使用transform()属性来提供更平滑的变换效果,并且能使得代码的可读性会更好:
  .ball {  
   left: 50px;  
   transition: 0.4s ease-out;  
}/* Not Cool*/.ball.slide-out {  
   left: 500px;  
}/* Cool*/.ball.slide-out {  
   transform: translateX(450px);  
}
  Transform的几个属性translate、rotate、scale都具有比较好的浏览器兼容性可以放心使用。
  不要重复造轮子
  现在CSS社区已经非常庞大,并且不断地有新的各式各样的库开源出来。这些库可以帮助我们解决从小的代码片到用于构建完整的响应式应用的全框架。所以如果下次你再碰到什么CSS问题的时候,在打算撸起袖子自己上之前可以尝试在GitHUB或者CodePen上搜索可行方案。
  尽可能使用低优先级的选择器
  并不是所有的CSS选择器的优先级都一样,很多初学者在使用CSS选择器的时候都是考虑以新的特性去复写全部的继承特性,不过这一点在某个元素多状态时就麻烦了,譬如下面这个例子:
  a{  
   color: #fff;  
   padding: 15px;  
}  
a#blue-btn {  
   background-color: blue;  
}  
a.active {  
   background-color: red;  
}
  我们本来希望将.active类添加到按钮上然后使其显示为红色,不过在上面这个例子中很明显起不了作用,因为button已经以ID选择器设置过了背景色,也就是所谓的Higher Selector Specificity。一般来说,选择器的优先级顺序为:ID(#id) > Class(.class) > Type(header)
  避免使用!important
  认真的说,千万要避免使用!important,这可能会导致你在未来的开发中无尽的属性重写,你应该选择更合适的CSS选择器。而唯一的可以使用!important属性的场景就是当你想去复写某些行内样式的时候,不过行内样式本身也是需要避免的。
  使用text-transform属性设置文本大写
  Star Wars: The Force Awakens  
.movie-poster {  
   text-transform: uppercase;  
}
  Em, Rem, 以及 Pixel
  已经有很多关于人们应该如何使用em,rem,以及px作为元素尺寸与文本尺寸的讨论,而笔者认为,这三个尺寸单位都有其适用与不适用的地方。不同的开发与项目都有其特定的设置,因此并没有通用的规则来决定应该使用哪个单位,这里是我总结的几个考虑:
  在大型项目中使用预处理器
  估计你肯定听说过Sass,Less,PostCSS,Stylus这些预处理器与对应的语法。Preprocessors可以允许我们将未来的CSS特性应用在当前的代码开发中,譬如变量支持、函数、嵌套式的选择器以及很多其他的特性,这里我们以Sass为例:
  $accent-color: #2196F3;  
a {  
   padding: 10px 15px;  
   background-color: $accent-color;  
}  
a:hover {  
   background-color: darken($accent-color,10%);  
}
  使用Autoprefixers来提升浏览器兼容性
  使用特定的浏览器前缀是CSS开发中常见的工作之一,不同的浏览器、不同的属性对于前缀的要求也不一样,这就使得我们无法在编码过程中记住所有的前缀规则。并且在写样式代码的时候还需要加上特定的浏览器前缀支持也是个麻烦活,幸亏现在也是有很多工具可以辅助我们进行这样的开发:
  在生产环境下使用Minified代码
  为了提升页面的加载速度,在生产环境下我们应该默认使用压缩之后的资源代码。在压缩的过程中,会将所有的空白与重复剔除掉从而减少整个文件的体积大小。当然,经过压缩之后的代码毫无可读性,因此在开发阶段我们还是应该使用普通的版本。对于CSS的压缩有很多的现行工具:
  选择哪个工具肯定是依赖于你自己的工作流啦~
  多参阅Caniuse
  不同的浏览器在兼容性上差异很大,因此如果我们可以针对我们所需要适配的浏览器,在caniuse上我们可以查询某个特性的浏览器版本适配性,是否需要添加特定的前缀或者在某个平台上是否存在Bug等等。不过光光使用caniuse肯定是不够的,我们还需要使用些额外的服务来进行检测。
  Validate:校验
  对于CSS的校验可能不如HTML校验或者JavaScript校验那么重要,不过在正式发布之前用Lint工具校验一波你的CSS代码还是很有意义的。它会告诉你代码中潜在的错误,提示你一些不符合最佳实践的代码以及给你一些提升代码性能的建议。就像Minifers与Autoprefixers,也有很多可用的工具:

不写代码也能爬取数据?试试这几个工具

网站优化优采云 发表了文章 • 0 个评论 • 69 次浏览 • 2022-05-08 09:43 • 来自相关话题

  不写代码也能爬取数据?试试这几个工具
  ↑关注 + 星标,后台回复【大礼包】送你2TPython自学资料
  
  前天,有个同学加我微信来咨询我:
  “我想抓取近期 5000 条新闻数据,但我是文科生,不会写代码,请问该怎么办?”
  对于这位同学的问题,我给安排上。
  先说说获取数据的方式:一是利用现成的工具,我们只需懂得如何使用工具就能获取数据,不需要关心工具是怎么实现。打个比方,假如我们在岸上,要去海上某个小岛,岸边有一艘船,我们第一想法是选择坐船过去,而不会想着自己来造一艘船再过去。
  第二种是自己针对场景需求做些定制化工具,这就需要有点编程基础。举个例子,我们还是要到海上某个小岛,同时还要求在 30 分钟内将 1 顿货物送到岛上。
  因此,前期只是单纯想获取数据,没有什么其他要求的话,优先选择现有工具,介绍几个能快速获取网上数据的工具。
  1.Microsoft Excel
  你没有看错,就是 Office 三剑客之一的 Excel。Excel 是一个强大的工具,能抓取数据就是它的功能之一。我以耳机作为关键字,抓取京东的商品列表。
  
  
  等待几秒后,Excel 会将页面上所有的文字信息抓取到表格中。这种方式确实能抓取到数据,但也会引入一些我们不需要的数据。如果你有更高的需求,可以选择后面几个工具。
  2.优采云采集器
  
  优采云是爬虫界的老品牌了,是目前使用人数最多的互联网数据抓取、处理、分析,挖掘软件。它的优势是采集不限网页,不限内容,同时还是分布式采集,效率会高一些。缺点是对小白用户不是很友好,有一定的知识门槛(了解如网页知识、HTTP 协议等方面知识),还需要花些时间熟悉工具操作。
  因为有学习门槛,掌握该工具之后,采集数据上限会很高。有时间和精力的同学可以去折腾折腾。
  官网地址:
  3.优采云采集器
  
  优采云采集器是一款非常适合新手的采集器。它具有简单易用的特点,让你能几分钟中就快手上手。优采云提供一些常见抓取网站的模板,使用模板就能快速抓取数据。如果想抓取没有模板的网站,官网也提供非常详细的图文教程和视频教程。
  优采云是基于浏览器内核实现可视化抓取数据,所以存在卡顿、采集数据慢的特点。但这瑕不掩瑜,能基本满足新手在短时间抓取数据的场景,比如翻页查询,Ajax 动态加载数据等。
  网站:
  4.GooSeeker 集搜客
  
  集搜客也是一款容易上手的可视化采集数据工具。同样能抓取动态网页,也支持可以抓取手机网站上的数据,还支持抓取在指数图表上悬浮显示的数据。集搜客是以浏览器插件形式抓取数据。虽然具有前面所述的有点,但缺点也有,无法多线程采集数据,出现浏览器卡顿也在所难免。
  网站:
  5.Scrapinghub
  
  如果你想抓取国外的网站数据,可以考虑 Scrapinghub。Scrapinghub 是一个基于Python 的 Scrapy 框架的云爬虫平台。Scrapehub 算是市场上非常复杂和强大的网络抓取平台,提供数据抓取的解决方案商。
  地址:
  6.WebScraper
  
  WebScraper 是一款优秀国外的浏览器插件。同样也是一款适合新手抓取数据的可视化工具。我们通过简单设置一些抓取规则,剩下的就交给浏览器去工作。
  地址: 查看全部

  不写代码也能爬取数据?试试这几个工具
  ↑关注 + 星标,后台回复【大礼包】送你2TPython自学资料
  
  前天,有个同学加我微信来咨询我:
  “我想抓取近期 5000 条新闻数据,但我是文科生,不会写代码,请问该怎么办?”
  对于这位同学的问题,我给安排上。
  先说说获取数据的方式:一是利用现成的工具,我们只需懂得如何使用工具就能获取数据,不需要关心工具是怎么实现。打个比方,假如我们在岸上,要去海上某个小岛,岸边有一艘船,我们第一想法是选择坐船过去,而不会想着自己来造一艘船再过去。
  第二种是自己针对场景需求做些定制化工具,这就需要有点编程基础。举个例子,我们还是要到海上某个小岛,同时还要求在 30 分钟内将 1 顿货物送到岛上。
  因此,前期只是单纯想获取数据,没有什么其他要求的话,优先选择现有工具,介绍几个能快速获取网上数据的工具。
  1.Microsoft Excel
  你没有看错,就是 Office 三剑客之一的 Excel。Excel 是一个强大的工具,能抓取数据就是它的功能之一。我以耳机作为关键字,抓取京东的商品列表。
  
  
  等待几秒后,Excel 会将页面上所有的文字信息抓取到表格中。这种方式确实能抓取到数据,但也会引入一些我们不需要的数据。如果你有更高的需求,可以选择后面几个工具。
  2.优采云采集
  
  优采云是爬虫界的老品牌了,是目前使用人数最多的互联网数据抓取、处理、分析,挖掘软件。它的优势是采集不限网页,不限内容,同时还是分布式采集,效率会高一些。缺点是对小白用户不是很友好,有一定的知识门槛(了解如网页知识、HTTP 协议等方面知识),还需要花些时间熟悉工具操作。
  因为有学习门槛,掌握该工具之后,采集数据上限会很高。有时间和精力的同学可以去折腾折腾。
  官网地址:
  3.优采云采集器
  
  优采云采集器是一款非常适合新手的采集器。它具有简单易用的特点,让你能几分钟中就快手上手。优采云提供一些常见抓取网站的模板,使用模板就能快速抓取数据。如果想抓取没有模板的网站,官网也提供非常详细的图文教程和视频教程。
  优采云是基于浏览器内核实现可视化抓取数据,所以存在卡顿、采集数据慢的特点。但这瑕不掩瑜,能基本满足新手在短时间抓取数据的场景,比如翻页查询,Ajax 动态加载数据等。
  网站:
  4.GooSeeker 集搜客
  
  集搜客也是一款容易上手的可视化采集数据工具。同样能抓取动态网页,也支持可以抓取手机网站上的数据,还支持抓取在指数图表上悬浮显示的数据。集搜客是以浏览器插件形式抓取数据。虽然具有前面所述的有点,但缺点也有,无法多线程采集数据,出现浏览器卡顿也在所难免。
  网站:
  5.Scrapinghub
  
  如果你想抓取国外的网站数据,可以考虑 Scrapinghub。Scrapinghub 是一个基于Python 的 Scrapy 框架的云爬虫平台。Scrapehub 算是市场上非常复杂和强大的网络抓取平台,提供数据抓取的解决方案商。
  地址:
  6.WebScraper
  
  WebScraper 是一款优秀国外的浏览器插件。同样也是一款适合新手抓取数据的可视化工具。我们通过简单设置一些抓取规则,剩下的就交给浏览器去工作。
  地址:

从零开发一款自动提取网页html并一键转换为md文件的工具(vue源码版)

网站优化优采云 发表了文章 • 0 个评论 • 73 次浏览 • 2022-05-08 09:42 • 来自相关话题

  从零开发一款自动提取网页html并一键转换为md文件的工具(vue源码版)
  
  最近几年涌现出了很多技术博客和技术社区, 也有很多技术同仁开始打造自己的博客, 我们可以把自己的博客同步到不同的技术平台, 但是随着技术平台的增多, 我们文章同步所花费的时间会越来越多, 那么有没有一个工具能快速的将博客发布到不同的平台呢? 或者有没有一个工具, 可以把html直接转化为技术平台能够识别的“语言”直接发布呢?
  我们都知道程序员最爱的写博客的“语言”就是makedown, 并且目前大部分的技术社区都支持makedown语法, 所以说只要有makedown, 我们就能快速的同步到不同的技术平台.
  也许有人会说, 我们写博客直接用makedown语法写不就好了? 的确这样做可以满足需求, 但缺点就是我们本地必须要保存一份makedown文件, 如果博客内容涉及到图片, 我们还需要维护一个img目录, 这样每次在不同技术社区发布文章还是会很麻烦, 所以综上我们开发了一款自动爬取html内容并一键转换为makedown的工具, 这样我们就可以“肆无忌惮的”发布博客了.
  你将收获
  github地址笔者将在文末附上, 感兴趣的朋友可以一起共建, 学习和探索.
  效果演示
  
  客户端思路
  先理一下思路:
  
  为什么选择turndown
  客户端最重要的一步是html转md,这里我们使用的 turndown。
  为什么使用turndown呢,原因如下:
  具体实现
    // 引入第三方插件<br />  import { gfm, tables, strikethrough } from 'turndown-plugin-gfm'<br /><br />  const turndownService = new TurndownService({ codeBlockStyle: 'fenced' })<br />  // Use the gfm plugin<br />  turndownService.use(gfm)<br /><br />  // Use the table and strikethrough plugins only<br />  turndownService.use([tables, strikethrough])<br /><br />  /**<br />   * 自定义配置(rule名不能重复)<br />   * 这里我们指定 `pre` 标签为代码块,并在代码块的前后加个换行,防止显示异常<br />   */<br />  turndownService.addRule('pre2Code', {<br />    filter: ['pre'],<br />    replacement (content) {<br />      return '```\n' + content + '\n```'<br />    }<br />  })<br />
  额外功能
  支持自动获取链接文章标题,无需手动去原文复制。
  服务端
  这里我们使用的服务端是node.js,用前端的框架写服务端,体验杠杠的。
  思路
  先理一下思路:
  
  具体实现获取前端传递的链接地址
  这里直接使用node的自带语法,我们采用的是get形式传递,用query即可
  const qUrl = req.query.url<br />
  通过请求获取html串
  这里我们是用request进行请求
   request({<br />   url: qUrl<br /> }, (error, response, body) => {<br />   if (error) {<br />     res.status(404).send('Url Error')<br />     return<br />   }<br />   // 这里的 body 就是文章的 `html`<br />   console.log(body)<br /> })<br />
  根据不同平台域名获取不同的dom
  由于技术平台众多,每个平台的文章内容标签、样式名或 id 会有差异,需要针对兼容。
  首先先用js-dom去模拟操作dom,封装一个方法
   /**<br />  * 获取准确的文章内容<br />  * @param {string} html html串<br />  * @param {string} selector css选择器<br />  * @return {string} htmlContent<br />  */<br /> const getDom = (html, selector) => {<br />   const dom = new JSDOM(html)<br />   const htmlContent = dom.window.document.querySelector(selector)<br />   return htmlContent<br /> }<br />
  兼容不同的平台,应用不同的 css 选择器
   // 比如掘金,内容块的样式名为 .markdown-body,内容里会有 style 标签样式和一些多余的复制代码文字,通过原生 dom 操作删掉<br /> if (qUrl.includes('juejin.cn')) {<br />   const htmlContent = getBySelector('.markdown-body')<br />   const extraDom = htmlContent.querySelector('style')<br />   const extraDomArr = htmlContent.querySelectorAll('.copy-code-btn')<br />   extraDom && extraDom.remove()<br />   extraDomArr.length > 0 && extraDomArr.forEach((v) => { v.remove() })<br />   return htmlContent<br /> }<br /><br /> // 再比如 oschina,内容块的样式名为 .article-detail,内容里会有多余的 .ad-wrap 内容,照样删掉<br /> if (qUrl.includes('oschina.net')) {<br />   const htmlContent = getBySelector('.article-detail')<br />   const extraDom = htmlContent.querySelector('.ad-wrap')<br />   extraDom && extraDom.remove()<br />   return htmlContent<br /> }<br /><br /> // 最后匹配通用标签。优先适配 article 标签,没有再用 body 标签<br /> const htmlArticle = getBySelector('article')<br /> if (htmlArticle) { return htmlArticle }<br /><br /> const htmlBody = getBySelector('body')<br /> if (htmlBody) { return htmlBody }<br />
  转换图片和链接的相对路径为绝对路径,方便以后查找源路径
   // 通过原生api - URL 获取链接的源域名<br /> const qOrigin = new URL(qUrl).origin || ''<br /><br /> // 获取图片、链接的绝对路径。通过 URL 将 `路径+源域名` 转换为绝对路径,不熟悉的同学请自行了解<br /> const getAbsoluteUrl = p => new URL(p, qOrigin).href<br /><br /> // 转换图片、链接的相对路径,不同平台的图片懒加载属性名不一样,需要做特定兼容<br /> const changeRelativeUrl = (dom) => {<br />   if (!dom) { return '内容出错~' }<br />   const copyDom = dom<br />   // 获取所有图片<br />   const imgs = copyDom.querySelectorAll('img')<br />   // 获取所有链接<br />   const links = copyDom.querySelectorAll('a')<br />   // 替换完所有路径返回新 dom<br />   imgs.length > 0 && imgs.forEach((v) => {<br />     /**<br />     * 处理懒加载路径<br />     * 简书:data-original-src<br />     * 掘金:data-src<br />     * segmentfault:data-src<br />     */<br />     const src = v.src || v.getAttribute('data-src') || v.getAttribute('data-original-src') || ''<br />     v.src = getAbsoluteUrl(src)<br />   })<br />   links.length > 0 && links.forEach((v) => {<br />     const href = v.href || qUrl<br />     v.href = getAbsoluteUrl(href)<br />   })<br />   return copyDom<br /> }<br /><br /> // 在获取不同平台的文章内容 getBody 方法里,应用 changeRelativeUrl 方法<br /> const getBody = (content) => {<br />   ...<br />   ...<br />   return changeRelativeUrl(htmlContent)<br /> }<br /> 查看全部

  从零开发一款自动提取网页html并一键转换为md文件的工具(vue源码版)
  
  最近几年涌现出了很多技术博客和技术社区, 也有很多技术同仁开始打造自己的博客, 我们可以把自己的博客同步到不同的技术平台, 但是随着技术平台的增多, 我们文章同步所花费的时间会越来越多, 那么有没有一个工具能快速的将博客发布到不同的平台呢? 或者有没有一个工具, 可以把html直接转化为技术平台能够识别的“语言”直接发布呢?
  我们都知道程序员最爱的写博客的“语言”就是makedown, 并且目前大部分的技术社区都支持makedown语法, 所以说只要有makedown, 我们就能快速的同步到不同的技术平台.
  也许有人会说, 我们写博客直接用makedown语法写不就好了? 的确这样做可以满足需求, 但缺点就是我们本地必须要保存一份makedown文件, 如果博客内容涉及到图片, 我们还需要维护一个img目录, 这样每次在不同技术社区发布文章还是会很麻烦, 所以综上我们开发了一款自动爬取html内容并一键转换为makedown的工具, 这样我们就可以“肆无忌惮的”发布博客了.
  你将收获
  github地址笔者将在文末附上, 感兴趣的朋友可以一起共建, 学习和探索.
  效果演示
  
  客户端思路
  先理一下思路:
  
  为什么选择turndown
  客户端最重要的一步是html转md,这里我们使用的 turndown。
  为什么使用turndown呢,原因如下:
  具体实现
    // 引入第三方插件<br />  import { gfm, tables, strikethrough } from 'turndown-plugin-gfm'<br /><br />  const turndownService = new TurndownService({ codeBlockStyle: 'fenced' })<br />  // Use the gfm plugin<br />  turndownService.use(gfm)<br /><br />  // Use the table and strikethrough plugins only<br />  turndownService.use([tables, strikethrough])<br /><br />  /**<br />   * 自定义配置(rule名不能重复)<br />   * 这里我们指定 `pre` 标签为代码块,并在代码块的前后加个换行,防止显示异常<br />   */<br />  turndownService.addRule('pre2Code', {<br />    filter: ['pre'],<br />    replacement (content) {<br />      return '```\n' + content + '\n```'<br />    }<br />  })<br />
  额外功能
  支持自动获取链接文章标题,无需手动去原文复制。
  服务端
  这里我们使用的服务端是node.js,用前端的框架写服务端,体验杠杠的。
  思路
  先理一下思路:
  
  具体实现获取前端传递的链接地址
  这里直接使用node的自带语法,我们采用的是get形式传递,用query即可
  const qUrl = req.query.url<br />
  通过请求获取html串
  这里我们是用request进行请求
   request({<br />   url: qUrl<br /> }, (error, response, body) => {<br />   if (error) {<br />     res.status(404).send('Url Error')<br />     return<br />   }<br />   // 这里的 body 就是文章的 `html`<br />   console.log(body)<br /> })<br />
  根据不同平台域名获取不同的dom
  由于技术平台众多,每个平台的文章内容标签、样式名或 id 会有差异,需要针对兼容。
  首先先用js-dom去模拟操作dom,封装一个方法
   /**<br />  * 获取准确的文章内容<br />  * @param {string} html html串<br />  * @param {string} selector css选择器<br />  * @return {string} htmlContent<br />  */<br /> const getDom = (html, selector) => {<br />   const dom = new JSDOM(html)<br />   const htmlContent = dom.window.document.querySelector(selector)<br />   return htmlContent<br /> }<br />
  兼容不同的平台,应用不同的 css 选择器
   // 比如掘金,内容块的样式名为 .markdown-body,内容里会有 style 标签样式和一些多余的复制代码文字,通过原生 dom 操作删掉<br /> if (qUrl.includes('juejin.cn')) {<br />   const htmlContent = getBySelector('.markdown-body')<br />   const extraDom = htmlContent.querySelector('style')<br />   const extraDomArr = htmlContent.querySelectorAll('.copy-code-btn')<br />   extraDom && extraDom.remove()<br />   extraDomArr.length > 0 && extraDomArr.forEach((v) => { v.remove() })<br />   return htmlContent<br /> }<br /><br /> // 再比如 oschina,内容块的样式名为 .article-detail,内容里会有多余的 .ad-wrap 内容,照样删掉<br /> if (qUrl.includes('oschina.net')) {<br />   const htmlContent = getBySelector('.article-detail')<br />   const extraDom = htmlContent.querySelector('.ad-wrap')<br />   extraDom && extraDom.remove()<br />   return htmlContent<br /> }<br /><br /> // 最后匹配通用标签。优先适配 article 标签,没有再用 body 标签<br /> const htmlArticle = getBySelector('article')<br /> if (htmlArticle) { return htmlArticle }<br /><br /> const htmlBody = getBySelector('body')<br /> if (htmlBody) { return htmlBody }<br />
  转换图片和链接的相对路径为绝对路径,方便以后查找源路径
   // 通过原生api - URL 获取链接的源域名<br /> const qOrigin = new URL(qUrl).origin || ''<br /><br /> // 获取图片、链接的绝对路径。通过 URL 将 `路径+源域名` 转换为绝对路径,不熟悉的同学请自行了解<br /> const getAbsoluteUrl = p => new URL(p, qOrigin).href<br /><br /> // 转换图片、链接的相对路径,不同平台的图片懒加载属性名不一样,需要做特定兼容<br /> const changeRelativeUrl = (dom) => {<br />   if (!dom) { return '内容出错~' }<br />   const copyDom = dom<br />   // 获取所有图片<br />   const imgs = copyDom.querySelectorAll('img')<br />   // 获取所有链接<br />   const links = copyDom.querySelectorAll('a')<br />   // 替换完所有路径返回新 dom<br />   imgs.length > 0 && imgs.forEach((v) => {<br />     /**<br />     * 处理懒加载路径<br />     * 简书:data-original-src<br />     * 掘金:data-src<br />     * segmentfault:data-src<br />     */<br />     const src = v.src || v.getAttribute('data-src') || v.getAttribute('data-original-src') || ''<br />     v.src = getAbsoluteUrl(src)<br />   })<br />   links.length > 0 && links.forEach((v) => {<br />     const href = v.href || qUrl<br />     v.href = getAbsoluteUrl(href)<br />   })<br />   return copyDom<br /> }<br /><br /> // 在获取不同平台的文章内容 getBody 方法里,应用 changeRelativeUrl 方法<br /> const getBody = (content) => {<br />   ...<br />   ...<br />   return changeRelativeUrl(htmlContent)<br /> }<br />

不写代码,也能随心所欲的抓取网页上的数据?

网站优化优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2022-05-08 00:16 • 来自相关话题

  不写代码,也能随心所欲的抓取网页上的数据?
  
  当你需要从互联网上收集信息时,是不是很希望有一个机器人能自动的帮你抓取你想要的数据?而不是新建了一个文档,边浏览网页,边复制粘贴,重复机械乏味的操作....。
  数据分析现在被用于各行各业,使用场景众多:
  新媒体从业者经常都需要对各种大号进行数据分析;
  做产品的童鞋也经常需要统计互联网上产品的用户评论;
  如果你打算自主创业,就更需要从互联网上获取该行业相关公司的动向和该行业的舆情信息;
  如果没有数据,一切都是空谈!
  当然你可以选择编写一个自动抓取数据的爬虫程序,但是python、Java......会学到怀疑人生。
  有没有什么办法,可以不用编写任何代码,又能根据具体情况,轻松的帮你从网页上获取你所需要的数据信息?
  
  答案是,有!
  一款基于Chrome的Web Scraper插件!你只要打开目标网页,设置好抓取格式,喝杯咖啡的工夫,就能轻松获取你需要的数据。
  Web Scraper插件只有英文界面,刚开始使用会有一定的难度。易灵微课早期的用户“明白”,是个程序员,从事过网络、云计算、web 前后端等方向的软件开发工作,还翻译过一本技术书籍《深入理解OpenStack Trove》,他希望分享这款软件的使用方法,帮助没有技术背景的朋友轻松上手这个软件。
  为了确保教程直白易懂,邀请了没有技术背景的热心学员进行内测,并针对性的做了多次改进。
  
  
  
  
  希望不仅教会大家如何抓取数据,还能帮助大家理解为什么这样抓取数据。让大家都能得心应手地去抓取网页数据。
  
  此软件除了简单易用、方便快捷,还有个很大的优点,不受操作系统的限制,MacOS 和 windows 都可以使用,完全基于Chrome的Web Scraper插件。
  本次课程适合不会编程,但对收集分析数据有较多需求的人;Python大神,各路Geek请绕行!
  说明:软件需要在谷歌浏览器内运行,只有能在web端显示的数据,才有可能抓取。有些移动端的APP,如果没有网页版,数据是抓不到的,请慎重选择。
  如果课程内容不符合预期,在进入课堂起一小时内,是可以无条件退款的。
  课程详情
  第一节课:
  基础元素
  1. 环境配置
  2. 统计知乎大 V 所有文章标题
  3. 抓取知乎大 V 所有文章详情页
  4. 批量获取喜爱的图片
  5. 统计 58 同城的租房信息
  开课时间:2017年12月12号 20:00
  第二节课:
  高级元素
  6. 抓取大 V 历史微博 查看全部

  不写代码,也能随心所欲的抓取网页上的数据?
  
  当你需要从互联网上收集信息时,是不是很希望有一个机器人能自动的帮你抓取你想要的数据?而不是新建了一个文档,边浏览网页,边复制粘贴,重复机械乏味的操作....。
  数据分析现在被用于各行各业,使用场景众多:
  新媒体从业者经常都需要对各种大号进行数据分析;
  做产品的童鞋也经常需要统计互联网上产品的用户评论;
  如果你打算自主创业,就更需要从互联网上获取该行业相关公司的动向和该行业的舆情信息;
  如果没有数据,一切都是空谈!
  当然你可以选择编写一个自动抓取数据的爬虫程序,但是python、Java......会学到怀疑人生。
  有没有什么办法,可以不用编写任何代码,又能根据具体情况,轻松的帮你从网页上获取你所需要的数据信息?
  
  答案是,有!
  一款基于Chrome的Web Scraper插件!你只要打开目标网页,设置好抓取格式,喝杯咖啡的工夫,就能轻松获取你需要的数据。
  Web Scraper插件只有英文界面,刚开始使用会有一定的难度。易灵微课早期的用户“明白”,是个程序员,从事过网络、云计算、web 前后端等方向的软件开发工作,还翻译过一本技术书籍《深入理解OpenStack Trove》,他希望分享这款软件的使用方法,帮助没有技术背景的朋友轻松上手这个软件。
  为了确保教程直白易懂,邀请了没有技术背景的热心学员进行内测,并针对性的做了多次改进。
  
  
  
  
  希望不仅教会大家如何抓取数据,还能帮助大家理解为什么这样抓取数据。让大家都能得心应手地去抓取网页数据。
  
  此软件除了简单易用、方便快捷,还有个很大的优点,不受操作系统的限制,MacOS 和 windows 都可以使用,完全基于Chrome的Web Scraper插件。
  本次课程适合不会编程,但对收集分析数据有较多需求的人;Python大神,各路Geek请绕行!
  说明:软件需要在谷歌浏览器内运行,只有能在web端显示的数据,才有可能抓取。有些移动端的APP,如果没有网页版,数据是抓不到的,请慎重选择。
  如果课程内容不符合预期,在进入课堂起一小时内,是可以无条件退款的。
  课程详情
  第一节课:
  基础元素
  1. 环境配置
  2. 统计知乎大 V 所有文章标题
  3. 抓取知乎大 V 所有文章详情页
  4. 批量获取喜爱的图片
  5. 统计 58 同城的租房信息
  开课时间:2017年12月12号 20:00
  第二节课:
  高级元素
  6. 抓取大 V 历史微博

WEB 漏洞之逻辑越权漏洞详解

网站优化优采云 发表了文章 • 0 个评论 • 83 次浏览 • 2022-04-29 17:20 • 来自相关话题

  WEB 漏洞之逻辑越权漏洞详解
  本公众号提供的工具、教程、学习路线、精品文章均为原创或互联网收集,旨在提高网络安全技术水平为目的,只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如果您对文章内容有疑问,可以尝试加入交流群讨论或留言私信,如有侵权请联系小编处理。
  2
  内容速览
  越权访问(Broken Access Control,简称BAC)是Web应用程序中一种常见的漏洞,由于其存在范围广、危害大,被OWASP列为Web应用十大安全隐患的第二名。
  该漏洞是指应用在检查授权时存在纰漏,使得攻击者在获得低权限用户账户后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限才能访问到的页面或数据。
  在实际的代码审计中,这种漏洞往往很难通过工具进行自动化监测,因此在实际应用中危害很大。目前存在着两种越权操作类型,横向越权操作(水平越权)和纵向越权操作(垂直越权),水平越权指的是攻击者越权访问到了一个和他拥有相同权限用户的资源,而垂直越权指的是一个低到高权限的过程.
  在判断时,先分析网站的业务逻辑,通过拦截数据包进行业务逻辑判断,判断数据包中的各个参数的意义
  
  水平越权用户在权限相同级别下的组,可以进行越权访问、修改、删除数据测试方法:垂直越权用户可以在不同权限的组下,进行高级别的权限访问测试方法:漏洞产生原理:代码逻辑问题数据库问题 越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定修复防御方案演示案例:Pikachu-本地越权演示(漏洞成因)水平越权
  
  更改username lucy——&gt;kobe
  
  垂直越权前提条件:获取的添加用户的数据包1.普通用户前端有操作界面可以抓取数据包2.通过网站源码本地搭建自己去模拟抓取3.盲猜管理员账户:admin普通用户:pikachu管理员账户界面
  
  普通账户界面
  
  抓取admin添加账户的包,并且更改为普通用户pikachu的phpsession
  
  放包后,在刷新普通用户界面,出现添加账户
  
  查看代码
  
  数据库表
  
  
  
  
  
  如果想要系统学习网络安全技术
  不妨加入知识星球课程
  《60天入门网络安全渗透测试》
  从入门到案例,贴合实战
  轻松易懂、好玩实用
  
  扫码进入知识星球
  
  
  跟着一起学
  期待你的到来!
  
  往期推荐 查看全部

  WEB 漏洞之逻辑越权漏洞详解
  本公众号提供的工具、教程、学习路线、精品文章均为原创或互联网收集,旨在提高网络安全技术水平为目的,只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如果您对文章内容有疑问,可以尝试加入交流群讨论或留言私信,如有侵权请联系小编处理。
  2
  内容速览
  越权访问(Broken Access Control,简称BAC)是Web应用程序中一种常见的漏洞,由于其存在范围广、危害大,被OWASP列为Web应用十大安全隐患的第二名。
  该漏洞是指应用在检查授权时存在纰漏,使得攻击者在获得低权限用户账户后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限才能访问到的页面或数据。
  在实际的代码审计中,这种漏洞往往很难通过工具进行自动化监测,因此在实际应用中危害很大。目前存在着两种越权操作类型,横向越权操作(水平越权)和纵向越权操作(垂直越权),水平越权指的是攻击者越权访问到了一个和他拥有相同权限用户的资源,而垂直越权指的是一个低到高权限的过程.
  在判断时,先分析网站的业务逻辑,通过拦截数据包进行业务逻辑判断,判断数据包中的各个参数的意义
  
  水平越权用户在权限相同级别下的组,可以进行越权访问、修改、删除数据测试方法:垂直越权用户可以在不同权限的组下,进行高级别的权限访问测试方法:漏洞产生原理:代码逻辑问题数据库问题 越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定修复防御方案演示案例:Pikachu-本地越权演示(漏洞成因)水平越权
  
  更改username lucy——&gt;kobe
  
  垂直越权前提条件:获取的添加用户的数据包1.普通用户前端有操作界面可以抓取数据包2.通过网站源码本地搭建自己去模拟抓取3.盲猜管理员账户:admin普通用户:pikachu管理员账户界面
  
  普通账户界面
  
  抓取admin添加账户的包,并且更改为普通用户pikachu的phpsession
  
  放包后,在刷新普通用户界面,出现添加账户
  
  查看代码
  
  数据库表
  
  
  
  
  
  如果想要系统学习网络安全技术
  不妨加入知识星球课程
  《60天入门网络安全渗透测试》
  从入门到案例,贴合实战
  轻松易懂、好玩实用
  
  扫码进入知识星球
  
  
  跟着一起学
  期待你的到来!
  
  往期推荐

芜湖网站制作优化,公众号定制,微信公众号制作网站怎么弄,上门预约小程序开发

网站优化优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-04-29 17:08 • 来自相关话题

  芜湖网站制作优化,公众号定制,微信公众号制作网站怎么弄,上门预约小程序开发
  系统开发
  网站制作|网络推广
  小程序商城系统|微信商城制作
  电话:(微信)
  
  点击一键拨打电话:
  网站制作建设,企业宣传官网网站建设,网站优化公司,商城源码设计制作,微信公众号怎么制作网站,制作一套网站多少钱,分销微信公众号设计,做网站模板网站快速搭建,手机网站建设
  
  公司主营:微信公众号推广开发,小程序制作,网站制作,网络关键词推广排名,app制作开发,微信商城制作等等。
  为网站选择合适的目标关键词,然后对这些目标关键词进行排名优化,这个过程就是关键词优化,我们也可以将关键词优化定义为网站关键词的排名过程。对于长尾关键词,排名的前提是要保证内容页面的“百度快速收录”,主要原因是要承担快速排名的责任。标签的标题属性的使用。
  在不影响页面功能的情况下,我们可以尝试在标签中添加标题属性,这样更有利于蜘蛛爬行信息。直击引流推广现场 整站优化:所谓的整站优化是网站搜索引擎优化(SEO)的高层次应用,是一种高层次的网站营销策略,整个网站的优化服务不是针对特定的关键词,而是以提升网站搜索引擎的友好性为核心,通过提高网站的质量,可以获得更好的排名权重和搜索流量。避免关键字累积 这里主要指的是新闻源站点软件发布,通常根据不同站点的价格计算,如果你能用关键字相关的“软文本”来实现首页使用SEO,那么在这方面的好处是相当可观的。
  这个决定也会影响你的SEO策略。我强调转型或品牌强化。大多数的实际案例告诉我们,在品牌薄弱的情况下,基于在线平台的大型广告转化率相对较低,往往超出了你的能力。
  
  将百度蜘蛛引入目标站点实际上是一个做百度快速收集的过程,通常以以下形式:锚链接是否与关键字相关?SEO不变 外部入口 很多SEO人员,在做长尾关键词排名时,经常会问一个问题,就是我能否用:长尾关键词排名系统。需要明确的是:长尾关键词排名是为了获得点击量,所以尽量避免长尾内容的贡献。在回答这个问题之前,我们先简单了解一下长尾关键词排名系统,它类似于市场上推出的所谓云推广,利用蜘蛛池引导爬行这些需要排名的长尾页面,通常的原则是使用大量的站点进行操作。
  关键词优化只是对少量网站进行修改和优化,优化效果不能一直保持,存在一定的风险,它只能优化少量的关键词,不利于效果的转化。百度相关关键词及常见问题 理论上,我们应该在核心关键字中添加反向链接。为了避免链接的独立和简化,我们通常会在相关关键字的锚文本中添加一些合理的链接,以使链接结构看起来自然而不是人为的。
  在第一种情况下,自我积累的权重是缓慢的,但广告单价高,流量准确而有价值。利用新闻电台制作所谓的“新闻投稿”已经存在多年了。通常,结算成本是以50元300条新闻链为基础计算的。一般情况是一系列文章。网站的结构是扁树,目录结构不应该太深。每个页面从主页上单击的次数不超过三次,这对于搜索引擎来说太深了。
  
  关键词优化与整站优化效果 此前,许多专家博客强调,使用社交媒体运行长尾搜索引擎优化是通过社交媒体发布长尾内容,这其实是一个错误的想法,主要原因是:大型网站转发。搜索引擎优化的变化 关键词优化只能保证排名,而排名必须通过点击才能获得流量,才能获得访问者,而访问者是转化的基础。在图片中使用alt属性。
  此属性可以在无法加载图片时在页面上显示相关的文本信息,效果相同。虽然我们可以在站点中用长尾关键词对交通入口进行排名,但对于蜘蛛来说,我们需要在站点外建立少量高质量的链接,引导蜘蛛继续爬行。长尾关键词排名中的常见问题 一旦权威站点转发长尾内容,就很难把自己的站点排在前排的大型站点中,至少在这个阶段,即使有原始链接,作用也是有限的。
  提高页面加载速度。CSS可以用来解决不使用背景图片的问题,也可以尝试压缩背景图片的大小,你可以在一张图片上放置几个图标,使用CSSsprite,使用背景位置来找到所需的图像位置。减少HTTP请求的数量,提高网页加载的速度。
  
  提高内容相关性 随着熊掌号的推出,搜索引擎优化技术的排名方法正在被削弱。换言之,过去基于超链接技术的搜索排名将被打破,这使得全新的SEO更加注重内容质量和社会影响力。集中网站权重。
  由于蜘蛛分配给每个页面的权重是确定的,并且这些权重将平均分配给每个链接,为了集中网站的权重,我们可以使用“rel=nofollow”属性,告诉蜘蛛可以将权重分配给其他链接而不必抓取目标页面。关键词优化与整站优化的转化效果 在第二种情况下,自己的网站获得了快速的流量,但广告单价低,洪水泛滥,转化率不高。主要区别在于:使用关键字挖掘工具进行查询。
  当你试图写一篇关于热门关键词的文章时,我们通常会查询相关关键词的数量。通过对多个相关关键词进行分类,并在段落内容中合理分配,可以增加内容的广度,从而提高核心关键词和文章的权威性。“内容为王”仍然发挥着非常重要的作用,特别是在新的搜索时代,百度对高质量内容的支持正在不断深化,基于区块链技术对原创内容进行识别保护,使高质量的内容能够得到合理的展示。 查看全部

  芜湖网站制作优化,公众号定制,微信公众号制作网站怎么弄,上门预约小程序开发
  系统开发
  网站制作|网络推广
  小程序商城系统|微信商城制作
  电话:(微信)
  
  点击一键拨打电话:
  网站制作建设,企业宣传官网网站建设,网站优化公司,商城源码设计制作,微信公众号怎么制作网站,制作一套网站多少钱,分销微信公众号设计,做网站模板网站快速搭建,手机网站建设
  
  公司主营:微信公众号推广开发,小程序制作,网站制作,网络关键词推广排名,app制作开发,微信商城制作等等。
  为网站选择合适的目标关键词,然后对这些目标关键词进行排名优化,这个过程就是关键词优化,我们也可以将关键词优化定义为网站关键词的排名过程。对于长尾关键词,排名的前提是要保证内容页面的“百度快速收录”,主要原因是要承担快速排名的责任。标签的标题属性的使用。
  在不影响页面功能的情况下,我们可以尝试在标签中添加标题属性,这样更有利于蜘蛛爬行信息。直击引流推广现场 整站优化:所谓的整站优化是网站搜索引擎优化(SEO)的高层次应用,是一种高层次的网站营销策略,整个网站的优化服务不是针对特定的关键词,而是以提升网站搜索引擎的友好性为核心,通过提高网站的质量,可以获得更好的排名权重和搜索流量。避免关键字累积 这里主要指的是新闻源站点软件发布,通常根据不同站点的价格计算,如果你能用关键字相关的“软文本”来实现首页使用SEO,那么在这方面的好处是相当可观的。
  这个决定也会影响你的SEO策略。我强调转型或品牌强化。大多数的实际案例告诉我们,在品牌薄弱的情况下,基于在线平台的大型广告转化率相对较低,往往超出了你的能力。
  
  将百度蜘蛛引入目标站点实际上是一个做百度快速收集的过程,通常以以下形式:锚链接是否与关键字相关?SEO不变 外部入口 很多SEO人员,在做长尾关键词排名时,经常会问一个问题,就是我能否用:长尾关键词排名系统。需要明确的是:长尾关键词排名是为了获得点击量,所以尽量避免长尾内容的贡献。在回答这个问题之前,我们先简单了解一下长尾关键词排名系统,它类似于市场上推出的所谓云推广,利用蜘蛛池引导爬行这些需要排名的长尾页面,通常的原则是使用大量的站点进行操作。
  关键词优化只是对少量网站进行修改和优化,优化效果不能一直保持,存在一定的风险,它只能优化少量的关键词,不利于效果的转化。百度相关关键词及常见问题 理论上,我们应该在核心关键字中添加反向链接。为了避免链接的独立和简化,我们通常会在相关关键字的锚文本中添加一些合理的链接,以使链接结构看起来自然而不是人为的。
  在第一种情况下,自我积累的权重是缓慢的,但广告单价高,流量准确而有价值。利用新闻电台制作所谓的“新闻投稿”已经存在多年了。通常,结算成本是以50元300条新闻链为基础计算的。一般情况是一系列文章。网站的结构是扁树,目录结构不应该太深。每个页面从主页上单击的次数不超过三次,这对于搜索引擎来说太深了。
  
  关键词优化与整站优化效果 此前,许多专家博客强调,使用社交媒体运行长尾搜索引擎优化是通过社交媒体发布长尾内容,这其实是一个错误的想法,主要原因是:大型网站转发。搜索引擎优化的变化 关键词优化只能保证排名,而排名必须通过点击才能获得流量,才能获得访问者,而访问者是转化的基础。在图片中使用alt属性。
  此属性可以在无法加载图片时在页面上显示相关的文本信息,效果相同。虽然我们可以在站点中用长尾关键词对交通入口进行排名,但对于蜘蛛来说,我们需要在站点外建立少量高质量的链接,引导蜘蛛继续爬行。长尾关键词排名中的常见问题 一旦权威站点转发长尾内容,就很难把自己的站点排在前排的大型站点中,至少在这个阶段,即使有原始链接,作用也是有限的。
  提高页面加载速度。CSS可以用来解决不使用背景图片的问题,也可以尝试压缩背景图片的大小,你可以在一张图片上放置几个图标,使用CSSsprite,使用背景位置来找到所需的图像位置。减少HTTP请求的数量,提高网页加载的速度。
  
  提高内容相关性 随着熊掌号的推出,搜索引擎优化技术的排名方法正在被削弱。换言之,过去基于超链接技术的搜索排名将被打破,这使得全新的SEO更加注重内容质量和社会影响力。集中网站权重。
  由于蜘蛛分配给每个页面的权重是确定的,并且这些权重将平均分配给每个链接,为了集中网站的权重,我们可以使用“rel=nofollow”属性,告诉蜘蛛可以将权重分配给其他链接而不必抓取目标页面。关键词优化与整站优化的转化效果 在第二种情况下,自己的网站获得了快速的流量,但广告单价低,洪水泛滥,转化率不高。主要区别在于:使用关键字挖掘工具进行查询。
  当你试图写一篇关于热门关键词的文章时,我们通常会查询相关关键词的数量。通过对多个相关关键词进行分类,并在段落内容中合理分配,可以增加内容的广度,从而提高核心关键词和文章的权威性。“内容为王”仍然发挥着非常重要的作用,特别是在新的搜索时代,百度对高质量内容的支持正在不断深化,基于区块链技术对原创内容进行识别保护,使高质量的内容能够得到合理的展示。

Woocommerce网站怎么加Google Ads动态再营销代码

网站优化优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2022-04-29 05:15 • 来自相关话题

  Woocommerce网站怎么加Google Ads动态再营销代码
  看这篇文章的小伙伴应该都已经对Google Ads动态再营销是什么,有什么优势有了解了,我就不再赘述,如果还不清楚的小伙伴,可以看下谷歌官方说明:
  要实现动态再营销,在代码层面我们需要做到:
  1. 能抓取到用户浏览产品的ID
  2. 动态再营销Feed中包含相同ID的产品。
  这两点也同样是大家在配置Google Ads动态再营销代码时遇到的问题,要么不会配置代码,抓不到ID,要么虽然抓到ID了,但是Feed里的ID和我们代码抓取的ID不匹配。
  举个常见的例子,再营销Feed的ID的是网站自动生成的Product id,但是代码里抓取的是我们手动设置的SKU,而SKU和product ID不匹配,这时候Ads里就会提示“代码中的值与您 Feed 中的值不匹配“,动态再营销实际就做不到”动态“(代码抓取到用户浏览了产品ABC,系统想要再投ABC产品广告给用户,去Feed里找ABC的产品信息,怎么也找不到,就”动态“不起来了)
  要做到第一点,抓取到用户浏览产品的ID,需要设置数据层,从数据层中抓取。对于第二点,则要注意抓取的ID和Feed里的ID保持一致。对于Woocommerce网站,过去推荐大家使用的google tag manager for wordpress这个插件可以做到以上两点,且设置简单,以下为操作流程:
  一
  Google Ads里设置动态再营销数据源
  1. 点击工具与设置- 受众群体管理器
  
  2. 点击左侧“您的数据源“-设置代码
  
  3. 选择“收集用户在您网站上执行的特定操作数据,以展示个性化广告“,业务类型选“零售”,点击继续
  
  4. 选择“使用Google跟踪代码管理器“,获取转化ID
  
  二
  插件后里做再营销相关设置
  2. 做动态再营销相关设置
  Google Ads Remarketing: 不勾选
  Google Ads Business Vertical: Retail
  
  Woocomerce网站的product id是特殊的post id, 由wp自动生成。而SKU则是我们手动设置的。如果用插件上传Feed,具体抓取哪个取决于插件和我们的设置。
  根据Feed ID设置方式的不同,product id prefix和use sku instead of ID的设置不同,具体判断方法如下:
  
  以上设置完后,点击Save Changes.
  三
  GTM中设置动态再营销代码
  1. 打开GTM,选择之前导入了GA4电子商务事件的工作区,点击新建代码
  
  2. 如下设置代码
  此代码中引用的动态再营销事件变量和触发器,都是上一篇文章预设好的,直接引用即可。如果还没设置,按此教程设置:
  
  3. 预览与测试
  GTM预览中走一遍完整的电子商务流程,确认每个环节都触发了动态再营销代码,且代码中抓取到了动态参数.
  以查看产品为例,点击触发成功的代码,然后点击右上角“Value“,确认value中抓到了item id等参数:
  PS:注意核对这里抓取到的Item id与Feed中的ID对应
  
  4. 确认无误后,发布代码,Google Ads动态再营销代码即开始生效
  相关文章:
  参考文章:
  交流更多GA GTM相关内容,欢迎加入豌豆出海笔记GA GTM交流群
   查看全部

  Woocommerce网站怎么加Google Ads动态再营销代码
  看这篇文章的小伙伴应该都已经对Google Ads动态再营销是什么,有什么优势有了解了,我就不再赘述,如果还不清楚的小伙伴,可以看下谷歌官方说明:
  要实现动态再营销,在代码层面我们需要做到:
  1. 能抓取到用户浏览产品的ID
  2. 动态再营销Feed中包含相同ID的产品。
  这两点也同样是大家在配置Google Ads动态再营销代码时遇到的问题,要么不会配置代码,抓不到ID,要么虽然抓到ID了,但是Feed里的ID和我们代码抓取的ID不匹配。
  举个常见的例子,再营销Feed的ID的是网站自动生成的Product id,但是代码里抓取的是我们手动设置的SKU,而SKU和product ID不匹配,这时候Ads里就会提示“代码中的值与您 Feed 中的值不匹配“,动态再营销实际就做不到”动态“(代码抓取到用户浏览了产品ABC,系统想要再投ABC产品广告给用户,去Feed里找ABC的产品信息,怎么也找不到,就”动态“不起来了)
  要做到第一点,抓取到用户浏览产品的ID,需要设置数据层,从数据层中抓取。对于第二点,则要注意抓取的ID和Feed里的ID保持一致。对于Woocommerce网站,过去推荐大家使用的google tag manager for wordpress这个插件可以做到以上两点,且设置简单,以下为操作流程:
  一
  Google Ads里设置动态再营销数据源
  1. 点击工具与设置- 受众群体管理器
  
  2. 点击左侧“您的数据源“-设置代码
  
  3. 选择“收集用户在您网站上执行的特定操作数据,以展示个性化广告“,业务类型选“零售”,点击继续
  
  4. 选择“使用Google跟踪代码管理器“,获取转化ID
  
  二
  插件后里做再营销相关设置
  2. 做动态再营销相关设置
  Google Ads Remarketing: 不勾选
  Google Ads Business Vertical: Retail
  
  Woocomerce网站的product id是特殊的post id, 由wp自动生成。而SKU则是我们手动设置的。如果用插件上传Feed,具体抓取哪个取决于插件和我们的设置。
  根据Feed ID设置方式的不同,product id prefix和use sku instead of ID的设置不同,具体判断方法如下:
  
  以上设置完后,点击Save Changes.
  三
  GTM中设置动态再营销代码
  1. 打开GTM,选择之前导入了GA4电子商务事件的工作区,点击新建代码
  
  2. 如下设置代码
  此代码中引用的动态再营销事件变量和触发器,都是上一篇文章预设好的,直接引用即可。如果还没设置,按此教程设置:
  
  3. 预览与测试
  GTM预览中走一遍完整的电子商务流程,确认每个环节都触发了动态再营销代码,且代码中抓取到了动态参数.
  以查看产品为例,点击触发成功的代码,然后点击右上角“Value“,确认value中抓到了item id等参数:
  PS:注意核对这里抓取到的Item id与Feed中的ID对应
  
  4. 确认无误后,发布代码,Google Ads动态再营销代码即开始生效
  相关文章:
  参考文章:
  交流更多GA GTM相关内容,欢迎加入豌豆出海笔记GA GTM交流群
  

网络爬虫之BeautifulSoup详解(含多个案例)

网站优化优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2022-04-29 05:14 • 来自相关话题

  网络爬虫之BeautifulSoup详解(含多个案例)
  在文章中,我们可以很方便的获取网页内容即网页源代码,但通常我们所需要的只是里面的部分数据,这时就需要对网页内容进行解析,从而提取出有意义的数据。比较常见的方法有正则表达式、HTML或XML解析库等。本文我们就给大家介绍一个非常流行、实用、高效的网页解析第三方库-BeautifulSoup。
  BeautifulSoup是Python的一个HTML或XML的第三方解析库,可以用它方便地从网页中提取数据。它提供一些简单的、Python式的函数来处理导航、搜索、修改分析树等功能。它是一个工具箱,利用它可以省去很多烦琐的提取工作,提高了解析效率。
  (1)安装BeautifulSoup库和lxml库:pip install BeautifulSoup4 和pip install lxml
  (2)导入BeautifulSoup类:from bs4 import BeautifulSoup
  (3)创建BeautifulSoup对象,传递网页内容以及解析的方法,例如:
  soup = BeautifulSoup(text, "html.parser")
  (4)通过soup.prettify()方法对网页内容进行格式化输出。
  (5)获取网页中的标签及其内容,例如:soup.标签名、soup.标签名.string等。
  BeautifulSoup类的基本元素
  
  简单程序演示基本元素用法
  m_page.html文件内容如下:
   手把手教你学编程 手把手教你学编程系列资源 手把手教你学Python系列 (1)手把手教你学Python(基础篇): 腾讯课堂 CSDN学院 (2)手把手教你学Python(进阶篇): 腾讯课堂 CSDN学院 手把手教你学Android系列 (1)手把手教你学Android(基础篇):腾讯课堂 (2)手把手教你学Android(案例篇):腾讯课堂 联系方式:1281147324(QQ)
  页面效果如下:
  
  
  网页标签遍历的主要属性
  
  标签树遍历示意图(m_page.html文件)
  
  标签树遍历示例
  
  m_test.html文件内容如下:
   手把手教你学编程 .python{ background-color:#9DF; padding:10; } .android{ background-color:#9CF; padding:10; } body{ background-color:#000; width:1000px; margin:auto; } #content{ background-color:#dFF; height:800px; } .title{ font-size:20px; font-weight:bold; color:#00F; } .stress{ font-weight:bold; font-style:italic; text-decoration:underline; padding-left:2px; padding-right:6px; color:#F00; } a{ color:#909; text-decoration:underline; } a:hover{ color:#00F; font-size:large; } 手把手教你学编程系列资源 手把手教你学Python系列 (1)手把手教你学Python(基础篇): 腾讯课堂 CSDN学院 (2)手把手教你学Python(进阶篇): 腾讯课堂 CSDN学院 手把手教你学Android系列 (1)手把手教你学Android(基础篇):腾讯课堂 (2)手把手教你学Android(案例篇):腾讯课堂 联系方式:1281147324(QQ)
  页面效果如下:
  
  
  想一想,尝试实现下述要求。(提示:class属性值是一个列表。)
  通过标签遍历虽然可以查找到每一个标签,但过程比较繁琐,效率不高。在BeautifulSoup中为我们提供了一些高效的方法可以根据条件快速查找到符合条件的标签。
  标准选择器
  标 准 选 择 器 示 例
  
  CSS 选 择 器 示 例
  
  实战案例-获取各省份的大学信息
  
  代码参考
  import requestsfrom bs4 import BeautifulSoup<br /><br />def get_text(url): try: headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '} # 构建请求头 res = requests.get(url, headers=headers) # 发送请求 res.encoding = res.apparent_encoding # 设置编码格式 res.raise_for_status() # 是否成功访问 return res.text # 返回网页源代码 except Exception as e: print(e) # 抛出异常, 打印异常信息<br /><br />def parse_province(text): # 解析网页获取省份及其链接 b_soup = BeautifulSoup(text, "html.parser") # 构建BeautifulSoup对象 ul_tag = b_soup.find(class_="txt3 center") # 找到ul标签 a_tags = ul_tag.select("li a") # 找到所有a标签 province_dict = {} # 定义字典 for item in a_tags: # 循环遍历每一个超链接 province_dict[item.string] = item["href"][2:] # 以省份为键,链接为值构建字典 province_dict.pop("海外") # 删除不需要的记录 return province_dict # 返回结果<br /><br />def get_schools_by_province(url): # 获取某个省份的所有学校信息 temp_content = get_text(url) # 请求网页,得到网页源代码 b_soup = BeautifulSoup(temp_content, "html.parser") # 构建BeautifulSoup对象 a_tags = b_soup.select("ul.l4 li a") # 获取所有的学校超链接 schools = [] # 定义列表,保存该省份所有的学校 for item in a_tags: # 循环遍历每一个标签 schools.append(item.string) # 获取标签内容即学校信息 return schools # 返回学校信息<br /><br />if __name__ == '__main__': index_url = "https://daxue.911cha.com/" # 起始页网址 content = get_text(index_url) # 请求网页获取源代码 provinces = parse_province(content) # 获取省份及其链接 with open("schools.txt", mode="w", encoding="utf-8") as fp: # 保存到文件 for key, value in provinces.items(): print("当前解析的省份为:", key, index_url + value) school_list = get_schools_by_province(index_url + value) # 获取某个省份的院校列表 for school in school_list: fp.write(",".join([school, key]) + "\n") # 保存学校、省份信息,单独占一行<br />
  相关代码资源,可关注Python资源分享微信公众号,回复 bs即可获取。 查看全部

  网络爬虫之BeautifulSoup详解(含多个案例)
  在文章中,我们可以很方便的获取网页内容即网页源代码,但通常我们所需要的只是里面的部分数据,这时就需要对网页内容进行解析,从而提取出有意义的数据。比较常见的方法有正则表达式、HTML或XML解析库等。本文我们就给大家介绍一个非常流行、实用、高效的网页解析第三方库-BeautifulSoup。
  BeautifulSoup是Python的一个HTML或XML的第三方解析库,可以用它方便地从网页中提取数据。它提供一些简单的、Python式的函数来处理导航、搜索、修改分析树等功能。它是一个工具箱,利用它可以省去很多烦琐的提取工作,提高了解析效率。
  (1)安装BeautifulSoup库和lxml库:pip install BeautifulSoup4 和pip install lxml
  (2)导入BeautifulSoup类:from bs4 import BeautifulSoup
  (3)创建BeautifulSoup对象,传递网页内容以及解析的方法,例如:
  soup = BeautifulSoup(text, "html.parser")
  (4)通过soup.prettify()方法对网页内容进行格式化输出。
  (5)获取网页中的标签及其内容,例如:soup.标签名、soup.标签名.string等。
  BeautifulSoup类的基本元素
  
  简单程序演示基本元素用法
  m_page.html文件内容如下:
   手把手教你学编程 手把手教你学编程系列资源 手把手教你学Python系列 (1)手把手教你学Python(基础篇): 腾讯课堂 CSDN学院 (2)手把手教你学Python(进阶篇): 腾讯课堂 CSDN学院 手把手教你学Android系列 (1)手把手教你学Android(基础篇):腾讯课堂 (2)手把手教你学Android(案例篇):腾讯课堂 联系方式:1281147324(QQ)
  页面效果如下:
  
  
  网页标签遍历的主要属性
  
  标签树遍历示意图(m_page.html文件)
  
  标签树遍历示例
  
  m_test.html文件内容如下:
   手把手教你学编程 .python{ background-color:#9DF; padding:10; } .android{ background-color:#9CF; padding:10; } body{ background-color:#000; width:1000px; margin:auto; } #content{ background-color:#dFF; height:800px; } .title{ font-size:20px; font-weight:bold; color:#00F; } .stress{ font-weight:bold; font-style:italic; text-decoration:underline; padding-left:2px; padding-right:6px; color:#F00; } a{ color:#909; text-decoration:underline; } a:hover{ color:#00F; font-size:large; } 手把手教你学编程系列资源 手把手教你学Python系列 (1)手把手教你学Python(基础篇): 腾讯课堂 CSDN学院 (2)手把手教你学Python(进阶篇): 腾讯课堂 CSDN学院 手把手教你学Android系列 (1)手把手教你学Android(基础篇):腾讯课堂 (2)手把手教你学Android(案例篇):腾讯课堂 联系方式:1281147324(QQ)
  页面效果如下:
  
  
  想一想,尝试实现下述要求。(提示:class属性值是一个列表。)
  通过标签遍历虽然可以查找到每一个标签,但过程比较繁琐,效率不高。在BeautifulSoup中为我们提供了一些高效的方法可以根据条件快速查找到符合条件的标签。
  标准选择器
  标 准 选 择 器 示 例
  
  CSS 选 择 器 示 例
  
  实战案例-获取各省份的大学信息
  
  代码参考
  import requestsfrom bs4 import BeautifulSoup<br /><br />def get_text(url): try: headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '} # 构建请求头 res = requests.get(url, headers=headers) # 发送请求 res.encoding = res.apparent_encoding # 设置编码格式 res.raise_for_status() # 是否成功访问 return res.text # 返回网页源代码 except Exception as e: print(e) # 抛出异常, 打印异常信息<br /><br />def parse_province(text): # 解析网页获取省份及其链接 b_soup = BeautifulSoup(text, "html.parser") # 构建BeautifulSoup对象 ul_tag = b_soup.find(class_="txt3 center") # 找到ul标签 a_tags = ul_tag.select("li a") # 找到所有a标签 province_dict = {} # 定义字典 for item in a_tags: # 循环遍历每一个超链接 province_dict[item.string] = item["href"][2:] # 以省份为键,链接为值构建字典 province_dict.pop("海外") # 删除不需要的记录 return province_dict # 返回结果<br /><br />def get_schools_by_province(url): # 获取某个省份的所有学校信息 temp_content = get_text(url) # 请求网页,得到网页源代码 b_soup = BeautifulSoup(temp_content, "html.parser") # 构建BeautifulSoup对象 a_tags = b_soup.select("ul.l4 li a") # 获取所有的学校超链接 schools = [] # 定义列表,保存该省份所有的学校 for item in a_tags: # 循环遍历每一个标签 schools.append(item.string) # 获取标签内容即学校信息 return schools # 返回学校信息<br /><br />if __name__ == '__main__': index_url = "https://daxue.911cha.com/" # 起始页网址 content = get_text(index_url) # 请求网页获取源代码 provinces = parse_province(content) # 获取省份及其链接 with open("schools.txt", mode="w", encoding="utf-8") as fp: # 保存到文件 for key, value in provinces.items(): print("当前解析的省份为:", key, index_url + value) school_list = get_schools_by_province(index_url + value) # 获取某个省份的院校列表 for school in school_list: fp.write(",".join([school, key]) + "\n") # 保存学校、省份信息,单独占一行<br />
  相关代码资源,可关注Python资源分享微信公众号,回复 bs即可获取。

网页源代码抓取工具(网页源代码抓取工具实例之vuerpe自定义轮播图实例)

网站优化优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2022-04-20 13:04 • 来自相关话题

  网页源代码抓取工具(网页源代码抓取工具实例之vuerpe自定义轮播图实例)
  网页源代码抓取工具实例之vuerpe自定义轮播图实例-微信大学-微信大学
  px换一个东西算然后带过去就可以了。如果是不换东西算px那就要加一些特殊处理,参考react有点复杂,就不推荐了。
  生成一下页面,看看每一块都转换了多少像素进去,算一下重算一遍,
  有swiper这个插件可以自定义轮播图的大小如果想学习可以看看他的博客twidere/swiper-bootcamp
  mux,
  可以用wxwidget自己定义浏览器尺寸嘛
  这个问题不是很简单吗,你要做什么样的轮播?只是轮播一张图吗?如果你是想做组件的话,jquery-bootstrap-轮播组件就可以,如果你只是想作为代码在页面中划分区域那就css-margin-top-9x如果只是简单的放大缩小轮播图的话可以自己做,
  手机上其实有一个轮播扩展库叫dagel-panel,可以实现。如果用ppt的话可以看看万彩办公大师模拟演示一下。
  百度有个更好的。
  可以将需要放大缩小的源码发给我,px换百分比。
  使用px-margin-top-9x这个拓展,用9的图,然后确保页面左右两端宽度不重叠。
  轮播拼页可以用jquery/jquery-bootstrap-bars
  用百度吧,可以实现。
  ppt
  虽然能够实现,但一旦遇到这种需求,我一般的处理方法是装两套扩展,一套在windows上,一套在mac上,重点突出一个跨浏览器,如果在mac上只需要2步:swiper-booth-9x或webkit-bootstrap-9x如果要用png可以到pnglayer这个app中去插入, 查看全部

  网页源代码抓取工具(网页源代码抓取工具实例之vuerpe自定义轮播图实例)
  网页源代码抓取工具实例之vuerpe自定义轮播图实例-微信大学-微信大学
  px换一个东西算然后带过去就可以了。如果是不换东西算px那就要加一些特殊处理,参考react有点复杂,就不推荐了。
  生成一下页面,看看每一块都转换了多少像素进去,算一下重算一遍,
  有swiper这个插件可以自定义轮播图的大小如果想学习可以看看他的博客twidere/swiper-bootcamp
  mux,
  可以用wxwidget自己定义浏览器尺寸嘛
  这个问题不是很简单吗,你要做什么样的轮播?只是轮播一张图吗?如果你是想做组件的话,jquery-bootstrap-轮播组件就可以,如果你只是想作为代码在页面中划分区域那就css-margin-top-9x如果只是简单的放大缩小轮播图的话可以自己做,
  手机上其实有一个轮播扩展库叫dagel-panel,可以实现。如果用ppt的话可以看看万彩办公大师模拟演示一下。
  百度有个更好的。
  可以将需要放大缩小的源码发给我,px换百分比。
  使用px-margin-top-9x这个拓展,用9的图,然后确保页面左右两端宽度不重叠。
  轮播拼页可以用jquery/jquery-bootstrap-bars
  用百度吧,可以实现。
  ppt
  虽然能够实现,但一旦遇到这种需求,我一般的处理方法是装两套扩展,一套在windows上,一套在mac上,重点突出一个跨浏览器,如果在mac上只需要2步:swiper-booth-9x或webkit-bootstrap-9x如果要用png可以到pnglayer这个app中去插入,

网页源代码抓取工具(爬取在豆瓣网上的电影《超时空同居》导演和演员信息 )

网站优化优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2022-04-19 09:13 • 来自相关话题

  网页源代码抓取工具(爬取在豆瓣网上的电影《超时空同居》导演和演员信息
)
  接下来,我们将分享一个非常简单的例子。我们想在豆瓣上爬取电影《时空同居》的导演和演员信息。
  首先我们找到电影的网址:
  
  右键查看网页查看页面源码的源码(也可以进入开发者模式(inspect)):
  
  接下来,我们输入网页的源代码。我们要采集的信息在源代码中,输入关键字即可查看。比如这里我们输入'雷佳音'来定位我们要找的位置:
  
  接下来我们需要对TML格式进行分析,比如我们要找出所有的主角:
  
  可以看到有一个通用的规则:star的名字对应的节点的名字是a,属性都是rel="v:starring",这样我们就可以很方便的使用xpath语法来定位拥有的元素这个元素。节点,然后找出所有结果。
  同理,director名字对应的节点名命名为a,属性都是rel="v:dir​​ectedBy"。我们也可以通过这个定位找到对应的文字:
  
  具体代码如下:
  import requests

from lxml import etree





url=&#39;https://movie.douban.com/subje ... 39%3B #输入我们的url

get = requests.get(url).text # get(url) 得到我们的网页, text将源网页转化为字符串





selector = etree.HTML(get) # 将源码转换为xpath可以识别的TML格式





info = {} #字典用于储存信息

info[&#39;电影&#39;] = selector.xpath(&#39;//title/text()&#39;)[0].strip() # 定位电影名字

info[&#39;导演&#39;]=selector.xpath(&#39;//a[@rel="v:directedBy"]/text()&#39;) # 定位导演名字

info[&#39;演员&#39;]=selector.xpath(&#39;//a[@rel="v:starring"]/text()&#39;) # 定位演员名字

print(info)
  最后我们得到一个字典集的结果:
  {&#39;电影&#39;: &#39;超时空同居 (豆瓣)&#39;, &#39;导演&#39;: [&#39;苏伦&#39;], &#39;演员&#39;: [&#39;雷佳音&#39;, &#39;佟丽娅&#39;, &#39;张衣&#39;, &#39;于和伟&#39;, &#39;王正佳&#39;, &#39;陶虹&#39;, &#39;李念&#39;, &#39;李光洁&#39;, &#39;杨玏&#39;, &#39;范明&#39;, &#39;徐峥&#39;, &#39;杨迪&#39;, &#39;方龄&#39;, &#39;陈昊&#39;]}
  实例分享2——爬取json格式的豆瓣电影信息
  首先,json是一种轻量级的数据交换格式。其简洁明了的层次结构使JSON成为一种理想的数据交换语言,易于人类读写,也易于机器解析生成,有效改善网络传输。效率。
  在我们爬取的过程中,有时可以在开发者模式返回的网页中找到完整的json格式数据。这时候我们可以使用requests包中的json函数将爬取的原文转换成格式,方便我们提取内容。我们以豆瓣电影为例:
  
  这是我们点击分类后看到的电影信息。如果我们想爬取这些电影的信息,可以右键进入开发者模式(inspector)。
  
  开启开发者模式后一定要刷新一次,否则之前收到的页面信息将无法显示。然后我们在右侧选项卡上选择网络,点击下面的XHR选项,我们会看到一个返回的网页,双击它。
  
  上图是打开的json文件。因为我的电脑已经下载了json插件,所以格式比较清晰(使用Chrome浏览器的同学可以进入Chrome商店下载Juan Ramón JSON Beautifier Chrome插件)。其实Json文件也可以理解为一个大字典,里面有很多层的小字典和列表。我们找到json网页后,只需要使用requests将其转换成json格式,就可以很方便的提取信息了。代码显示如下:
  import requests
url=&#39;https://movie.douban.com/j/new ... e%3D0,10&tags=&start=0&#39;
get = requests.get(url).json() #用json()函数得到网页源码

get = get[&#39;data&#39;]

info = {}

for i in range(len(get)):



info[get[i][&#39;title&#39;]] = [get[i][&#39;directors&#39;], get[i][&#39;rate&#39;] ] #提取每部电影的导演和评分

print(info) 查看全部

  网页源代码抓取工具(爬取在豆瓣网上的电影《超时空同居》导演和演员信息
)
  接下来,我们将分享一个非常简单的例子。我们想在豆瓣上爬取电影《时空同居》的导演和演员信息。
  首先我们找到电影的网址:
  
  右键查看网页查看页面源码的源码(也可以进入开发者模式(inspect)):
  
  接下来,我们输入网页的源代码。我们要采集的信息在源代码中,输入关键字即可查看。比如这里我们输入'雷佳音'来定位我们要找的位置:
  
  接下来我们需要对TML格式进行分析,比如我们要找出所有的主角:
  
  可以看到有一个通用的规则:star的名字对应的节点的名字是a,属性都是rel="v:starring",这样我们就可以很方便的使用xpath语法来定位拥有的元素这个元素。节点,然后找出所有结果。
  同理,director名字对应的节点名命名为a,属性都是rel="v:dir​​ectedBy"。我们也可以通过这个定位找到对应的文字:
  
  具体代码如下:
  import requests

from lxml import etree





url=&#39;https://movie.douban.com/subje ... 39%3B #输入我们的url

get = requests.get(url).text # get(url) 得到我们的网页, text将源网页转化为字符串





selector = etree.HTML(get) # 将源码转换为xpath可以识别的TML格式





info = {} #字典用于储存信息

info[&#39;电影&#39;] = selector.xpath(&#39;//title/text()&#39;)[0].strip() # 定位电影名字

info[&#39;导演&#39;]=selector.xpath(&#39;//a[@rel="v:directedBy"]/text()&#39;) # 定位导演名字

info[&#39;演员&#39;]=selector.xpath(&#39;//a[@rel="v:starring"]/text()&#39;) # 定位演员名字

print(info)
  最后我们得到一个字典集的结果:
  {&#39;电影&#39;: &#39;超时空同居 (豆瓣)&#39;, &#39;导演&#39;: [&#39;苏伦&#39;], &#39;演员&#39;: [&#39;雷佳音&#39;, &#39;佟丽娅&#39;, &#39;张衣&#39;, &#39;于和伟&#39;, &#39;王正佳&#39;, &#39;陶虹&#39;, &#39;李念&#39;, &#39;李光洁&#39;, &#39;杨玏&#39;, &#39;范明&#39;, &#39;徐峥&#39;, &#39;杨迪&#39;, &#39;方龄&#39;, &#39;陈昊&#39;]}
  实例分享2——爬取json格式的豆瓣电影信息
  首先,json是一种轻量级的数据交换格式。其简洁明了的层次结构使JSON成为一种理想的数据交换语言,易于人类读写,也易于机器解析生成,有效改善网络传输。效率。
  在我们爬取的过程中,有时可以在开发者模式返回的网页中找到完整的json格式数据。这时候我们可以使用requests包中的json函数将爬取的原文转换成格式,方便我们提取内容。我们以豆瓣电影为例:
  
  这是我们点击分类后看到的电影信息。如果我们想爬取这些电影的信息,可以右键进入开发者模式(inspector)。
  
  开启开发者模式后一定要刷新一次,否则之前收到的页面信息将无法显示。然后我们在右侧选项卡上选择网络,点击下面的XHR选项,我们会看到一个返回的网页,双击它。
  
  上图是打开的json文件。因为我的电脑已经下载了json插件,所以格式比较清晰(使用Chrome浏览器的同学可以进入Chrome商店下载Juan Ramón JSON Beautifier Chrome插件)。其实Json文件也可以理解为一个大字典,里面有很多层的小字典和列表。我们找到json网页后,只需要使用requests将其转换成json格式,就可以很方便的提取信息了。代码显示如下:
  import requests
url=&#39;https://movie.douban.com/j/new ... e%3D0,10&tags=&start=0&#39;
get = requests.get(url).json() #用json()函数得到网页源码

get = get[&#39;data&#39;]

info = {}

for i in range(len(get)):



info[get[i][&#39;title&#39;]] = [get[i][&#39;directors&#39;], get[i][&#39;rate&#39;] ] #提取每部电影的导演和评分

print(info)

官方客服QQ群

微信人工客服

QQ人工客服


线