python网页数据抓取

python网页数据抓取

python网页数据抓取( Python网络爬虫内容提取器一文项目启动说明(一))

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

  python网页数据抓取(
Python网络爬虫内容提取器一文项目启动说明(一))
  
  一,。导言
  在PythonWebCrawler内容提取器文章中,我们详细解释了核心组件:可插入内容提取器类gsextractor。本文记录了在确定GSR萃取器工艺路线过程中的程序设计实验。这是第一部分。实验使用XSLT一次性提取静态网页内容并将其转换为XML格式
  二,。使用lxml库提取网页内容
  Lxml是python的一个库,它可以快速灵活地处理XML。它支持XML路径语言(XPath)和可扩展样式表语言转换(XSLT),并实现公共元素树API
  在这两天里,我测试了如何在Python中通过XSLT提取网页内容。有关纪录如下:
  2.1,抓住目标
  假设您要提取jisoke官网上旧论坛的帖子标题和回复号,如下图所示,您需要提取整个列表并以XML格式保存
  
  2.2,源代码1:只抓取当前页面,结果显示在控制台上
  Python的优点是它可以用少量代码解决问题。请注意,下面的代码看起来很长。事实上,Python函数调用很少,XSLT脚本占用了很大的空间。在这段代码中,它只是一个长字符串。关于为什么选择XSLT而不是离散XPath或抓头正则表达式,请参阅根据python实时web爬虫项目启动说明,我们希望通过此架构节省程序员一半以上的时间
  您可以复制并运行以下代码(在Windows 10中,python3.2)通过下一次测试:
  from urllib import request
from lxml import etree
url="http://www.gooseeker.com/cn/forum/7"
conn = request.urlopen(url)
doc = etree.HTML(conn.read())
xslt_root = etree.XML("""\
""")
transform = etree.XSLT(xslt_root)
result_tree = transform(doc)
print(result_tree)
  2.3,获取结果
  抓取结果如下图所示:
  
  2.4,源代码2:页面爬网并将结果存储在文件中
  我们是对的2.2对代码进行了进一步修改,增加了翻页、抓取和保存结果文件的功能。代码如下:
  from urllib import request
from lxml import etree
import time
xslt_root = etree.XML("""\
""")
baseurl = "http://www.gooseeker.com/cn/forum/7"
basefilebegin = "jsk_bbs_"
basefileend = ".xml"
count = 1
while (count < 12):
url = baseurl + "?page=" + str(count)
conn = request.urlopen(url)
doc = etree.HTML(conn.read())
transform = etree.XSLT(xslt_root)
result_tree = transform(doc)
print(str(result_tree))
file_obj = open(basefilebegin+str(count)+basefileend,'w',encoding='UTF-8')
file_obj.write(str(result_tree))
file_obj.close()
count += 1
time.sleep(2)
  我们添加了用于编写文件的代码和一个循环来构造每个翻页的web地址。但是,如果网页地址在翻页过程中保持不变怎么办?事实上,这就是动态web内容,将在下面讨论
  三,。总结
  这是开源Python通用爬虫项目的验证过程。在爬虫框架中,其他部分很容易变得通用,也就是说,提取web内容并将其转换为结构的操作很难通用,我们称之为提取器。然而,借助gooseeker视觉提取规则生成器MS,提取程序的生成过程将变得非常方便,可以使用标准化的插入,从而实现通用的爬虫程序。在文章的后续文章中,我们将具体解释MS和python之间合作的具体方法
  四,。下次阅读
  本文介绍的方法通常用于捕获静态web页面的内容,即所谓HTML文档中的内容。目前,许多网站内容是通过JavaScript动态生成的。一开始,HTML没有这些内容。如果通过后加载添加,则需要采用动态技术。请阅读Python crawler使用selenium+phantom JS获取Ajax和动态HTML内容
  五,。Jisoke gooseeker开源代码下载源代码
  1.GooSeeker开源Python web爬虫GitHub源代码
  六,。文档修改历史记录
  2016-05-26:V2.0,新增文字说明;添加了帖子的代码
  2016-05-29:V2.1. 添加上一章的源代码下载源代码 查看全部

  python网页数据抓取(
Python网络爬虫内容提取器一文项目启动说明(一))
  
  一,。导言
  在PythonWebCrawler内容提取器文章中,我们详细解释了核心组件:可插入内容提取器类gsextractor。本文记录了在确定GSR萃取器工艺路线过程中的程序设计实验。这是第一部分。实验使用XSLT一次性提取静态网页内容并将其转换为XML格式
  二,。使用lxml库提取网页内容
  Lxml是python的一个库,它可以快速灵活地处理XML。它支持XML路径语言(XPath)和可扩展样式表语言转换(XSLT),并实现公共元素树API
  在这两天里,我测试了如何在Python中通过XSLT提取网页内容。有关纪录如下:
  2.1,抓住目标
  假设您要提取jisoke官网上旧论坛的帖子标题和回复号,如下图所示,您需要提取整个列表并以XML格式保存
  
  2.2,源代码1:只抓取当前页面,结果显示在控制台上
  Python的优点是它可以用少量代码解决问题。请注意,下面的代码看起来很长。事实上,Python函数调用很少,XSLT脚本占用了很大的空间。在这段代码中,它只是一个长字符串。关于为什么选择XSLT而不是离散XPath或抓头正则表达式,请参阅根据python实时web爬虫项目启动说明,我们希望通过此架构节省程序员一半以上的时间
  您可以复制并运行以下代码(在Windows 10中,python3.2)通过下一次测试:
  from urllib import request
from lxml import etree
url="http://www.gooseeker.com/cn/forum/7"
conn = request.urlopen(url)
doc = etree.HTML(conn.read())
xslt_root = etree.XML("""\
""")
transform = etree.XSLT(xslt_root)
result_tree = transform(doc)
print(result_tree)
  2.3,获取结果
  抓取结果如下图所示:
  
  2.4,源代码2:页面爬网并将结果存储在文件中
  我们是对的2.2对代码进行了进一步修改,增加了翻页、抓取和保存结果文件的功能。代码如下:
  from urllib import request
from lxml import etree
import time
xslt_root = etree.XML("""\
""")
baseurl = "http://www.gooseeker.com/cn/forum/7"
basefilebegin = "jsk_bbs_"
basefileend = ".xml"
count = 1
while (count < 12):
url = baseurl + "?page=" + str(count)
conn = request.urlopen(url)
doc = etree.HTML(conn.read())
transform = etree.XSLT(xslt_root)
result_tree = transform(doc)
print(str(result_tree))
file_obj = open(basefilebegin+str(count)+basefileend,'w',encoding='UTF-8')
file_obj.write(str(result_tree))
file_obj.close()
count += 1
time.sleep(2)
  我们添加了用于编写文件的代码和一个循环来构造每个翻页的web地址。但是,如果网页地址在翻页过程中保持不变怎么办?事实上,这就是动态web内容,将在下面讨论
  三,。总结
  这是开源Python通用爬虫项目的验证过程。在爬虫框架中,其他部分很容易变得通用,也就是说,提取web内容并将其转换为结构的操作很难通用,我们称之为提取器。然而,借助gooseeker视觉提取规则生成器MS,提取程序的生成过程将变得非常方便,可以使用标准化的插入,从而实现通用的爬虫程序。在文章的后续文章中,我们将具体解释MS和python之间合作的具体方法
  四,。下次阅读
  本文介绍的方法通常用于捕获静态web页面的内容,即所谓HTML文档中的内容。目前,许多网站内容是通过JavaScript动态生成的。一开始,HTML没有这些内容。如果通过后加载添加,则需要采用动态技术。请阅读Python crawler使用selenium+phantom JS获取Ajax和动态HTML内容
  五,。Jisoke gooseeker开源代码下载源代码
  1.GooSeeker开源Python web爬虫GitHub源代码
  六,。文档修改历史记录
  2016-05-26:V2.0,新增文字说明;添加了帖子的代码
  2016-05-29:V2.1. 添加上一章的源代码下载源代码

python网页数据抓取(Python精品电子书籍与50G+优质视频学习资料~)

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

  python网页数据抓取(Python精品电子书籍与50G+优质视频学习资料~)
  关注官方账号:小张Python,为您准备了50+Python高质量电子书和50G+高质量视频学习资料。后台回复关键词:可获取1024个;如果您对博客内容有任何疑问,请在后台添加作者【个人微信】,您可以直接与作者沟通
  你好,我在调零~
  今天,我们来谈谈如何使用Python抓取京东产品。数据包括产品名称、价格和其他信息
  
  此爬虫程序使用的核心库是selenium+pyquery。Selenium用于驱动浏览器模拟网页访问,pyquery用于解析网页信息以进行数据提取。让我们先看看最后的效果
  
  脚本启动后,selenium将自动打开JD网页,翻页产品页面信息,并在浏览器翻页时控制后台返回提取的数据
  在介绍主程序之前,这里是selenium包
  硒装置
  Selenium主要用作web应用程序的测试工具。它可以操纵浏览器完成一系列步骤,模拟人工操作;例如,在web上自动填写文本和查询快递订单号没有问题。目前,它支持Java、python、c#、ruby等语言
  
  在进行网页爬网时,某些网页的数据是用Ajax呈现的,例如微博。标题没有进入下一页,通过刷新页面实现翻页效果;这种网页数据不是直接放在HTML中,而是由用户操作触发,触发嵌入HTML中的JS命令,从而调用存储在JSON文件中的数据并最终呈现
  对于此类网页采集,有两个基本思路:
  因此,selenium工具可以有效地抑制网页上的一些反爬行措施
  当Python使用selenium时,它可以使用封装的selenium库。在安装过程中,可以使用PIP命令完成
  pip install selenium
  目前,selenium支持chrome和Firefox。最好选择chrome,因为互联网上有更多关于chrome的文档
  但是,在使用之前,除了确保安装了Chrome浏览器外,还需要确保还安装了chromedriver.exe工具(selenium的核心是webdriver,chromedriver.exe是Chrome的webdriver工具)
  chromedriver的版本需要与Chrome浏览器的版本相对应。你可以在本地下载
  
  下载地址如下:
  二,。爬虫逻辑
  要使用selenium捕获JD数据以模拟人工操作,必须依次执行以下步骤(这里以捕获Python书籍商品为例):
  
  首先,您需要初始化并创建webdriver的Chrome浏览器和数据存储文件(这里我使用TXT文件)
  def __init__(self,item_name,txt_path):
url = &#39;https://www.jd.com/&#39; # 登录网址
self.url = url
self.item_name = item_name
self.txt_file = open(txt_path,encoding=&#39;utf-8&#39;,mode=&#39;w+&#39;)
options = webdriver.ChromeOptions() # 谷歌选项
# 设置为开发者模式,避免被识别
options.add_experimental_option(&#39;excludeSwitches&#39;,
[&#39;enable-automation&#39;])
self.browser = webdriver.Chrome(executable_path= "C:/Program Files/Google/Chrome/Application/chromedriver.exe",
options = options)
self.wait = WebDriverWait(self.browser,2)
  网络驱动程序。Chrome()方法用于创建受驱动浏览器Chrome,并将路径分配给先前下载到可执行路径参数的本地chromedriver.exe文件夹
  当浏览器打开网页时,由于网络速度,可能会出现加载缓慢的问题。因此,webdriverwait方法用于创建等待方法。浏览器需要等待2秒钟才能执行下一个操作
  初始化操作完成后,主程序进行模拟访问、输入、点击等操作;我将所有这些操作封装到run()函数中
   def run(self):
"""登陆接口"""
self.browser.get(self.url)

input_edit = self.browser.find_element(By.CSS_SELECTOR,&#39;#key&#39;)
input_edit.clear()
input_edit.send_keys(self.item_name)
search_button = self.browser.find_element(By.CSS_SELECTOR,&#39;#search > div > div.form > button&#39;)
search_button.click()# 点击
time.sleep(2)
html = self.browser.page_source # 获取 html
self.parse_html(html)
current_url = self.browser.current_url # 获取当前页面 url
initial_url = str(current_url).split(&#39;&pvid&#39;)[0]
for i in range(1,100):
try:
print(&#39;正在解析----------------{}图片&#39;.format(str(i)))
next_page_url = initial_url + &#39;&page={}&s={}&click=0&#39;.format(str(i*2+1),str(i*60+1))
print(next_page_url)
self.browser.get(next_page_url)
self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,&#39;#J_goodsList > ul > li&#39;)))
html = self.browser.page_source
self.parse_html(html)# 对 html 网址进行解析
time.sleep(2) # 设置频率
except Exception as e:
print(&#39;Error Next page&#39;,e)
self.txt_file.close()# 关闭 txt 文件
  首先,使用get()方法访问JD主页,然后在页面编辑、搜索按钮中找到搜索栏和搜索按钮标签输入;完成输入并单击操作
  对于网页元素标记定位,如果没有,可以使用浏览器开发人员模式将其分为以下步骤(以css_选择器为例):
  在翻页操作过程中,根据京东的URL法则进行构建
  第5页
  https://search.jd.com/Search%3 ... k%3D0
  第6页
  https://search.jd.com/Search%3 ... k%3D0
  如果仔细检查,您会发现第5页和第6页上的URL之间的唯一区别是两个参数page和S
  根据这一规则,京东商品信息的前100页是通过改变页面和S参数来构建的,以完成数据捕获
  对于数据提取部分,我使用parse_uhtml函数
  
  为了提高程序的友好性,我将所有函数封装到一个类中。用户只需输入两个参数,一个是所需的采集商品名称,另一个是存储文件路径;可以完成数据爬网
  
  最后,将抓取的数据存储在TXT文件中,结果如下
  
  四,。总结
  尽管selenium已经有效地破解了web端的一些反爬行机制,但对于某些网站应用程序(如pull hook)来说,它是无用的。当您使用selenium驱动浏览器模拟pull hook官方网站上的翻页操作时,网站可以识别非人工操作、阻止IP并发出警告
  本文涉及的完整源代码文章请关注微信公众号:小张python,后台回复关键词:京东商品即可获得 查看全部

  python网页数据抓取(Python精品电子书籍与50G+优质视频学习资料~)
  关注官方账号:小张Python,为您准备了50+Python高质量电子书和50G+高质量视频学习资料。后台回复关键词:可获取1024个;如果您对博客内容有任何疑问,请在后台添加作者【个人微信】,您可以直接与作者沟通
  你好,我在调零~
  今天,我们来谈谈如何使用Python抓取京东产品。数据包括产品名称、价格和其他信息
  
  此爬虫程序使用的核心库是selenium+pyquery。Selenium用于驱动浏览器模拟网页访问,pyquery用于解析网页信息以进行数据提取。让我们先看看最后的效果
  
  脚本启动后,selenium将自动打开JD网页,翻页产品页面信息,并在浏览器翻页时控制后台返回提取的数据
  在介绍主程序之前,这里是selenium包
  硒装置
  Selenium主要用作web应用程序的测试工具。它可以操纵浏览器完成一系列步骤,模拟人工操作;例如,在web上自动填写文本和查询快递订单号没有问题。目前,它支持Java、python、c#、ruby等语言
  
  在进行网页爬网时,某些网页的数据是用Ajax呈现的,例如微博。标题没有进入下一页,通过刷新页面实现翻页效果;这种网页数据不是直接放在HTML中,而是由用户操作触发,触发嵌入HTML中的JS命令,从而调用存储在JSON文件中的数据并最终呈现
  对于此类网页采集,有两个基本思路:
  因此,selenium工具可以有效地抑制网页上的一些反爬行措施
  当Python使用selenium时,它可以使用封装的selenium库。在安装过程中,可以使用PIP命令完成
  pip install selenium
  目前,selenium支持chrome和Firefox。最好选择chrome,因为互联网上有更多关于chrome的文档
  但是,在使用之前,除了确保安装了Chrome浏览器外,还需要确保还安装了chromedriver.exe工具(selenium的核心是webdriver,chromedriver.exe是Chrome的webdriver工具)
  chromedriver的版本需要与Chrome浏览器的版本相对应。你可以在本地下载
  
  下载地址如下:
  二,。爬虫逻辑
  要使用selenium捕获JD数据以模拟人工操作,必须依次执行以下步骤(这里以捕获Python书籍商品为例):
  
  首先,您需要初始化并创建webdriver的Chrome浏览器和数据存储文件(这里我使用TXT文件)
  def __init__(self,item_name,txt_path):
url = &#39;https://www.jd.com/&#39; # 登录网址
self.url = url
self.item_name = item_name
self.txt_file = open(txt_path,encoding=&#39;utf-8&#39;,mode=&#39;w+&#39;)
options = webdriver.ChromeOptions() # 谷歌选项
# 设置为开发者模式,避免被识别
options.add_experimental_option(&#39;excludeSwitches&#39;,
[&#39;enable-automation&#39;])
self.browser = webdriver.Chrome(executable_path= "C:/Program Files/Google/Chrome/Application/chromedriver.exe",
options = options)
self.wait = WebDriverWait(self.browser,2)
  网络驱动程序。Chrome()方法用于创建受驱动浏览器Chrome,并将路径分配给先前下载到可执行路径参数的本地chromedriver.exe文件夹
  当浏览器打开网页时,由于网络速度,可能会出现加载缓慢的问题。因此,webdriverwait方法用于创建等待方法。浏览器需要等待2秒钟才能执行下一个操作
  初始化操作完成后,主程序进行模拟访问、输入、点击等操作;我将所有这些操作封装到run()函数中
   def run(self):
"""登陆接口"""
self.browser.get(self.url)

input_edit = self.browser.find_element(By.CSS_SELECTOR,&#39;#key&#39;)
input_edit.clear()
input_edit.send_keys(self.item_name)
search_button = self.browser.find_element(By.CSS_SELECTOR,&#39;#search > div > div.form > button&#39;)
search_button.click()# 点击
time.sleep(2)
html = self.browser.page_source # 获取 html
self.parse_html(html)
current_url = self.browser.current_url # 获取当前页面 url
initial_url = str(current_url).split(&#39;&pvid&#39;)[0]
for i in range(1,100):
try:
print(&#39;正在解析----------------{}图片&#39;.format(str(i)))
next_page_url = initial_url + &#39;&page={}&s={}&click=0&#39;.format(str(i*2+1),str(i*60+1))
print(next_page_url)
self.browser.get(next_page_url)
self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,&#39;#J_goodsList > ul > li&#39;)))
html = self.browser.page_source
self.parse_html(html)# 对 html 网址进行解析
time.sleep(2) # 设置频率
except Exception as e:
print(&#39;Error Next page&#39;,e)
self.txt_file.close()# 关闭 txt 文件
  首先,使用get()方法访问JD主页,然后在页面编辑、搜索按钮中找到搜索栏和搜索按钮标签输入;完成输入并单击操作
  对于网页元素标记定位,如果没有,可以使用浏览器开发人员模式将其分为以下步骤(以css_选择器为例):
  在翻页操作过程中,根据京东的URL法则进行构建
  第5页
  https://search.jd.com/Search%3 ... k%3D0
  第6页
  https://search.jd.com/Search%3 ... k%3D0
  如果仔细检查,您会发现第5页和第6页上的URL之间的唯一区别是两个参数page和S
  根据这一规则,京东商品信息的前100页是通过改变页面和S参数来构建的,以完成数据捕获
  对于数据提取部分,我使用parse_uhtml函数
  
  为了提高程序的友好性,我将所有函数封装到一个类中。用户只需输入两个参数,一个是所需的采集商品名称,另一个是存储文件路径;可以完成数据爬网
  
  最后,将抓取的数据存储在TXT文件中,结果如下
  
  四,。总结
  尽管selenium已经有效地破解了web端的一些反爬行机制,但对于某些网站应用程序(如pull hook)来说,它是无用的。当您使用selenium驱动浏览器模拟pull hook官方网站上的翻页操作时,网站可以识别非人工操作、阻止IP并发出警告
  本文涉及的完整源代码文章请关注微信公众号:小张python,后台回复关键词:京东商品即可获得

python网页数据抓取( ,涉及Python时间函数及正则匹配的相关操作技巧)

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

  python网页数据抓取(
,涉及Python时间函数及正则匹配的相关操作技巧)
  Python实现周期性抓取网页内容的方法
  更新时间:2015-11-04 15:22:07 作者:intergret
  这个文章主要介绍了Python中定时抓取网页内容的方法,涉及到Python时间函数和正则匹配的相关操作技巧。有一定的参考价值,有需要的朋友可以参考以下
  本文介绍了 Python 如何实现定期抓取网页内容的示例。分享给大家,供大家参考,如下:
  1.使用sched模块定期执行指定的函数
  2.在指定函数的周期性执行中抓取指定网页,解析出想要的网页内容,代码为六味论坛在线人数
  用于统计论坛在线人数的代码:
<p>
#coding=utf-8
import time,sched,os,urllib2,re,string
#初始化sched模块的scheduler类
#第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞。
s = sched.scheduler(time.time,time.sleep)
#被周期性调度触发的函数
def event_func():
req = urllib2.Request('http://bt.neu6.edu.cn/')
response = urllib2.urlopen(req)
rawdata = response.read()
response.close()
usernump = re.compile(r'总计 .*? 人在线')
usernummatch = usernump.findall(rawdata)
if usernummatch:
currentnum=usernummatch[0]
currentnum=currentnum[string.index(currentnum,'>')+1:string.rindex(currentnum,' 查看全部

  python网页数据抓取(
,涉及Python时间函数及正则匹配的相关操作技巧)
  Python实现周期性抓取网页内容的方法
  更新时间:2015-11-04 15:22:07 作者:intergret
  这个文章主要介绍了Python中定时抓取网页内容的方法,涉及到Python时间函数和正则匹配的相关操作技巧。有一定的参考价值,有需要的朋友可以参考以下
  本文介绍了 Python 如何实现定期抓取网页内容的示例。分享给大家,供大家参考,如下:
  1.使用sched模块定期执行指定的函数
  2.在指定函数的周期性执行中抓取指定网页,解析出想要的网页内容,代码为六味论坛在线人数
  用于统计论坛在线人数的代码:
<p>
#coding=utf-8
import time,sched,os,urllib2,re,string
#初始化sched模块的scheduler类
#第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞。
s = sched.scheduler(time.time,time.sleep)
#被周期性调度触发的函数
def event_func():
req = urllib2.Request('http://bt.neu6.edu.cn/')
response = urllib2.urlopen(req)
rawdata = response.read()
response.close()
usernump = re.compile(r'总计 .*? 人在线')
usernummatch = usernump.findall(rawdata)
if usernummatch:
currentnum=usernummatch[0]
currentnum=currentnum[string.index(currentnum,'>')+1:string.rindex(currentnum,'

python网页数据抓取(1.使用urllib.request获取网页使用Python爬取网页数据 )

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

  python网页数据抓取(1.使用urllib.request获取网页使用Python爬取网页数据
)
  过去当你需要一些网页的信息时,用Python写一个爬虫来爬取非常方便。
  转载:
  1. 使用 urllib.request 获取网页 使用 Python 抓取网页数据1. 使用 urllib.request 获取网页
  urllib 是 Python 中的内置 HTTP 库。使用 urllib 可以通过非常简单的步骤高效采集数据;配合Beautiful等HTML解析库,可以为采集网络数据编写大型爬虫;
  注:示例代码是用Python3编写的; urllib 是 Python2 中 urllib 和 urllib2 的组合,Python2 中的 urllib2 对应于 Python3 中的 urllib.request。
  简单例子:
  import urllib.request # 引入urllib.request
response = urllib.request.urlopen(&#39;http://www.zhihu.com&#39;) # 打开URL
html = response.read() # 读取内容
html = html.decode(&#39;utf-8&#39;) # 解码
print(html)
  2.伪造的请求头信息
  有时候爬虫发起的请求会被服务器拒绝。这时候就需要将爬虫伪装成人类用户的浏览器。这通常是通过伪造请求头信息来实现的,例如:
  import urllib.request
head = {}
head[&#39;User-Agent&#39;]=&#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.0..&#39;
req = urllib.request.Request(url,head) # 伪造请求头
response = urllib.request.urlopen(req)
html = response.read().decode(&#39;utf-8&#39;)
print(html)
  3.伪造的请求体
  爬取一些网站时,需要POST数据到服务器,然后需要伪造请求体;
  为了实现有道词典的在线翻译脚本,在Chrome中打开开发工具,在Network下找到方法为POST的请求。观察数据,可以发现请求体中的'i'是需要翻译的URL编码内容。因此,可以伪造请求体,例如:
  import urllib.request
import urllib.parse
import json
while True:
content = input(&#39;请输入要翻译的内容:&#39;)
if content == &#39;exit!&#39;:
break
url=&#39;http://fanyi.youdao.com/transl ... 39%3B
# 请求主体
data = {}
data[&#39;type&#39;] = "AUTO"
data[&#39;i&#39;] = content
data[&#39;doctype&#39;] = "json"
data[&#39;xmlVersion&#39;] = "1.8"
data[&#39;keyfrom&#39;] = "fanyi.web"
data[&#39;ue&#39;] = "UTF-8"
data[&#39;action&#39;] = "FY_BY_CLICKBUTTON"
data[&#39;typoResult&#39;] = "true"
data = urllib.parse.urlencode(data).encode(&#39;utf-8&#39;)
head = {}
head[&#39;User-Agent&#39;] = &#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.0&#39;
req = urllib.request.Request(url,data,head) # 伪造请求头和请求主体
response = urllib.request.urlopen(req)
html = response.read().decode(&#39;utf-8&#39;)
target = json.loads(html)
print(&#39;翻译结果: &#39;,(target[&#39;translateResult&#39;][0][0][&#39;tgt&#39;]))
  也可以使用add_header()方法来伪造请求头,比如:
  import urllib.request
import urllib.parse
import json
while True:
content = input(&#39;请输入要翻译的内容(exit!):&#39;)
if content == &#39;exit!&#39;:
break
url = &#39;http://fanyi.youdao.com/transl ... 39%3B
# 请求主体
data = {}
data[&#39;type&#39;] = "AUTO"
data[&#39;i&#39;] = content
data[&#39;doctype&#39;] = "json"
data[&#39;xmlVersion&#39;] = "1.8"
data[&#39;keyfrom&#39;] = "fanyi.web"
data[&#39;ue&#39;] = "UTF-8"
data[&#39;action&#39;] = "FY_BY_CLICKBUTTON"
data[&#39;typoResult&#39;] = "true"
data = urllib.parse.urlencode(data).encode(&#39;utf-8&#39;)
req = urllib.request.Request(url,data)
req.add_header(&#39;User-Agent&#39;,&#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.0&#39;)
response = urllib.request.urlopen(req)
html=response.read().decode(&#39;utf-8&#39;)
target = json.loads(html)
print(&#39;翻译结果: &#39;,(target[&#39;translateResult&#39;][0][0][&#39;tgt&#39;]))
  4.使用代理IP
  为了避免采集爬虫过于频繁导致的IP阻塞问题,可以使用代理IP,如:
  # 参数是一个字典{&#39;类型&#39;:&#39;代理ip:端口号&#39;}
proxy_support = urllib.request.ProxyHandler({&#39;type&#39;: &#39;ip:port&#39;})
# 定制一个opener
opener = urllib.request.build_opener(proxy_support)
# 安装opener
urllib.request.install_opener(opener)
#调用opener
opener.open(url)
  注意:使用爬虫过于频繁地访问目标站点会占用大量服务器资源。大型分布式爬虫可以爬取某个站点甚至对该站点发起DDOS攻击;因此,应该合理使用爬虫来抓取数据 安排抓取频率和时间;如:在服务器相对空闲的时间(如:清晨)爬取,完成一个爬取任务后暂停一段时间等;
  5.检查网页的编码方式
  虽然大部分网页都采用UTF-8编码,但有时您会遇到使用其他编码方式的网页,因此您必须了解网页的编码方式才能正确解码抓取到的页面;
  chardet是python的第三方模块,使用chardet可以自动检测网页的编码;
  安装chardet:pip install charest
  使用:
  import chardet
url = &#39;http://www,baidu.com&#39;
html = urllib.request.urlopen(url).read()
>>> chardet.detect(html)
{&#39;confidence&#39;: 0.99, &#39;encoding&#39;: &#39;utf-8&#39;}
  6.获取跳转链接
  有时网页的某个页面需要在原创URL的基础上进行一次甚至多次重定向才能最终到达目的页面,因此需要正确处理重定向;
  通过requests模块的head()函数获取跳转链接的URL,如
  url=&#39;https://unsplash.com/photos/B1 ... 39%3B
res = requests.head(url)
re=res.headers[&#39;Location&#39;] 查看全部

  python网页数据抓取(1.使用urllib.request获取网页使用Python爬取网页数据
)
  过去当你需要一些网页的信息时,用Python写一个爬虫来爬取非常方便。
  转载:
  1. 使用 urllib.request 获取网页 使用 Python 抓取网页数据1. 使用 urllib.request 获取网页
  urllib 是 Python 中的内置 HTTP 库。使用 urllib 可以通过非常简单的步骤高效采集数据;配合Beautiful等HTML解析库,可以为采集网络数据编写大型爬虫;
  注:示例代码是用Python3编写的; urllib 是 Python2 中 urllib 和 urllib2 的组合,Python2 中的 urllib2 对应于 Python3 中的 urllib.request。
  简单例子:
  import urllib.request # 引入urllib.request
response = urllib.request.urlopen(&#39;http://www.zhihu.com&#39;) # 打开URL
html = response.read() # 读取内容
html = html.decode(&#39;utf-8&#39;) # 解码
print(html)
  2.伪造的请求头信息
  有时候爬虫发起的请求会被服务器拒绝。这时候就需要将爬虫伪装成人类用户的浏览器。这通常是通过伪造请求头信息来实现的,例如:
  import urllib.request
head = {}
head[&#39;User-Agent&#39;]=&#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.0..&#39;
req = urllib.request.Request(url,head) # 伪造请求头
response = urllib.request.urlopen(req)
html = response.read().decode(&#39;utf-8&#39;)
print(html)
  3.伪造的请求体
  爬取一些网站时,需要POST数据到服务器,然后需要伪造请求体;
  为了实现有道词典的在线翻译脚本,在Chrome中打开开发工具,在Network下找到方法为POST的请求。观察数据,可以发现请求体中的'i'是需要翻译的URL编码内容。因此,可以伪造请求体,例如:
  import urllib.request
import urllib.parse
import json
while True:
content = input(&#39;请输入要翻译的内容:&#39;)
if content == &#39;exit!&#39;:
break
url=&#39;http://fanyi.youdao.com/transl ... 39%3B
# 请求主体
data = {}
data[&#39;type&#39;] = "AUTO"
data[&#39;i&#39;] = content
data[&#39;doctype&#39;] = "json"
data[&#39;xmlVersion&#39;] = "1.8"
data[&#39;keyfrom&#39;] = "fanyi.web"
data[&#39;ue&#39;] = "UTF-8"
data[&#39;action&#39;] = "FY_BY_CLICKBUTTON"
data[&#39;typoResult&#39;] = "true"
data = urllib.parse.urlencode(data).encode(&#39;utf-8&#39;)
head = {}
head[&#39;User-Agent&#39;] = &#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.0&#39;
req = urllib.request.Request(url,data,head) # 伪造请求头和请求主体
response = urllib.request.urlopen(req)
html = response.read().decode(&#39;utf-8&#39;)
target = json.loads(html)
print(&#39;翻译结果: &#39;,(target[&#39;translateResult&#39;][0][0][&#39;tgt&#39;]))
  也可以使用add_header()方法来伪造请求头,比如:
  import urllib.request
import urllib.parse
import json
while True:
content = input(&#39;请输入要翻译的内容(exit!):&#39;)
if content == &#39;exit!&#39;:
break
url = &#39;http://fanyi.youdao.com/transl ... 39%3B
# 请求主体
data = {}
data[&#39;type&#39;] = "AUTO"
data[&#39;i&#39;] = content
data[&#39;doctype&#39;] = "json"
data[&#39;xmlVersion&#39;] = "1.8"
data[&#39;keyfrom&#39;] = "fanyi.web"
data[&#39;ue&#39;] = "UTF-8"
data[&#39;action&#39;] = "FY_BY_CLICKBUTTON"
data[&#39;typoResult&#39;] = "true"
data = urllib.parse.urlencode(data).encode(&#39;utf-8&#39;)
req = urllib.request.Request(url,data)
req.add_header(&#39;User-Agent&#39;,&#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.0&#39;)
response = urllib.request.urlopen(req)
html=response.read().decode(&#39;utf-8&#39;)
target = json.loads(html)
print(&#39;翻译结果: &#39;,(target[&#39;translateResult&#39;][0][0][&#39;tgt&#39;]))
  4.使用代理IP
  为了避免采集爬虫过于频繁导致的IP阻塞问题,可以使用代理IP,如:
  # 参数是一个字典{&#39;类型&#39;:&#39;代理ip:端口号&#39;}
proxy_support = urllib.request.ProxyHandler({&#39;type&#39;: &#39;ip:port&#39;})
# 定制一个opener
opener = urllib.request.build_opener(proxy_support)
# 安装opener
urllib.request.install_opener(opener)
#调用opener
opener.open(url)
  注意:使用爬虫过于频繁地访问目标站点会占用大量服务器资源。大型分布式爬虫可以爬取某个站点甚至对该站点发起DDOS攻击;因此,应该合理使用爬虫来抓取数据 安排抓取频率和时间;如:在服务器相对空闲的时间(如:清晨)爬取,完成一个爬取任务后暂停一段时间等;
  5.检查网页的编码方式
  虽然大部分网页都采用UTF-8编码,但有时您会遇到使用其他编码方式的网页,因此您必须了解网页的编码方式才能正确解码抓取到的页面;
  chardet是python的第三方模块,使用chardet可以自动检测网页的编码;
  安装chardet:pip install charest
  使用:
  import chardet
url = &#39;http://www,baidu.com&#39;
html = urllib.request.urlopen(url).read()
>>> chardet.detect(html)
{&#39;confidence&#39;: 0.99, &#39;encoding&#39;: &#39;utf-8&#39;}
  6.获取跳转链接
  有时网页的某个页面需要在原创URL的基础上进行一次甚至多次重定向才能最终到达目的页面,因此需要正确处理重定向;
  通过requests模块的head()函数获取跳转链接的URL,如
  url=&#39;https://unsplash.com/photos/B1 ... 39%3B
res = requests.head(url)
re=res.headers[&#39;Location&#39;]

python网页数据抓取(Python之旅功能的实现与优势编程技巧)

网站优化优采云 发表了文章 • 0 个评论 • 135 次浏览 • 2021-09-14 11:17 • 来自相关话题

  python网页数据抓取(Python之旅功能的实现与优势编程技巧)
  注:网站已改,但无后续,代码需自行调整。
  本文首发于Trial Research,内容略有不同。
  引用:
  我曾经听过一位理科学生谈论他同事的轶事。这位同事会写一个小程序,解决需要5秒以上,不需要动脑的事情。不用说,即使在讨论项目的工作组中,工作电子邮件也会自动处理。检测到有人在说话,内容与你的工作有关,或者有人@了自己等,连接句库自动回复。
  我听了很羡慕。如果我们司法人员也能有一些编程技巧,那会节省很多时间。例如,您可以通过将填写办案系统和提取证据等事情交给计算机来节省时间并减少错误。也节省了分析证据和法律关系的时间。
  怀着对程序员的羡慕,再加上各种巧合,我开始了自己的Python之旅。现在我对编程的好处有了一点体会。例如,我们在工作中要查询很多法律文件和文件。如果只有一两份,我们可以直接在网页上下载,但是如果有很多份要操作,会很不方便。爬虫功能可以很方便的为我们实现这个需求,还可以顺便删除各种广告和不相关的内容。
  下面简单介绍一下爬虫功能的实现,以法律专业人士会接触到的裁判文书网为例。
  身体:
  一、准备工作
  开始之前,先简单介绍一下 Python 和一些基本问题。
  Python 是一种语法简单、模块众多的计算机语言。它可以轻松实现许多功能;您无需担心如何实现它。只需找到合适的模块并告诉它去做。它非常适合非程序员。开始吧。比如从网上抓取数据,如果你用另一种语言写一个程序,需要很多行,但如果你用Python,几行就可以解决问题。
  选择Python后,语言版本和模块有两个问题。在语言版本方面,主要有2.7和3两种。2.7的优点是历史悠久,可以使用的模块很多; 3的优点是是未来的发展方向,我们能用的大部分模块都已经支持3了,3支持中文好多了。因此,我个人建议直接使用3。当然,这些对我们外行来说都不是很重要。两者几乎相同。只需使用它们。不要卷入程序员之间的口水战。
  除此之外是模块问题。模块就像我们日常工作中的笔、墨、纸、砚等工具。它节省了我们自己“制作工具”的时间。这里推荐使用Anaconda。它就像普通的软件。你只需要在谷歌官网下载安装它,你的电脑就可以用Python编程了。我们可以使用的模块已经打包安装在一起,节省了我们寻找模块、安装模块以及处理模块之间兼容性的时间。可以说是一个工具。
  总结一下,准备就是一句话,搜索Anaconda,下载,安装,DONE!
  二、上手攀虫
  互联网就是网络,在互联网上搜索我们的程序就是爬虫。
  我们要做的判断文档网络比一般的网站要复杂一点,不能直接通过URL爬取。因此,我们首先了解两个问题。一是网上展示的文档内容发送到哪里,二是网站在将内容发送给我们之前必须满足什么条件。
  1. 追踪网页
  
  直接搜索“执行”这个词。这是我们在浏览器上可以看到的网址,但是不能直接抓取内容,所以需要使用软件网页进行跟踪。这个软件不需要安装,不管是IE还是Chrome,按F12都会弹出这个软件。我们以chrome为例。
  
  按F12后,右侧弹出软件界面。选择上面网络的主要项并刷新网页。浏览器和网站之间的所有交互内容都出现在下面的名称项中,我们想要的内容隐藏在里面。在此页面中,内容隐藏在带圆圈的 Listcontent 项下。
  我们选择Listcontent,从右边的header细节可以看出请求方法是POST,后面是真实的内容请求地址,后面是Request URL。
  接下来,我们来解决第二个问题。我们需要发送什么内容才能让这个 URL 返回我们需要的信息?同样在这个界面,我们继续向下滚动,可以看到Form Data的内容(如下图)。
  
  我们可以看到信息内容为:搜索条件“全文搜索:执行”,Index:1(第一页),Page:5(每页出现5个文档,最大值为20,我们可以程序中直接设置为20), order: 法院级别(按法院级别排序),最后一个参数是解码的,直接复制即可。也就是说,我们必须发送到网页的搜索需求是:全文收录“执行”这个词,如果有符合条件的人以这种格式向网页发送内容,就可以得到我们想要的信息。
  2.code
  在您知道消息的格式和发送位置之后,就可以编写代码了。接下来我们在刚才提到的Anaconda软件下打开Spyder。两者的关系就好比Anaconda是win系统,spyder是记事本。 Spyder 是负责编写代码的工具。
  
  出现如下界面。
  
  在左侧,我们可以开始编写自己的代码。在进入具体代码之前,给初学者多说一句。
  现在让我们开始供应主菜。以下代码的作用是在全文中搜索收录“execute”字样的案例,并提取时间、案例编号、案例名称放入excel表格中。
  #到"""之前这一段是打开spyder的界面就会自动添加的内容,一般不用去动。
#这一句是告诉电脑解码方式是UTF-8码,我们可以简单地理解为可以在代码里加中文,建议每次编程都加上。
# -*- coding: utf-8 -*-
#用(""" """)包起来的这一部分电脑也是忽略掉的,主要是给人看的部分,分别是代码首次编写时间和作者,属于可写可不写的部分。
"""
Created on Sun Jul 24 23:11:55 2016
@author: 检
"""
#这里是导入模块,以下模块分别用于抓取网页、数据处理保存、时间、正则表达式
import requests as req
import pandas as pd
import time
import re
#这是刚才我们通过F12查找到的网页
url=&#39;http://wenshu.court.gov.cn/Lis ... 39%3B
#这是页数、程序休息时间的定义和三个空的列表用来装筛选后的数据。
Index=1
SleepNum = 3
dates=[]
titles=[]
nums=[]
#循环模块,因为有很多页,当小于这个数时,不断地传数据,相当于点下一页的功能。最后一句的意思是每执行一次,index加1,就是翻到下一页。具体页数也可以用变量实现。
while Index < 123:
#这是请求头,伪装成浏览器访问网站,以免被网站屏蔽
my_headers={&#39;User-Agent&#39;:&#39;User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.95 Safari/537.36 Core/1.50.1280.400&#39;,}
#这一行就是我们搞定的搜索条件,可以按自己要求设置,比如:“法院名称:北京市人 民法院,案件类型:执行案件,裁判日期:2016-01-01 TO 2016-10-08”。
#如果实在不会设置,可以在文书网上搜索好,再通过F12查看到的内容复制粘贴到代码中&#39;Param&#39;:后即可。
data={&#39;Param&#39;:&#39;全文检索:执行&#39;, &#39;Index&#39;: Index,&#39;Page&#39;:&#39;20&#39;,&#39;Order&#39;:&#39;裁判日期&#39;,&#39;Direction&#39;:&#39;asc&#39;}
#将网址、请求头、搜索条件等数据上传并取得内容
r=req.post(url, headers=my_headers, data = data)
#用 json解码取得的网页内容
raw=r.json()
#用正则表达式将我们需要的内容提取出来,正则表达式真的很有用,要想真正用好westlaw等数据库,这一关也得过
#大意是定义筛选标准,把(“裁判日期”:)后,(&#39;)前的内容截取出来。
pattern1 = re.compile(&#39;"裁判日期":"(.*?)"&#39;, re.S)
date = re.findall(pattern1,raw)
pattern2 = re.compile(&#39;"案号":"(.*?)"&#39;, re.S)
num = re.findall(pattern2,raw)
pattern3 = re.compile(&#39;"案件名称":"(.*?)"&#39;, re.S)
title = re.findall(pattern3,raw)
#把筛选出的数据添加到开始的三个空列表里
dates+=date
titles+=title
nums+=num
#这一行是让程序休息,做事留点余地比较好。通过网页编码可知,文书网是有验证码功能的,如果你抓的太狠中招莫怪。
time.sleep(SleepNum)
Index += 1
#这里我们可以看到,从while开始到此,所有的代码都缩进了四个空格。这是因为要告诉电脑,这一段代码构成一个相对独立的组,当index小于123时,不断地从这个组第一句代码执行到最后一句代码,而不涉及到本文涉及的其他代码。
#这里代码又是顶格写。
#用pandas模块将筛选出的内容转成dataframe格式,并保存到Excel。
df=pd.DataFrame({&#39;时间&#39;:dates,&#39;案号&#39;:nums, &#39;案件名称&#39;:titles})
df.to_excel(&#39;C:\\result.xlsx&#39;)
  好了,工作结束,保存,点击软件界面上的绿色小三角或按F5运行,过一会,我们会发现C盘静静的躺着一个名为result的excel表,里面存储着我们想要的信息。以后我们不用打开编程软件Spyder,把代码保存在桌面,双击,它会根据设置的搜索条件自动找到相关的文档号,保存为excel,不用了登录响应。文档网络慢是不是很方便?
  如果只想要结果,直接粘贴到Spyder左边的框中,直接运行即可。 (但是如果你看完这篇文章想进一步了解编程,个人强烈不推荐这个。因为你自己没有输入很多细节,你不会注意到。比如刚才提到的while语句,按回车行前有个“:”,看代码很容易忽略。当然Spyder编程软件很聪明,会为我们完成,但是我们不能靠机器,对吧。 )
  其他补充:
  首先,编程的好处很多。可以提高我们的工作效率(就像上面的代码,运行2、3分钟,可以下载上千份法律文件);而且因为编程就像教一个什么都不知道怎么做事的孩子,有一个前提,没有明确的解释是做不到的,所以很合乎逻辑,可以反馈合法的工作。例如,在分析法律关系时,编程的思维方式可以帮助我们意识到我们忽略的隐含前提。
  其次,编程并不难。通过这种级别的编程,您不必考虑机器如何理解我在写的内容。这种问题更像是游戏的高级设置选项。大部分代码直接是英文单词,可以看成是写一篇英文论文。 我们的难处主要在于不舒服,这绝不是不可理解的。这个问题可以通过多输入几次代码来解决。
  最后,如果这个文章有幸引起你学习Python的兴趣,可以去这个网站学习基础知识,通俗易懂,而且每节都附有小练习,非常适合初学者(课后一定要练习,写出来就对了) 查看全部

  python网页数据抓取(Python之旅功能的实现与优势编程技巧)
  注:网站已改,但无后续,代码需自行调整。
  本文首发于Trial Research,内容略有不同。
  引用:
  我曾经听过一位理科学生谈论他同事的轶事。这位同事会写一个小程序,解决需要5秒以上,不需要动脑的事情。不用说,即使在讨论项目的工作组中,工作电子邮件也会自动处理。检测到有人在说话,内容与你的工作有关,或者有人@了自己等,连接句库自动回复。
  我听了很羡慕。如果我们司法人员也能有一些编程技巧,那会节省很多时间。例如,您可以通过将填写办案系统和提取证据等事情交给计算机来节省时间并减少错误。也节省了分析证据和法律关系的时间。
  怀着对程序员的羡慕,再加上各种巧合,我开始了自己的Python之旅。现在我对编程的好处有了一点体会。例如,我们在工作中要查询很多法律文件和文件。如果只有一两份,我们可以直接在网页上下载,但是如果有很多份要操作,会很不方便。爬虫功能可以很方便的为我们实现这个需求,还可以顺便删除各种广告和不相关的内容。
  下面简单介绍一下爬虫功能的实现,以法律专业人士会接触到的裁判文书网为例。
  身体:
  一、准备工作
  开始之前,先简单介绍一下 Python 和一些基本问题。
  Python 是一种语法简单、模块众多的计算机语言。它可以轻松实现许多功能;您无需担心如何实现它。只需找到合适的模块并告诉它去做。它非常适合非程序员。开始吧。比如从网上抓取数据,如果你用另一种语言写一个程序,需要很多行,但如果你用Python,几行就可以解决问题。
  选择Python后,语言版本和模块有两个问题。在语言版本方面,主要有2.7和3两种。2.7的优点是历史悠久,可以使用的模块很多; 3的优点是是未来的发展方向,我们能用的大部分模块都已经支持3了,3支持中文好多了。因此,我个人建议直接使用3。当然,这些对我们外行来说都不是很重要。两者几乎相同。只需使用它们。不要卷入程序员之间的口水战。
  除此之外是模块问题。模块就像我们日常工作中的笔、墨、纸、砚等工具。它节省了我们自己“制作工具”的时间。这里推荐使用Anaconda。它就像普通的软件。你只需要在谷歌官网下载安装它,你的电脑就可以用Python编程了。我们可以使用的模块已经打包安装在一起,节省了我们寻找模块、安装模块以及处理模块之间兼容性的时间。可以说是一个工具。
  总结一下,准备就是一句话,搜索Anaconda,下载,安装,DONE!
  二、上手攀虫
  互联网就是网络,在互联网上搜索我们的程序就是爬虫。
  我们要做的判断文档网络比一般的网站要复杂一点,不能直接通过URL爬取。因此,我们首先了解两个问题。一是网上展示的文档内容发送到哪里,二是网站在将内容发送给我们之前必须满足什么条件。
  1. 追踪网页
  
  直接搜索“执行”这个词。这是我们在浏览器上可以看到的网址,但是不能直接抓取内容,所以需要使用软件网页进行跟踪。这个软件不需要安装,不管是IE还是Chrome,按F12都会弹出这个软件。我们以chrome为例。
  
  按F12后,右侧弹出软件界面。选择上面网络的主要项并刷新网页。浏览器和网站之间的所有交互内容都出现在下面的名称项中,我们想要的内容隐藏在里面。在此页面中,内容隐藏在带圆圈的 Listcontent 项下。
  我们选择Listcontent,从右边的header细节可以看出请求方法是POST,后面是真实的内容请求地址,后面是Request URL。
  接下来,我们来解决第二个问题。我们需要发送什么内容才能让这个 URL 返回我们需要的信息?同样在这个界面,我们继续向下滚动,可以看到Form Data的内容(如下图)。
  
  我们可以看到信息内容为:搜索条件“全文搜索:执行”,Index:1(第一页),Page:5(每页出现5个文档,最大值为20,我们可以程序中直接设置为20), order: 法院级别(按法院级别排序),最后一个参数是解码的,直接复制即可。也就是说,我们必须发送到网页的搜索需求是:全文收录“执行”这个词,如果有符合条件的人以这种格式向网页发送内容,就可以得到我们想要的信息。
  2.code
  在您知道消息的格式和发送位置之后,就可以编写代码了。接下来我们在刚才提到的Anaconda软件下打开Spyder。两者的关系就好比Anaconda是win系统,spyder是记事本。 Spyder 是负责编写代码的工具。
  
  出现如下界面。
  
  在左侧,我们可以开始编写自己的代码。在进入具体代码之前,给初学者多说一句。
  现在让我们开始供应主菜。以下代码的作用是在全文中搜索收录“execute”字样的案例,并提取时间、案例编号、案例名称放入excel表格中。
  #到"""之前这一段是打开spyder的界面就会自动添加的内容,一般不用去动。
#这一句是告诉电脑解码方式是UTF-8码,我们可以简单地理解为可以在代码里加中文,建议每次编程都加上。
# -*- coding: utf-8 -*-
#用(""" """)包起来的这一部分电脑也是忽略掉的,主要是给人看的部分,分别是代码首次编写时间和作者,属于可写可不写的部分。
"""
Created on Sun Jul 24 23:11:55 2016
@author: 检
"""
#这里是导入模块,以下模块分别用于抓取网页、数据处理保存、时间、正则表达式
import requests as req
import pandas as pd
import time
import re
#这是刚才我们通过F12查找到的网页
url=&#39;http://wenshu.court.gov.cn/Lis ... 39%3B
#这是页数、程序休息时间的定义和三个空的列表用来装筛选后的数据。
Index=1
SleepNum = 3
dates=[]
titles=[]
nums=[]
#循环模块,因为有很多页,当小于这个数时,不断地传数据,相当于点下一页的功能。最后一句的意思是每执行一次,index加1,就是翻到下一页。具体页数也可以用变量实现。
while Index < 123:
#这是请求头,伪装成浏览器访问网站,以免被网站屏蔽
my_headers={&#39;User-Agent&#39;:&#39;User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.95 Safari/537.36 Core/1.50.1280.400&#39;,}
#这一行就是我们搞定的搜索条件,可以按自己要求设置,比如:“法院名称:北京市人 民法院,案件类型:执行案件,裁判日期:2016-01-01 TO 2016-10-08”。
#如果实在不会设置,可以在文书网上搜索好,再通过F12查看到的内容复制粘贴到代码中&#39;Param&#39;:后即可。
data={&#39;Param&#39;:&#39;全文检索:执行&#39;, &#39;Index&#39;: Index,&#39;Page&#39;:&#39;20&#39;,&#39;Order&#39;:&#39;裁判日期&#39;,&#39;Direction&#39;:&#39;asc&#39;}
#将网址、请求头、搜索条件等数据上传并取得内容
r=req.post(url, headers=my_headers, data = data)
#用 json解码取得的网页内容
raw=r.json()
#用正则表达式将我们需要的内容提取出来,正则表达式真的很有用,要想真正用好westlaw等数据库,这一关也得过
#大意是定义筛选标准,把(“裁判日期”:)后,(&#39;)前的内容截取出来。
pattern1 = re.compile(&#39;"裁判日期":"(.*?)"&#39;, re.S)
date = re.findall(pattern1,raw)
pattern2 = re.compile(&#39;"案号":"(.*?)"&#39;, re.S)
num = re.findall(pattern2,raw)
pattern3 = re.compile(&#39;"案件名称":"(.*?)"&#39;, re.S)
title = re.findall(pattern3,raw)
#把筛选出的数据添加到开始的三个空列表里
dates+=date
titles+=title
nums+=num
#这一行是让程序休息,做事留点余地比较好。通过网页编码可知,文书网是有验证码功能的,如果你抓的太狠中招莫怪。
time.sleep(SleepNum)
Index += 1
#这里我们可以看到,从while开始到此,所有的代码都缩进了四个空格。这是因为要告诉电脑,这一段代码构成一个相对独立的组,当index小于123时,不断地从这个组第一句代码执行到最后一句代码,而不涉及到本文涉及的其他代码。
#这里代码又是顶格写。
#用pandas模块将筛选出的内容转成dataframe格式,并保存到Excel。
df=pd.DataFrame({&#39;时间&#39;:dates,&#39;案号&#39;:nums, &#39;案件名称&#39;:titles})
df.to_excel(&#39;C:\\result.xlsx&#39;)
  好了,工作结束,保存,点击软件界面上的绿色小三角或按F5运行,过一会,我们会发现C盘静静的躺着一个名为result的excel表,里面存储着我们想要的信息。以后我们不用打开编程软件Spyder,把代码保存在桌面,双击,它会根据设置的搜索条件自动找到相关的文档号,保存为excel,不用了登录响应。文档网络慢是不是很方便?
  如果只想要结果,直接粘贴到Spyder左边的框中,直接运行即可。 (但是如果你看完这篇文章想进一步了解编程,个人强烈不推荐这个。因为你自己没有输入很多细节,你不会注意到。比如刚才提到的while语句,按回车行前有个“:”,看代码很容易忽略。当然Spyder编程软件很聪明,会为我们完成,但是我们不能靠机器,对吧。 )
  其他补充:
  首先,编程的好处很多。可以提高我们的工作效率(就像上面的代码,运行2、3分钟,可以下载上千份法律文件);而且因为编程就像教一个什么都不知道怎么做事的孩子,有一个前提,没有明确的解释是做不到的,所以很合乎逻辑,可以反馈合法的工作。例如,在分析法律关系时,编程的思维方式可以帮助我们意识到我们忽略的隐含前提。
  其次,编程并不难。通过这种级别的编程,您不必考虑机器如何理解我在写的内容。这种问题更像是游戏的高级设置选项。大部分代码直接是英文单词,可以看成是写一篇英文论文。 我们的难处主要在于不舒服,这绝不是不可理解的。这个问题可以通过多输入几次代码来解决。
  最后,如果这个文章有幸引起你学习Python的兴趣,可以去这个网站学习基础知识,通俗易懂,而且每节都附有小练习,非常适合初学者(课后一定要练习,写出来就对了)

python网页数据抓取(爬取《斗破苍穹》全文小说网络链接:)

网站优化优采云 发表了文章 • 0 个评论 • 99 次浏览 • 2021-09-14 11:16 • 来自相关话题

  python网页数据抓取(爬取《斗破苍穹》全文小说网络链接:)
  在python爬取数据的过程中,当你使用上面介绍的三大库进行正则爬取时,有时不方便处理路径,可以使用简单的正则表达式来描述路径。抢。
  说到正则表达式,大家往往会觉得很复杂,因为正则表达式是一组特殊的符号,用来帮助开发者检查一个字符串是否与某个模式匹配。其实,当你弄清楚如何匹配字符时,还是很简单的,然后使用re模块完成数据获取。
  1、正则表达式基础
  (1)一般字符
  
  (2)预定义字符集
  
  (3)quantity word
  
  (4)边界匹配
  
  注意:最常用的匹配方式(.*?)表示匹配任意字符
  2、re 模块使用方法
  re 模块使 Python 拥有所有正则表达式功能。
  常用函数1:search()函数匹配提取第一个符合规律的内容,并返回一个正则表达式对象
  常用函数2:findall()函数匹配所有符合规律的内容并以列表的形式返回结果
  备注:一般在爬取数据的时候用的最多的是findall。
  重新模块修饰符
  
  3、案例实践
  案例名称:爬取《斗破苍穹》全文小说
  网络链接:/doupocangqiong/
  
  抓取想法:
  打开网页,了解网页的网址信息。打开第一、二章,链接如下
  /doupocangqiong/1.html
  /doupocangqiong/2.html
  /doupocangqiong/3.html
  明显的链接通过添加数字对每一章进行分页。
  爬取全文信息,找到对应位置如下
  
  数据存储在 TXT 文本中
  4、详细代码如下:
  导入请求
  重新导入
  导入时间
  标题={
  "User-Agent":请求头}
  f=open('doupo.txt','a+')
  def get_info(url):
  res=requests.get(url,headers=headers)
  如果 res.status_code==200:
  contents = re.findall('
  (.*?)
  ',res.content.decode('utf-8'),re.S)
  对于内容中的内容:
  f.write(content+'\n')
  打印(内容)
  其他:
  通过
  如果 __name__=='__main__':
  urls=['/doupocangqiong/{}.html'.format(i) for i in range(2,10)]
  对于网址中的网址:
  get_info(url)
  time.sleep(1)
  f.close()
  运行结果如下:
  
  好的,正则化的使用就是这么简单。当遇到路径困难时,不妨试试正则化来获取数据。非常高效方便! 查看全部

  python网页数据抓取(爬取《斗破苍穹》全文小说网络链接:)
  在python爬取数据的过程中,当你使用上面介绍的三大库进行正则爬取时,有时不方便处理路径,可以使用简单的正则表达式来描述路径。抢。
  说到正则表达式,大家往往会觉得很复杂,因为正则表达式是一组特殊的符号,用来帮助开发者检查一个字符串是否与某个模式匹配。其实,当你弄清楚如何匹配字符时,还是很简单的,然后使用re模块完成数据获取。
  1、正则表达式基础
  (1)一般字符
  
  (2)预定义字符集
  
  (3)quantity word
  
  (4)边界匹配
  
  注意:最常用的匹配方式(.*?)表示匹配任意字符
  2、re 模块使用方法
  re 模块使 Python 拥有所有正则表达式功能。
  常用函数1:search()函数匹配提取第一个符合规律的内容,并返回一个正则表达式对象
  常用函数2:findall()函数匹配所有符合规律的内容并以列表的形式返回结果
  备注:一般在爬取数据的时候用的最多的是findall。
  重新模块修饰符
  
  3、案例实践
  案例名称:爬取《斗破苍穹》全文小说
  网络链接:/doupocangqiong/
  
  抓取想法:
  打开网页,了解网页的网址信息。打开第一、二章,链接如下
  /doupocangqiong/1.html
  /doupocangqiong/2.html
  /doupocangqiong/3.html
  明显的链接通过添加数字对每一章进行分页。
  爬取全文信息,找到对应位置如下
  
  数据存储在 TXT 文本中
  4、详细代码如下:
  导入请求
  重新导入
  导入时间
  标题={
  "User-Agent":请求头}
  f=open('doupo.txt','a+')
  def get_info(url):
  res=requests.get(url,headers=headers)
  如果 res.status_code==200:
  contents = re.findall('
  (.*?)
  ',res.content.decode('utf-8'),re.S)
  对于内容中的内容:
  f.write(content+'\n')
  打印(内容)
  其他:
  通过
  如果 __name__=='__main__':
  urls=['/doupocangqiong/{}.html'.format(i) for i in range(2,10)]
  对于网址中的网址:
  get_info(url)
  time.sleep(1)
  f.close()
  运行结果如下:
  
  好的,正则化的使用就是这么简单。当遇到路径困难时,不妨试试正则化来获取数据。非常高效方便!

python网页数据抓取(Python之旅功能的实现与法律关系(上)首发)

网站优化优采云 发表了文章 • 0 个评论 • 100 次浏览 • 2021-09-14 11:14 • 来自相关话题

  python网页数据抓取(Python之旅功能的实现与法律关系(上)首发)
  本文首发于Trial Research,内容略有不同。
  引用:
  我曾经听过一位理科学生谈论他同事的轶事。这位同事会写一个小程序,解决需要5秒以上,不需要动脑的事情。不用说,即使在讨论项目的工作组中,工作电子邮件也会自动处理。检测到有人在说话,内容与你的工作有关,或者有人@了自己等,连接句库自动回复。
  我听了很羡慕。如果我们司法人员也能有一些编程技巧,那会节省很多时间。例如,您可以通过将填写办案系统和提取证据等事情交给计算机来节省时间并减少错误。也节省了分析证据和法律关系的时间。
  怀着对程序员的羡慕,再加上各种巧合,我开始了自己的Python之旅。现在我对编程的好处有了一点体会。例如,我们在工作中要查询很多法律文件和文件。如果只有一两份,我们可以直接在网页上下载,但是如果有很多份要操作,会很不方便。爬虫功能可以很方便的为我们实现这个需求,还可以顺便删除各种广告和不相关的内容。
  下面简单介绍一下爬虫功能的实现,以法律专业人士会接触到的裁判文书网为例。
  身体:
  一、准备工作
  开始之前,先简单介绍一下 Python 和一些基本问题。
  Python 是一种语法简单、模块众多的计算机语言。它可以轻松实现许多功能;您无需担心如何实现它。只需找到合适的模块并告诉它去做。它非常适合非程序员。开始吧。比如从网上抓取数据,如果你用另一种语言写一个程序,需要很多行,但如果你用Python,几行就可以解决问题。
  选择Python后,语言版本和模块有两个问题。在语言版本方面,主要有2.7和3两种。2.7的优点是历史悠久,可以使用的模块很多; 3的优点是是未来的发展方向,我们能用的大部分模块都已经支持3了,3支持中文好多了。因此,我个人建议直接使用3。当然,这些对我们外行来说都不是很重要。两者几乎相同。只需使用它们。不要卷入程序员之间的口水战。
  除此之外是模块问题。模块就像我们日常工作中的笔、墨、纸、砚等工具。它节省了我们自己“制作工具”的时间。这里推荐使用Anaconda。它就像普通的软件。你只需要在谷歌官网下载安装它,你的电脑就可以用Python编程了。我们可以使用的模块已经打包安装在一起,节省了我们寻找模块、安装模块以及处理模块之间兼容性的时间。可以说是一个工具。
  总结一下,准备就是一句话,搜索Anaconda,下载,安装,DONE!
  二、上手攀虫
  互联网就是网络,在互联网上搜索我们的程序就是爬虫。
  我们要做的判断文档网络比一般的网站要复杂一点,不能直接通过URL爬取。因此,我们首先了解两个问题。一是网上展示的文档内容发送到哪里,二是网站在将内容发送给我们之前必须满足什么条件。
  1. 追踪网页
  
  直接搜索“执行”这个词。这是我们在浏览器上可以看到的网址,但是不能直接抓取内容,所以需要使用软件网页进行跟踪。这个软件不需要安装,不管是IE还是Chrome,按F12都会弹出这个软件。我们以chrome为例。
  
  按F12后,右侧弹出软件界面。选择上面网络的主要项并刷新网页。浏览器和网站之间的所有交互内容都出现在下面的名称项中,我们想要的内容隐藏在里面。在此页面中,内容隐藏在带圆圈的 Listcontent 项下。
  我们选择Listcontent,从右边的header细节可以看出请求方法是POST,后面是真实的内容请求地址,后面是Request URL。
  接下来,我们来解决第二个问题。我们需要发送什么内容才能让这个 URL 返回我们需要的信息?同样在这个界面,我们继续向下滚动,可以看到Form Data的内容(如下图)。
  
  我们可以看到信息内容为:搜索条件“全文搜索:执行”,Index:1(第一页),Page:5(每页出现5个文档,最大值为20,我们可以程序中直接设置为20), order: 法院级别(按法院级别排序),最后一个参数是解码的,直接复制即可。也就是说,我们必须发送到网页的搜索需求是:全文收录“执行”这个词,如果有符合条件的人以这种格式向网页发送内容,就可以得到我们想要的信息。
  2.code
  在您知道消息的格式和发送位置之后,就可以编写代码了。接下来我们在刚才提到的Anaconda软件下打开Spyder。两者的关系就好比Anaconda是win系统,spyder是记事本。 Spyder 是负责编写代码的工具。
  
  出现如下界面。
  
  在左侧,我们可以开始编写自己的代码。在进入具体代码之前,给初学者多说一句。
  现在让我们开始供应主菜。以下代码的作用是在全文中搜索收录“execute”字样的案例,并提取时间、案例编号、案例名称放入excel表格中。
  #"""前的段落是打开spyder界面时会自动添加的内容,一般不需要移动。
  #这句话告诉计算机解码方式是UTF-8编码,我们可以简单的理解为可以在编码中添加中文,建议每次编程时都添加。
  #到"""之前这一段是打开spyder的界面就会自动添加的内容,一般不用去动。
#这一句是告诉电脑解码方式是UTF-8码,我们可以简单地理解为可以在代码里加中文,建议每次编程都加上。
# -*- coding: utf-8 -*-
#用(""" """)包起来的这一部分电脑也是忽略掉的,主要是给人看的部分,分别是代码首次编写时间和作者,属于可写可不写的部分。
"""
Created on Sun Jul 24 23:11:55 2016
@author: 检
"""
#这里是导入模块,以下模块分别用于抓取网页、数据处理保存、时间、正则表达式
import requests as req
import pandas as pd
import time
import re
#这是刚才我们通过F12查找到的网页
url=&#39;http://wenshu.court.gov.cn/Lis ... 39%3B
#这是页数、程序休息时间的定义和三个空的列表用来装筛选后的数据。
Index=1
SleepNum = 3
dates=[]
titles=[]
nums=[]
#循环模块,因为有很多页,当小于这个数时,不断地传数据,相当于点下一页的功能。最后一句的意思是每执行一次,index加1,就是翻到下一页。具体页数也可以用变量实现。
while Index < 123:
#这是请求头,伪装成浏览器访问网站,以免被网站屏蔽
my_headers={&#39;User-Agent&#39;:&#39;User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.95 Safari/537.36 Core/1.50.1280.400&#39;,}
#这一行就是我们搞定的搜索条件,可以按自己要求设置,比如:“法院名称:北京市人 民法院,案件类型:执行案件,裁判日期:2016-01-01 TO 2016-10-08”。
#如果实在不会设置,可以在文书网上搜索好,再通过F12查看到的内容复制粘贴到代码中加红的区域即可。
data={&#39;Param&#39;:&#39;全文检索:执行&#39;, &#39;Index&#39;: Index,&#39;Page&#39;:&#39;20&#39;,&#39;Order&#39;:&#39;裁判日期&#39;,&#39;Direction&#39;:&#39;asc&#39;}
#将网址、请求头、搜索条件等数据上传并取得内容
r=req.post(url, headers=my_headers, data = data)
#用 json解码取得的网页内容
raw=r.json()
#用正则表达式将我们需要的内容提取出来,正则表达式真的很有用,要想真正用好westlaw等数据库,这一关也得过
#大意是定义筛选标准,把(“裁判日期”:)后,(&#39;)前的内容截取出来。
pattern1 = re.compile(&#39;"裁判日期":"(.*?)"&#39;, re.S)
date = re.findall(pattern1,raw)
pattern2 = re.compile(&#39;"案号":"(.*?)"&#39;, re.S)
num = re.findall(pattern2,raw)
pattern3 = re.compile(&#39;"案件名称":"(.*?)"&#39;, re.S)
title = re.findall(pattern3,raw)
#把筛选出的数据添加到开始的三个空列表里
dates+=date
titles+=title
nums+=num
#这一行是让程序休息,做事留点余地比较好。通过网页编码可知,文书网是有验证码功能的,如果你抓的太狠中招莫怪。
time.sleep(SleepNum)
Index += 1
#这里我们可以看到,从while开始到此,所有的代码都缩进了四个空格。这是因为要告诉电脑,这一段代码构成一个相对独立的组,当index小于123时,不断地从这个组第一句代码执行到最后一句代码,而不涉及到本文涉及的其他代码。
#这里代码又是顶格写。
#用pandas模块将筛选出的内容转成dataframe格式,并保存到Excel。
df=pd.DataFrame({&#39;时间&#39;:dates,&#39;案号&#39;:nums, &#39;案件名称&#39;:titles})
df.to_excel(&#39;C:\\result.xlsx&#39;)
  好了,工作结束,保存,点击软件界面上的绿色小三角或按F5运行,过一会,我们会发现C盘静静的躺着一个名为result的excel表,里面存储着我们想要的信息。以后我们不用打开编程软件Spyder,把代码保存在桌面,双击,它会根据设置的搜索条件自动找到相关的文档号,保存为excel,不用了登录响应。文档网络慢是不是很方便?
  如果只想要结果,直接粘贴到Spyder左边的框中,直接运行即可。 (但是如果你看完这篇文章想进一步了解编程,个人强烈不推荐这个。因为你自己没有输入很多细节,你不会注意到。比如刚才提到的while语句,按回车行前有个“:”,看代码很容易忽略。当然Spyder编程软件很聪明,会为我们完成,但是我们不能靠机器,对吧。 )
  其他补充:
  首先,编程的好处很多。可以提高我们的工作效率(就像上面的代码,运行2、3分钟,可以下载上千份法律文件);而且因为编程就像教一个什么都不知道怎么做事的孩子,有一个前提,没有明确的解释是做不到的,所以很合乎逻辑,可以反馈合法的工作。例如,在分析法律关系时,编程的思维方式可以帮助我们意识到我们忽略的隐含前提。
  其次,编程并不难。通过这种级别的编程,您不必考虑机器如何理解我在写的内容。这种问题更像是游戏的高级设置选项。大部分代码直接是英文单词,可以看成是写一篇英文论文。 我们的难处主要在于不舒服,这绝不是不可理解的。这个问题可以通过多输入几次代码来解决。
  最后,如果这个文章有幸引起你学习Python的兴趣,可以去这个网站学习基础知识,通俗易懂,而且每节都附有小练习,非常适合初学者(课后一定要练习,写出来就对了) 查看全部

  python网页数据抓取(Python之旅功能的实现与法律关系(上)首发)
  本文首发于Trial Research,内容略有不同。
  引用:
  我曾经听过一位理科学生谈论他同事的轶事。这位同事会写一个小程序,解决需要5秒以上,不需要动脑的事情。不用说,即使在讨论项目的工作组中,工作电子邮件也会自动处理。检测到有人在说话,内容与你的工作有关,或者有人@了自己等,连接句库自动回复。
  我听了很羡慕。如果我们司法人员也能有一些编程技巧,那会节省很多时间。例如,您可以通过将填写办案系统和提取证据等事情交给计算机来节省时间并减少错误。也节省了分析证据和法律关系的时间。
  怀着对程序员的羡慕,再加上各种巧合,我开始了自己的Python之旅。现在我对编程的好处有了一点体会。例如,我们在工作中要查询很多法律文件和文件。如果只有一两份,我们可以直接在网页上下载,但是如果有很多份要操作,会很不方便。爬虫功能可以很方便的为我们实现这个需求,还可以顺便删除各种广告和不相关的内容。
  下面简单介绍一下爬虫功能的实现,以法律专业人士会接触到的裁判文书网为例。
  身体:
  一、准备工作
  开始之前,先简单介绍一下 Python 和一些基本问题。
  Python 是一种语法简单、模块众多的计算机语言。它可以轻松实现许多功能;您无需担心如何实现它。只需找到合适的模块并告诉它去做。它非常适合非程序员。开始吧。比如从网上抓取数据,如果你用另一种语言写一个程序,需要很多行,但如果你用Python,几行就可以解决问题。
  选择Python后,语言版本和模块有两个问题。在语言版本方面,主要有2.7和3两种。2.7的优点是历史悠久,可以使用的模块很多; 3的优点是是未来的发展方向,我们能用的大部分模块都已经支持3了,3支持中文好多了。因此,我个人建议直接使用3。当然,这些对我们外行来说都不是很重要。两者几乎相同。只需使用它们。不要卷入程序员之间的口水战。
  除此之外是模块问题。模块就像我们日常工作中的笔、墨、纸、砚等工具。它节省了我们自己“制作工具”的时间。这里推荐使用Anaconda。它就像普通的软件。你只需要在谷歌官网下载安装它,你的电脑就可以用Python编程了。我们可以使用的模块已经打包安装在一起,节省了我们寻找模块、安装模块以及处理模块之间兼容性的时间。可以说是一个工具。
  总结一下,准备就是一句话,搜索Anaconda,下载,安装,DONE!
  二、上手攀虫
  互联网就是网络,在互联网上搜索我们的程序就是爬虫。
  我们要做的判断文档网络比一般的网站要复杂一点,不能直接通过URL爬取。因此,我们首先了解两个问题。一是网上展示的文档内容发送到哪里,二是网站在将内容发送给我们之前必须满足什么条件。
  1. 追踪网页
  
  直接搜索“执行”这个词。这是我们在浏览器上可以看到的网址,但是不能直接抓取内容,所以需要使用软件网页进行跟踪。这个软件不需要安装,不管是IE还是Chrome,按F12都会弹出这个软件。我们以chrome为例。
  
  按F12后,右侧弹出软件界面。选择上面网络的主要项并刷新网页。浏览器和网站之间的所有交互内容都出现在下面的名称项中,我们想要的内容隐藏在里面。在此页面中,内容隐藏在带圆圈的 Listcontent 项下。
  我们选择Listcontent,从右边的header细节可以看出请求方法是POST,后面是真实的内容请求地址,后面是Request URL。
  接下来,我们来解决第二个问题。我们需要发送什么内容才能让这个 URL 返回我们需要的信息?同样在这个界面,我们继续向下滚动,可以看到Form Data的内容(如下图)。
  
  我们可以看到信息内容为:搜索条件“全文搜索:执行”,Index:1(第一页),Page:5(每页出现5个文档,最大值为20,我们可以程序中直接设置为20), order: 法院级别(按法院级别排序),最后一个参数是解码的,直接复制即可。也就是说,我们必须发送到网页的搜索需求是:全文收录“执行”这个词,如果有符合条件的人以这种格式向网页发送内容,就可以得到我们想要的信息。
  2.code
  在您知道消息的格式和发送位置之后,就可以编写代码了。接下来我们在刚才提到的Anaconda软件下打开Spyder。两者的关系就好比Anaconda是win系统,spyder是记事本。 Spyder 是负责编写代码的工具。
  
  出现如下界面。
  
  在左侧,我们可以开始编写自己的代码。在进入具体代码之前,给初学者多说一句。
  现在让我们开始供应主菜。以下代码的作用是在全文中搜索收录“execute”字样的案例,并提取时间、案例编号、案例名称放入excel表格中。
  #"""前的段落是打开spyder界面时会自动添加的内容,一般不需要移动。
  #这句话告诉计算机解码方式是UTF-8编码,我们可以简单的理解为可以在编码中添加中文,建议每次编程时都添加。
  #到"""之前这一段是打开spyder的界面就会自动添加的内容,一般不用去动。
#这一句是告诉电脑解码方式是UTF-8码,我们可以简单地理解为可以在代码里加中文,建议每次编程都加上。
# -*- coding: utf-8 -*-
#用(""" """)包起来的这一部分电脑也是忽略掉的,主要是给人看的部分,分别是代码首次编写时间和作者,属于可写可不写的部分。
"""
Created on Sun Jul 24 23:11:55 2016
@author: 检
"""
#这里是导入模块,以下模块分别用于抓取网页、数据处理保存、时间、正则表达式
import requests as req
import pandas as pd
import time
import re
#这是刚才我们通过F12查找到的网页
url=&#39;http://wenshu.court.gov.cn/Lis ... 39%3B
#这是页数、程序休息时间的定义和三个空的列表用来装筛选后的数据。
Index=1
SleepNum = 3
dates=[]
titles=[]
nums=[]
#循环模块,因为有很多页,当小于这个数时,不断地传数据,相当于点下一页的功能。最后一句的意思是每执行一次,index加1,就是翻到下一页。具体页数也可以用变量实现。
while Index < 123:
#这是请求头,伪装成浏览器访问网站,以免被网站屏蔽
my_headers={&#39;User-Agent&#39;:&#39;User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.95 Safari/537.36 Core/1.50.1280.400&#39;,}
#这一行就是我们搞定的搜索条件,可以按自己要求设置,比如:“法院名称:北京市人 民法院,案件类型:执行案件,裁判日期:2016-01-01 TO 2016-10-08”。
#如果实在不会设置,可以在文书网上搜索好,再通过F12查看到的内容复制粘贴到代码中加红的区域即可。
data={&#39;Param&#39;:&#39;全文检索:执行&#39;, &#39;Index&#39;: Index,&#39;Page&#39;:&#39;20&#39;,&#39;Order&#39;:&#39;裁判日期&#39;,&#39;Direction&#39;:&#39;asc&#39;}
#将网址、请求头、搜索条件等数据上传并取得内容
r=req.post(url, headers=my_headers, data = data)
#用 json解码取得的网页内容
raw=r.json()
#用正则表达式将我们需要的内容提取出来,正则表达式真的很有用,要想真正用好westlaw等数据库,这一关也得过
#大意是定义筛选标准,把(“裁判日期”:)后,(&#39;)前的内容截取出来。
pattern1 = re.compile(&#39;"裁判日期":"(.*?)"&#39;, re.S)
date = re.findall(pattern1,raw)
pattern2 = re.compile(&#39;"案号":"(.*?)"&#39;, re.S)
num = re.findall(pattern2,raw)
pattern3 = re.compile(&#39;"案件名称":"(.*?)"&#39;, re.S)
title = re.findall(pattern3,raw)
#把筛选出的数据添加到开始的三个空列表里
dates+=date
titles+=title
nums+=num
#这一行是让程序休息,做事留点余地比较好。通过网页编码可知,文书网是有验证码功能的,如果你抓的太狠中招莫怪。
time.sleep(SleepNum)
Index += 1
#这里我们可以看到,从while开始到此,所有的代码都缩进了四个空格。这是因为要告诉电脑,这一段代码构成一个相对独立的组,当index小于123时,不断地从这个组第一句代码执行到最后一句代码,而不涉及到本文涉及的其他代码。
#这里代码又是顶格写。
#用pandas模块将筛选出的内容转成dataframe格式,并保存到Excel。
df=pd.DataFrame({&#39;时间&#39;:dates,&#39;案号&#39;:nums, &#39;案件名称&#39;:titles})
df.to_excel(&#39;C:\\result.xlsx&#39;)
  好了,工作结束,保存,点击软件界面上的绿色小三角或按F5运行,过一会,我们会发现C盘静静的躺着一个名为result的excel表,里面存储着我们想要的信息。以后我们不用打开编程软件Spyder,把代码保存在桌面,双击,它会根据设置的搜索条件自动找到相关的文档号,保存为excel,不用了登录响应。文档网络慢是不是很方便?
  如果只想要结果,直接粘贴到Spyder左边的框中,直接运行即可。 (但是如果你看完这篇文章想进一步了解编程,个人强烈不推荐这个。因为你自己没有输入很多细节,你不会注意到。比如刚才提到的while语句,按回车行前有个“:”,看代码很容易忽略。当然Spyder编程软件很聪明,会为我们完成,但是我们不能靠机器,对吧。 )
  其他补充:
  首先,编程的好处很多。可以提高我们的工作效率(就像上面的代码,运行2、3分钟,可以下载上千份法律文件);而且因为编程就像教一个什么都不知道怎么做事的孩子,有一个前提,没有明确的解释是做不到的,所以很合乎逻辑,可以反馈合法的工作。例如,在分析法律关系时,编程的思维方式可以帮助我们意识到我们忽略的隐含前提。
  其次,编程并不难。通过这种级别的编程,您不必考虑机器如何理解我在写的内容。这种问题更像是游戏的高级设置选项。大部分代码直接是英文单词,可以看成是写一篇英文论文。 我们的难处主要在于不舒服,这绝不是不可理解的。这个问题可以通过多输入几次代码来解决。
  最后,如果这个文章有幸引起你学习Python的兴趣,可以去这个网站学习基础知识,通俗易懂,而且每节都附有小练习,非常适合初学者(课后一定要练习,写出来就对了)

python网页数据抓取(三种抓取网页数据的方法-2.Beautiful)

网站优化优采云 发表了文章 • 0 个评论 • 135 次浏览 • 2021-09-13 08:02 • 来自相关话题

  python网页数据抓取(三种抓取网页数据的方法-2.Beautiful)
  下面我们将介绍三种抓取网页数据的方法,首先是正则表达式,然后是流行的BeautifulSoup模块,最后是强大的lxml模块。
  1. 正则表达式
  如果你对正则表达式不熟悉,或者需要一些提示,可以参考Regular Expression HOWTO的完整介绍。
  当我们使用正则表达式抓取国家/地区数据时,首先要尽量匹配元素的内容,如下图:
  >>> import re
>>> import urllib2
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> re.findall(&#39;(.*?)&#39;, html)
[&#39;/places/static/images/flags/gb.png&#39;, &#39;244,820 square kilometres&#39;, &#39;62,348,447&#39;, &#39;GB&#39;, &#39;United Kingdom&#39;, &#39;London&#39;, &#39;EU&#39;, &#39;.uk&#39;, &#39;GBP&#39;, &#39;Pound&#39;, &#39;44&#39;, &#39;@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA&#39;, &#39;^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|([A-Z]{2}\\d{2}[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})|([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})|(GIR0AA))$&#39;, &#39;en-GB,cy-GB,gd&#39;, &#39;IE &#39;]
>>>
  从上面的结果可以看出,多个国家/地区属性都使用了标签。分隔area属性,我们可以只选择第二个元素,如下图:
  >>> re.findall(&#39;(.*?)&#39;, html)[1]
&#39;244,820 square kilometres&#39;
  虽然现在可以使用这个计划,但是如果页面发生变化,该计划很可能会失败。比如表变了,去掉了第二行的土地面积数据。如果我们现在只抓取数据,我们可以忽略这种可能的未来变化。但是,如果我们希望将来再次捕获数据,则需要提供更健壮的解决方案,以尽可能避免这种布局更改的影响。为了使正则表达式更加健壮,我们还可以添加其父元素。由于这个元素有一个 ID 属性,所以它应该是唯一的。
  >>> re.findall(&#39;Area: (.*?)&#39;, html)
[&#39;244,820 square kilometres&#39;]
  这个迭代版本看起来更好,但是还有很多其他的更新网页的方式,也会让正则表达式不尽人意。例如,将双引号更改为单引号,在标签之间添加额外的空格,或者更改 area_label 等。以下是尝试支持这些可能性的改进版本。
  >>> re.findall(&#39;.*?(.*?)&#39;,html)[&#39;244,820 square kilometres&#39;]
  这个正则表达式虽然更容易适应未来的变化,但存在构建困难、可读性差的问题。此外,还有一些细微的布局变化会使正则表达式不令人满意,例如在标签中添加标题属性。
  从这个例子可以看出,正则表达式为我们提供了一种快速抓取数据的方式,但是这种方式过于脆弱,在网页更新后容易出现问题。好在还有一些更好的解决方案,后面会介绍。
  2.美汤
  Beautiful Soup 是一个非常流行的 Python 模块。该模块可以解析网页并提供方便的界面来定位内容。如果没有安装模块,可以使用如下命令安装最新版本(需要先安装pip,请自行百度):
  pip install beautifulsoup4
  使用 Beautiful Soup 的第一步是将下载的 HTML 内容解析成一个 Soup 文档。由于大多数网页没有好的 HTML 格式,Beautiful Soup 需要确定其实际格式。例如,在下面的简单网页列表中,存在属性值周围缺少引号和未关闭标签的问题。
  
Area
Population
  如果将 Population 列表项解析为 Area 列表项的子元素,而不是两个并排的列表项,我们在爬行时会得到错误的结果。下面我们来看看Beautiful Soup是如何处理的。
  >>> from bs4 import BeautifulSoup
>>> broken_html = &#39;AreaPopulation&#39;
>>> # parse the HTML
>>> soup = BeautifulSoup(broken_html, &#39;html.parser&#39;)
>>> fixed_html = soup.prettify()
>>> print fixed_html

Area

Population


  从上面的执行结果可以看出,Beautiful Soup可以正确解析缺失的引号并关闭标签。现在我们可以使用 find() 和 find_all() 方法来定位我们需要的元素。
  >>> ul = soup.find(&#39;ul&#39;, attrs={&#39;class&#39;:&#39;country&#39;})
>>> ul.find(&#39;li&#39;) # return just the first match
AreaPopulation
>>> ul.find_all(&#39;li&#39;) # return all matches
[AreaPopulation, Population]
  注:由于不同版本的Python内置库容错能力不同,处理结果可能与上述不同。详情请参考:。如果想知道所有的方法和参数,可以参考Beautiful Soup的官方文档
  以下是使用该方法提取样本国家面积数据的完整代码。
  >>> from bs4 import BeautifulSoup
>>> import urllib2
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> # locate the area row
>>> tr = soup.find(attrs={&#39;id&#39;:&#39;places_area__row&#39;})
>>> # locate the area tag
>>> td = tr.find(attrs={&#39;class&#39;:&#39;w2p_fw&#39;})
>>> area = td.text # extract the text from this tag
>>> print area
244,820 square kilometres
  虽然这段代码比正则表达式代码复杂,但更容易构建和理解。此外,我们不需要担心布局的微小变化,例如额外的空格和标签属性。
  3.Lxml
  Lxml 是一个基于 libxml2(一个 XML 解析库)的 Python 包。这个模块是用C语言编写的,解析速度比Beautiful Soup快,但是安装过程比较复杂。可以参考最新的安装说明。**
  与 Beautiful Soup 一样,使用 lxml 模块的第一步是将潜在的非法 HTML 解析为统一格式。以下是使用此模块解析不完整 HTML 的示例:
  >>> import lxml.html
>>> broken_html = &#39;AreaPopulation&#39;
>>> # parse the HTML
>>> tree = lxml.html.fromstring(broken_html)
>>> fixed_html = lxml.html.tostring(tree, pretty_print=True)
>>> print fixed_html
Area
Population
  同理,lxml 也可以正确解析属性两边缺失的引号并关闭标签,但是模块没有添加和标签。
  解析输入内容后,进入选择元素的步骤。这时候lxml有几种不同的方法,比如XPath选择器和类似于Beautiful Soup的find()方法。但是,我们以后会使用 CSS 选择器,因为它更简洁,可以在解析动态内容时重复使用。另外,一些有jQuery选择器使用经验的读者会比较熟悉。
  以下是使用lxml的CSS选择器提取区域数据的示例代码:
  >>> import urllib2
>>> import lxml.html
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> tree = lxml.html.fromstring(html)
>>> td = tree.cssselect(&#39;tr#places_area__row > td.w2p_fw&#39;)[0] # *行代码
>>> area = td.text_content()
>>> print area
244,820 square kilometres
  * 这行代码会先找到id为places_area__row的表格行元素,然后选择类为w2p_fw的表格数据子标签。
  CSS 选择器指示用于选择元素的模式。以下是一些常用选择器的示例:
  选择所有标签: *
选择 标签: a
选择所有 class="link" 的元素: .link
选择 class="link" 的 标签: a.link
选择 id="home" 的 标签: a#home
选择父元素为 标签的所有 子标签: a > span
选择 标签内部的所有 标签: a span
选择 title 属性为"Home"的所有 标签: a[title=Home]
  W3C 提出了 CSS3 规范,其 URL 为
  Lxml 已经实现了大部分 CSS3 属性,不支持的功能可以在:.
  注意:在lxml的内部实现中,它实际上是将CSS选择器转换成等效的XPath选择器。
  4. 性能对比
  在下面这段代码中,每个爬虫都会执行 1000 次。每次执行都会检查爬取结果是否正确,然后打印总时间。
  # -*- coding: utf-8 -*-
import csv
import time
import urllib2
import re
import timeit
from bs4 import BeautifulSoup
import lxml.html
FIELDS = (&#39;area&#39;, &#39;population&#39;, &#39;iso&#39;, &#39;country&#39;, &#39;capital&#39;, &#39;continent&#39;, &#39;tld&#39;, &#39;currency_code&#39;, &#39;currency_name&#39;, &#39;phone&#39;, &#39;postal_code_format&#39;, &#39;postal_code_regex&#39;, &#39;languages&#39;, &#39;neighbours&#39;)
def regex_scraper(html):
results = {}
for field in FIELDS:
results[field] = re.search(&#39;.*?(.*?)&#39;.format(field), html).groups()[0]
return results
def beautiful_soup_scraper(html):
soup = BeautifulSoup(html, &#39;html.parser&#39;)
results = {}
for field in FIELDS:
results[field] = soup.find(&#39;table&#39;).find(&#39;tr&#39;, id=&#39;places_{}__row&#39;.format(field)).find(&#39;td&#39;, class_=&#39;w2p_fw&#39;).text
return results
def lxml_scraper(html):
tree = lxml.html.fromstring(html)
results = {}
for field in FIELDS:
results[field] = tree.cssselect(&#39;table > tr#places_{}__row > td.w2p_fw&#39;.format(field))[0].text_content()
return results
def main():
times = {}
html = urllib2.urlopen(&#39;http://example.webscraping.com ... %2339;).read()
NUM_ITERATIONS = 1000 # number of times to test each scraper
for name, scraper in (&#39;Regular expressions&#39;, regex_scraper), (&#39;Beautiful Soup&#39;, beautiful_soup_scraper), (&#39;Lxml&#39;, lxml_scraper):
times[name] = []
# record start time of scrape
start = time.time()
for i in range(NUM_ITERATIONS):
if scraper == regex_scraper:
# the regular expression module will cache results
# so need to purge this cache for meaningful timings
re.purge() # *行代码
result = scraper(html)
# check scraped result is as expected
assert(result[&#39;area&#39;] == &#39;244,820 square kilometres&#39;)
times[name].append(time.time() - start)
# record end time of scrape and output the total
end = time.time()
print &#39;{}: {:.2f} seconds&#39;.format(name, end - start)
writer = csv.writer(open(&#39;times.csv&#39;, &#39;w&#39;))
header = sorted(times.keys())
writer.writerow(header)
for row in zip(*[times[scraper] for scraper in header]):
writer.writerow(row)
if __name__ == &#39;__main__&#39;:
main()
  请注意,我们在 * 行代码中调用了 re.purge() 方法。默认情况下,正则表达式将缓存搜索结果。公平地说,我们需要使用这种方法来清除缓存。
  以下是在我的电脑上运行脚本的结果:
  
  由于硬件条件的不同,不同电脑的执行结果也会有一定的差异。但是,每种方法之间的相对差异应该具有可比性。从结果中可以看出,在抓取我们的示例网页时,Beautiful Soup 比其他两种方法慢 7 倍以上。其实这个结果是符合预期的,因为lxml和正则表达式模块是用C语言写的,而Beautiful Soup是用纯Python写的。一个有趣的事实是 lxml 的性能几乎与正则表达式一样好。由于 lxml 必须在搜索元素之前将输入解析为内部格式,因此会产生额外的开销。当抓取同一个网页的多个特征时,这个初步分析的开销会减少,lxml会更有竞争力。因此,lxml 是一个强大的模块。
  5.总结
  三种网页抓取方式的优缺点:
  抓取方法 性能 使用困难 安装困难
  正则表达式
  快速
  难度
  简单(内置模块)
  美汤
  慢
  简单
  简单(纯 Python)
  Lxml
  快速
  简单
  比较难
  如果你的爬虫的瓶颈是下载网页,而不是提取数据,那么使用速度较慢的方法(比如Beautiful Soup)不是问题。正则表达式在一次性提取中非常有用,还可以避免解析整个网页的开销。如果你只需要爬取少量数据,又想避免额外的依赖,那么正则表达式可能更合适。不过一般情况下,lxml是爬取数据的最佳选择,因为它不仅速度更快,而且用途更广,而正则表达式和Beautiful Soup只在某些场景下有用。 查看全部

  python网页数据抓取(三种抓取网页数据的方法-2.Beautiful)
  下面我们将介绍三种抓取网页数据的方法,首先是正则表达式,然后是流行的BeautifulSoup模块,最后是强大的lxml模块。
  1. 正则表达式
  如果你对正则表达式不熟悉,或者需要一些提示,可以参考Regular Expression HOWTO的完整介绍。
  当我们使用正则表达式抓取国家/地区数据时,首先要尽量匹配元素的内容,如下图:
  >>> import re
>>> import urllib2
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> re.findall(&#39;(.*?)&#39;, html)
[&#39;/places/static/images/flags/gb.png&#39;, &#39;244,820 square kilometres&#39;, &#39;62,348,447&#39;, &#39;GB&#39;, &#39;United Kingdom&#39;, &#39;London&#39;, &#39;EU&#39;, &#39;.uk&#39;, &#39;GBP&#39;, &#39;Pound&#39;, &#39;44&#39;, &#39;@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA&#39;, &#39;^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|([A-Z]{2}\\d{2}[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})|([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})|(GIR0AA))$&#39;, &#39;en-GB,cy-GB,gd&#39;, &#39;IE &#39;]
>>>
  从上面的结果可以看出,多个国家/地区属性都使用了标签。分隔area属性,我们可以只选择第二个元素,如下图:
  >>> re.findall(&#39;(.*?)&#39;, html)[1]
&#39;244,820 square kilometres&#39;
  虽然现在可以使用这个计划,但是如果页面发生变化,该计划很可能会失败。比如表变了,去掉了第二行的土地面积数据。如果我们现在只抓取数据,我们可以忽略这种可能的未来变化。但是,如果我们希望将来再次捕获数据,则需要提供更健壮的解决方案,以尽可能避免这种布局更改的影响。为了使正则表达式更加健壮,我们还可以添加其父元素。由于这个元素有一个 ID 属性,所以它应该是唯一的。
  >>> re.findall(&#39;Area: (.*?)&#39;, html)
[&#39;244,820 square kilometres&#39;]
  这个迭代版本看起来更好,但是还有很多其他的更新网页的方式,也会让正则表达式不尽人意。例如,将双引号更改为单引号,在标签之间添加额外的空格,或者更改 area_label 等。以下是尝试支持这些可能性的改进版本。
  >>> re.findall(&#39;.*?(.*?)&#39;,html)[&#39;244,820 square kilometres&#39;]
  这个正则表达式虽然更容易适应未来的变化,但存在构建困难、可读性差的问题。此外,还有一些细微的布局变化会使正则表达式不令人满意,例如在标签中添加标题属性。
  从这个例子可以看出,正则表达式为我们提供了一种快速抓取数据的方式,但是这种方式过于脆弱,在网页更新后容易出现问题。好在还有一些更好的解决方案,后面会介绍。
  2.美汤
  Beautiful Soup 是一个非常流行的 Python 模块。该模块可以解析网页并提供方便的界面来定位内容。如果没有安装模块,可以使用如下命令安装最新版本(需要先安装pip,请自行百度):
  pip install beautifulsoup4
  使用 Beautiful Soup 的第一步是将下载的 HTML 内容解析成一个 Soup 文档。由于大多数网页没有好的 HTML 格式,Beautiful Soup 需要确定其实际格式。例如,在下面的简单网页列表中,存在属性值周围缺少引号和未关闭标签的问题。
  
Area
Population
  如果将 Population 列表项解析为 Area 列表项的子元素,而不是两个并排的列表项,我们在爬行时会得到错误的结果。下面我们来看看Beautiful Soup是如何处理的。
  >>> from bs4 import BeautifulSoup
>>> broken_html = &#39;AreaPopulation&#39;
>>> # parse the HTML
>>> soup = BeautifulSoup(broken_html, &#39;html.parser&#39;)
>>> fixed_html = soup.prettify()
>>> print fixed_html

Area

Population


  从上面的执行结果可以看出,Beautiful Soup可以正确解析缺失的引号并关闭标签。现在我们可以使用 find() 和 find_all() 方法来定位我们需要的元素。
  >>> ul = soup.find(&#39;ul&#39;, attrs={&#39;class&#39;:&#39;country&#39;})
>>> ul.find(&#39;li&#39;) # return just the first match
AreaPopulation
>>> ul.find_all(&#39;li&#39;) # return all matches
[AreaPopulation, Population]
  注:由于不同版本的Python内置库容错能力不同,处理结果可能与上述不同。详情请参考:。如果想知道所有的方法和参数,可以参考Beautiful Soup的官方文档
  以下是使用该方法提取样本国家面积数据的完整代码。
  >>> from bs4 import BeautifulSoup
>>> import urllib2
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> # locate the area row
>>> tr = soup.find(attrs={&#39;id&#39;:&#39;places_area__row&#39;})
>>> # locate the area tag
>>> td = tr.find(attrs={&#39;class&#39;:&#39;w2p_fw&#39;})
>>> area = td.text # extract the text from this tag
>>> print area
244,820 square kilometres
  虽然这段代码比正则表达式代码复杂,但更容易构建和理解。此外,我们不需要担心布局的微小变化,例如额外的空格和标签属性。
  3.Lxml
  Lxml 是一个基于 libxml2(一个 XML 解析库)的 Python 包。这个模块是用C语言编写的,解析速度比Beautiful Soup快,但是安装过程比较复杂。可以参考最新的安装说明。**
  与 Beautiful Soup 一样,使用 lxml 模块的第一步是将潜在的非法 HTML 解析为统一格式。以下是使用此模块解析不完整 HTML 的示例:
  >>> import lxml.html
>>> broken_html = &#39;AreaPopulation&#39;
>>> # parse the HTML
>>> tree = lxml.html.fromstring(broken_html)
>>> fixed_html = lxml.html.tostring(tree, pretty_print=True)
>>> print fixed_html
Area
Population
  同理,lxml 也可以正确解析属性两边缺失的引号并关闭标签,但是模块没有添加和标签。
  解析输入内容后,进入选择元素的步骤。这时候lxml有几种不同的方法,比如XPath选择器和类似于Beautiful Soup的find()方法。但是,我们以后会使用 CSS 选择器,因为它更简洁,可以在解析动态内容时重复使用。另外,一些有jQuery选择器使用经验的读者会比较熟悉。
  以下是使用lxml的CSS选择器提取区域数据的示例代码:
  >>> import urllib2
>>> import lxml.html
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> tree = lxml.html.fromstring(html)
>>> td = tree.cssselect(&#39;tr#places_area__row > td.w2p_fw&#39;)[0] # *行代码
>>> area = td.text_content()
>>> print area
244,820 square kilometres
  * 这行代码会先找到id为places_area__row的表格行元素,然后选择类为w2p_fw的表格数据子标签。
  CSS 选择器指示用于选择元素的模式。以下是一些常用选择器的示例:
  选择所有标签: *
选择 标签: a
选择所有 class="link" 的元素: .link
选择 class="link" 的 标签: a.link
选择 id="home" 的 标签: a#home
选择父元素为 标签的所有 子标签: a > span
选择 标签内部的所有 标签: a span
选择 title 属性为"Home"的所有 标签: a[title=Home]
  W3C 提出了 CSS3 规范,其 URL 为
  Lxml 已经实现了大部分 CSS3 属性,不支持的功能可以在:.
  注意:在lxml的内部实现中,它实际上是将CSS选择器转换成等效的XPath选择器。
  4. 性能对比
  在下面这段代码中,每个爬虫都会执行 1000 次。每次执行都会检查爬取结果是否正确,然后打印总时间。
  # -*- coding: utf-8 -*-
import csv
import time
import urllib2
import re
import timeit
from bs4 import BeautifulSoup
import lxml.html
FIELDS = (&#39;area&#39;, &#39;population&#39;, &#39;iso&#39;, &#39;country&#39;, &#39;capital&#39;, &#39;continent&#39;, &#39;tld&#39;, &#39;currency_code&#39;, &#39;currency_name&#39;, &#39;phone&#39;, &#39;postal_code_format&#39;, &#39;postal_code_regex&#39;, &#39;languages&#39;, &#39;neighbours&#39;)
def regex_scraper(html):
results = {}
for field in FIELDS:
results[field] = re.search(&#39;.*?(.*?)&#39;.format(field), html).groups()[0]
return results
def beautiful_soup_scraper(html):
soup = BeautifulSoup(html, &#39;html.parser&#39;)
results = {}
for field in FIELDS:
results[field] = soup.find(&#39;table&#39;).find(&#39;tr&#39;, id=&#39;places_{}__row&#39;.format(field)).find(&#39;td&#39;, class_=&#39;w2p_fw&#39;).text
return results
def lxml_scraper(html):
tree = lxml.html.fromstring(html)
results = {}
for field in FIELDS:
results[field] = tree.cssselect(&#39;table > tr#places_{}__row > td.w2p_fw&#39;.format(field))[0].text_content()
return results
def main():
times = {}
html = urllib2.urlopen(&#39;http://example.webscraping.com ... %2339;).read()
NUM_ITERATIONS = 1000 # number of times to test each scraper
for name, scraper in (&#39;Regular expressions&#39;, regex_scraper), (&#39;Beautiful Soup&#39;, beautiful_soup_scraper), (&#39;Lxml&#39;, lxml_scraper):
times[name] = []
# record start time of scrape
start = time.time()
for i in range(NUM_ITERATIONS):
if scraper == regex_scraper:
# the regular expression module will cache results
# so need to purge this cache for meaningful timings
re.purge() # *行代码
result = scraper(html)
# check scraped result is as expected
assert(result[&#39;area&#39;] == &#39;244,820 square kilometres&#39;)
times[name].append(time.time() - start)
# record end time of scrape and output the total
end = time.time()
print &#39;{}: {:.2f} seconds&#39;.format(name, end - start)
writer = csv.writer(open(&#39;times.csv&#39;, &#39;w&#39;))
header = sorted(times.keys())
writer.writerow(header)
for row in zip(*[times[scraper] for scraper in header]):
writer.writerow(row)
if __name__ == &#39;__main__&#39;:
main()
  请注意,我们在 * 行代码中调用了 re.purge() 方法。默认情况下,正则表达式将缓存搜索结果。公平地说,我们需要使用这种方法来清除缓存。
  以下是在我的电脑上运行脚本的结果:
  
  由于硬件条件的不同,不同电脑的执行结果也会有一定的差异。但是,每种方法之间的相对差异应该具有可比性。从结果中可以看出,在抓取我们的示例网页时,Beautiful Soup 比其他两种方法慢 7 倍以上。其实这个结果是符合预期的,因为lxml和正则表达式模块是用C语言写的,而Beautiful Soup是用纯Python写的。一个有趣的事实是 lxml 的性能几乎与正则表达式一样好。由于 lxml 必须在搜索元素之前将输入解析为内部格式,因此会产生额外的开销。当抓取同一个网页的多个特征时,这个初步分析的开销会减少,lxml会更有竞争力。因此,lxml 是一个强大的模块。
  5.总结
  三种网页抓取方式的优缺点:
  抓取方法 性能 使用困难 安装困难
  正则表达式
  快速
  难度
  简单(内置模块)
  美汤
  慢
  简单
  简单(纯 Python)
  Lxml
  快速
  简单
  比较难
  如果你的爬虫的瓶颈是下载网页,而不是提取数据,那么使用速度较慢的方法(比如Beautiful Soup)不是问题。正则表达式在一次性提取中非常有用,还可以避免解析整个网页的开销。如果你只需要爬取少量数据,又想避免额外的依赖,那么正则表达式可能更合适。不过一般情况下,lxml是爬取数据的最佳选择,因为它不仅速度更快,而且用途更广,而正则表达式和Beautiful Soup只在某些场景下有用。

python网页数据抓取(Excel教程Excel函数Excel表格制作Excel2010Excel实用技巧Excel视频教程 )

网站优化优采云 发表了文章 • 0 个评论 • 120 次浏览 • 2021-09-12 18:06 • 来自相关话题

  python网页数据抓取(Excel教程Excel函数Excel表格制作Excel2010Excel实用技巧Excel视频教程
)
  本文介绍了BeautifulSoup方法来抓取网页数据并保存
  为了方便查找和保存数据,请求模块、bs4模块BeautifulSoup方法和xlwt模块(下载方法:打开cmd,输入pip安装包名)
  本文将演示抓取豆瓣音乐排行榜()
  图如下:
  
  点击F12打开HTML源代码,我们可以看到每个
  有一个电影名字,下面有一个标签
  标签,所以我们可以定位和搜索电影名称。
  代码如下:
  #抓取网页数据,并保存
from bs4 import BeautifulSoup
import requests
import xlwt
def get_save_music(url):
#抓取数据
f = requests.get(url) #get方法访问网页
soup = BeautifulSoup(f.content, "lxml") #用xlml解析f.content获取网页全部内容html
musics = [] #定义一个列表,存放歌名
for k in soup.find_all(&#39;div&#39;, class_=&#39;intro&#39;): #,找到所有div并且class为&#39;intro&#39;的标签
for i in k.find_all(&#39;a&#39;): #再找到所有a标签
musics.append(i.string) #i.string获取文本,并添加到列表
#写入文档
work = xlwt.Workbook()
sheet = wb.add_sheet(&#39;music&#39;) #设置sheet名
for index, music in enumerate(musics): #enumerate()方法获取索引值及数据
sheet.write(index, 0, index+1) #第一竖列写入编号
sheet.write(index, 1, music) #第二竖列写入歌名
try:
work.save(&#39;music.xls&#39;) #保存文档
except PermissionError as e:
print(&#39;访问拒绝,请先关闭文档!&#39;, e)
#执行
get_save_music("https://music.douban.com/chart")
  执行成功后,文档如下:
   查看全部

  python网页数据抓取(Excel教程Excel函数Excel表格制作Excel2010Excel实用技巧Excel视频教程
)
  本文介绍了BeautifulSoup方法来抓取网页数据并保存
  为了方便查找和保存数据,请求模块、bs4模块BeautifulSoup方法和xlwt模块(下载方法:打开cmd,输入pip安装包名)
  本文将演示抓取豆瓣音乐排行榜()
  图如下:
  
  点击F12打开HTML源代码,我们可以看到每个
  有一个电影名字,下面有一个标签
  标签,所以我们可以定位和搜索电影名称。
  代码如下:
  #抓取网页数据,并保存
from bs4 import BeautifulSoup
import requests
import xlwt
def get_save_music(url):
#抓取数据
f = requests.get(url) #get方法访问网页
soup = BeautifulSoup(f.content, "lxml") #用xlml解析f.content获取网页全部内容html
musics = [] #定义一个列表,存放歌名
for k in soup.find_all(&#39;div&#39;, class_=&#39;intro&#39;): #,找到所有div并且class为&#39;intro&#39;的标签
for i in k.find_all(&#39;a&#39;): #再找到所有a标签
musics.append(i.string) #i.string获取文本,并添加到列表
#写入文档
work = xlwt.Workbook()
sheet = wb.add_sheet(&#39;music&#39;) #设置sheet名
for index, music in enumerate(musics): #enumerate()方法获取索引值及数据
sheet.write(index, 0, index+1) #第一竖列写入编号
sheet.write(index, 1, music) #第二竖列写入歌名
try:
work.save(&#39;music.xls&#39;) #保存文档
except PermissionError as e:
print(&#39;访问拒绝,请先关闭文档!&#39;, e)
#执行
get_save_music("https://music.douban.com/chart";)
  执行成功后,文档如下:
  

python网页数据抓取(如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化)

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

  python网页数据抓取(如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化)
  前几天跟大家分享了如何使用Python词云和wordart可视化工具将朋友圈数据可视化,使用Python网络爬虫抓取微信好友数和男女微信好友比例,并使用Python网络爬虫捕捉微信好友的省市分布及其可视化。感兴趣的朋友可以点击进入查看详情。内容不难。即使你是新手,也可以通过代码爬取。今天小编继续跟大家分享如何使用Python网络爬虫抓取微信好友的签名以及他们的视觉展示。具体教程如下图。
  1、代码实现还是基于itchat库。关于这个神奇的库,我在之前的文章中提到过,不再赘述。下图中代码的作用是实现签名捕获和数据提取。然后将捕获的数据写入本地文件。
  
  2、程序运行完毕后,得到一个文本文件,内容如下图。
  
  第一行的第一个签名是编辑自己的,博学的,审问的,细心的,有洞察力的,有责任心的。后续签名按照微信通讯录中名片的先后顺序呈现。如果好友有微信签名,则会被抓取,如果没有签名,则忽略。
  3、 随机验证一个微信好友的签名,然后以编辑主题的微信签名为例。她的签名是“要安全,要失去,要冷静,要顺其自然,要无可避免!” ”,在TXT文件中搜索后,可以看到签名确实在里面,如下图所示。
  
  4、接下来,我们将这个文件的词云可视化。继续写代码,如下图所示。
  
  代码的关键部分是需要底图和字体。底图的编辑器使用路飞。注意使用带有白色底图的图片,否则词云可视化效果不好。
  
  需要提前下载字体。可视化也可以参考这个文章:如何使用Python词云和艺术字可视化工具来可视化Moments数据。
  5、程序运行后,还需要扫码授权。程序运行如下图所示。
  
  红色代码部分在之前的文章文章中已经有详细说明,不再赘述。
  经过6、后我们可以看到展现在我们面前的美丽的词云图片,如下图所示。
  
  根据词云的可视化,关键词:生命、努力、时间、我们、哈哈哈……词出现的频率更高。能感受到编辑的微信朋友们的签名基本突出了积极、乐观、珍惜时间、努力工作的特点。
  说服国王拿下金榛子,说服他在他十几岁的时候拿回来。花可以折直,一定要折,没有花的不能折。祝大家周末愉快,人生苦短,我用Python~~ 查看全部

  python网页数据抓取(如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化)
  前几天跟大家分享了如何使用Python词云和wordart可视化工具将朋友圈数据可视化,使用Python网络爬虫抓取微信好友数和男女微信好友比例,并使用Python网络爬虫捕捉微信好友的省市分布及其可视化。感兴趣的朋友可以点击进入查看详情。内容不难。即使你是新手,也可以通过代码爬取。今天小编继续跟大家分享如何使用Python网络爬虫抓取微信好友的签名以及他们的视觉展示。具体教程如下图。
  1、代码实现还是基于itchat库。关于这个神奇的库,我在之前的文章中提到过,不再赘述。下图中代码的作用是实现签名捕获和数据提取。然后将捕获的数据写入本地文件。
  
  2、程序运行完毕后,得到一个文本文件,内容如下图。
  
  第一行的第一个签名是编辑自己的,博学的,审问的,细心的,有洞察力的,有责任心的。后续签名按照微信通讯录中名片的先后顺序呈现。如果好友有微信签名,则会被抓取,如果没有签名,则忽略。
  3、 随机验证一个微信好友的签名,然后以编辑主题的微信签名为例。她的签名是“要安全,要失去,要冷静,要顺其自然,要无可避免!” ”,在TXT文件中搜索后,可以看到签名确实在里面,如下图所示。
  
  4、接下来,我们将这个文件的词云可视化。继续写代码,如下图所示。
  
  代码的关键部分是需要底图和字体。底图的编辑器使用路飞。注意使用带有白色底图的图片,否则词云可视化效果不好。
  
  需要提前下载字体。可视化也可以参考这个文章:如何使用Python词云和艺术字可视化工具来可视化Moments数据。
  5、程序运行后,还需要扫码授权。程序运行如下图所示。
  
  红色代码部分在之前的文章文章中已经有详细说明,不再赘述。
  经过6、后我们可以看到展现在我们面前的美丽的词云图片,如下图所示。
  
  根据词云的可视化,关键词:生命、努力、时间、我们、哈哈哈……词出现的频率更高。能感受到编辑的微信朋友们的签名基本突出了积极、乐观、珍惜时间、努力工作的特点。
  说服国王拿下金榛子,说服他在他十几岁的时候拿回来。花可以折直,一定要折,没有花的不能折。祝大家周末愉快,人生苦短,我用Python~~

python网页数据抓取( 美国3.CSDN学院课程数据解析网页函数网页下载地址下载 )

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

  python网页数据抓取(
美国3.CSDN学院课程数据解析网页函数网页下载地址下载
)
  https://edu.csdn.net/courses/p2
https://edu.csdn.net/courses/p3
https://edu.csdn.net/courses/p4
... ...
https://edu.csdn.net/courses/p271
  页码很规律,直接写代码就可以快速爬下来。出于人文关怀,我还是把协程的数量限制在了3个,不然271个请求顺利发送就有点反感了。这不好,不符合我们的精神。
  import asyncio
import aiohttp
from lxml import etree
sema = asyncio.Semaphore(3)
async def get_html(url):
headers = {
"user-agent": "自己找个UA即可"
}
&#39;&#39;&#39;
本文来自 梦想橡皮擦 的博客
地址为: https://blog.csdn.net/hihell
可以任意转载,但是希望给我留个版权。
&#39;&#39;&#39;
print("正在操作{}".format(url))
async with aiohttp.ClientSession() as s:
try:
async with s.get(url, headers=headers, timeout=3) as res:
if res.status==200:
html = await res.text()
html = etree.HTML(html)
get_content(html) # 解析网页
print("数据{}插入完毕".format(url))
except Exception as e:
print(e)
print(html)
time.sleep(1)
print("休息一下")
await get_html(url)
async def x_get_html(url):
with(await sema):
await get_html(url)
if __name__ == &#39;__main__&#39;:
url_format = "https://edu.csdn.net/courses/p{}"
urls = [url_format.format(index) for index in range(1, 272)]
loop = asyncio.get_event_loop()
tasks = [x_get_html(url) for url in urls]
request = loop.run_until_complete(asyncio.wait(tasks))
  3.CSDN大学课程数据分析网页功能
  网页下载后,需要经过两次处理才能放入mongodb,我们只需要使用lxml库
  def get_content(html):
course_item = html.xpath("//div[@class=&#39;course_item&#39;]")
data = []
for item in course_item:
link = item.xpath("./a/@href")[0] # 获取课程详情的链接,方便我们后面抓取
tags = item.xpath(".//div[@class=&#39;titleInfor&#39;]/span[@class=&#39;tags&#39;]/text()") # 获取标签
title = item.xpath(".//div[@class=&#39;titleInfor&#39;]/span[@class=&#39;title&#39;]/text()")[0] # 获取标题
num = item.xpath(".//p[@class=&#39;subinfo&#39;]/span/text()")[0] # 学习人数
subinfo = item.xpath(".//p[@class=&#39;subinfo&#39;]/text()")[1].strip() # 作者
price = item.xpath(".//p[contains(@class,&#39;priceinfo&#39;)]/i/text()")[0].strip() # 作者
data.append({
"title":title,
"link":link,
"tags":tags,
"num":num,
"subinfo":subinfo,
"price":price
})
collection.insert_many(data)
  4. 数据存储
  将数据保存到mongodb并完成。
  
  没有特别突出的地方,简单易操作。
   查看全部

  python网页数据抓取(
美国3.CSDN学院课程数据解析网页函数网页下载地址下载
)
  https://edu.csdn.net/courses/p2
https://edu.csdn.net/courses/p3
https://edu.csdn.net/courses/p4
... ...
https://edu.csdn.net/courses/p271
  页码很规律,直接写代码就可以快速爬下来。出于人文关怀,我还是把协程的数量限制在了3个,不然271个请求顺利发送就有点反感了。这不好,不符合我们的精神。
  import asyncio
import aiohttp
from lxml import etree
sema = asyncio.Semaphore(3)
async def get_html(url):
headers = {
"user-agent": "自己找个UA即可"
}
&#39;&#39;&#39;
本文来自 梦想橡皮擦 的博客
地址为: https://blog.csdn.net/hihell
可以任意转载,但是希望给我留个版权。
&#39;&#39;&#39;
print("正在操作{}".format(url))
async with aiohttp.ClientSession() as s:
try:
async with s.get(url, headers=headers, timeout=3) as res:
if res.status==200:
html = await res.text()
html = etree.HTML(html)
get_content(html) # 解析网页
print("数据{}插入完毕".format(url))
except Exception as e:
print(e)
print(html)
time.sleep(1)
print("休息一下")
await get_html(url)
async def x_get_html(url):
with(await sema):
await get_html(url)
if __name__ == &#39;__main__&#39;:
url_format = "https://edu.csdn.net/courses/p{}"
urls = [url_format.format(index) for index in range(1, 272)]
loop = asyncio.get_event_loop()
tasks = [x_get_html(url) for url in urls]
request = loop.run_until_complete(asyncio.wait(tasks))
  3.CSDN大学课程数据分析网页功能
  网页下载后,需要经过两次处理才能放入mongodb,我们只需要使用lxml库
  def get_content(html):
course_item = html.xpath("//div[@class=&#39;course_item&#39;]")
data = []
for item in course_item:
link = item.xpath("./a/@href")[0] # 获取课程详情的链接,方便我们后面抓取
tags = item.xpath(".//div[@class=&#39;titleInfor&#39;]/span[@class=&#39;tags&#39;]/text()") # 获取标签
title = item.xpath(".//div[@class=&#39;titleInfor&#39;]/span[@class=&#39;title&#39;]/text()")[0] # 获取标题
num = item.xpath(".//p[@class=&#39;subinfo&#39;]/span/text()")[0] # 学习人数
subinfo = item.xpath(".//p[@class=&#39;subinfo&#39;]/text()")[1].strip() # 作者
price = item.xpath(".//p[contains(@class,&#39;priceinfo&#39;)]/i/text()")[0].strip() # 作者
data.append({
"title":title,
"link":link,
"tags":tags,
"num":num,
"subinfo":subinfo,
"price":price
})
collection.insert_many(data)
  4. 数据存储
  将数据保存到mongodb并完成。
  
  没有特别突出的地方,简单易操作。
  

python网页数据抓取(如何使用BeautifulSoup从网页中提取我们需要的数据,你知道吗?)

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

  python网页数据抓取(如何使用BeautifulSoup从网页中提取我们需要的数据,你知道吗?)
  通过第一部分的练习,我们有了一个正在运行的爬虫。在这一部分,我们将详细介绍如何使用 BeautifulSoup 从网页中提取我们需要的数据。学习的目标是能够使用 BeautifulSoup 从网页中提取任何数据。
  HTML 文档和 CSS 选择器
  我们知道我们爬回来的网页是由 HTML 和 CSS 组成的,HTML 文档对象模型 (DOM) 将 HTML 文档表示为树状结构。而提取网页特定数据其实就是根据指定的特征匹配文档树,读取数据内容。
  

Python爬虫入门


内容简介
<p id="content_id">这篇文章会从零开始介绍...

  我们已经有一个可运行的爬虫...

</p>
  BeautifulSoup 支持大多数 CSS 选择器。您可以使用 CSS 选择器的语法通过在标签或 BeautifulSoup 对象的 .select() 方法中传递字符串参数来查找标签。以上面的HTML为例,下面使用tag、tag+id、tag+class来定位网页元素:
  >>> soup = BeautifulSoup(html, "html.parser")
>>> soup.select("body h1")
[内容简介]
>>> soup.select("p#content_id")
[<p id="content_id">这篇文章会从零开始介绍...]
>>> soup.select("p.content_class")
[
  我们已经有一个可运行的爬虫...]
</p>
  爬虫示例
  现在回到我们抢豆瓣书的例子。下面我们来看看如何使用BeautifulSoup从网页中提取书名、封面图片、书籍介绍等。代码如下。感兴趣的读者可以添加代码提取更多内容。
  # 从BeautifulSoup对象中提取书名,封面图片和内容简介
def get_web_data(soup):
try:
# 提取书名
elements = soup.select("div#wrapper h1 span")
assert(len(elements) == 1)
print(elements[0].text.strip())
#提取图书的封面图片
elements = soup.select("div#mainpic a.nbg img")
assert(len(elements) == 1)
print(elements[0]["src"])
# 提取图书的内容简介
elements = soup.select("div#link-report span.short div.intro")
if (len(elements) == 1):
print(elements[0].text.strip())
except:
print("ERROR: failed to get data")
  提取数据的关键是分析确定网页元素的CSS选择器。幸运的是,浏览器可以帮到我们很多。以Chrome浏览器为例,在打开的网页上右击要提取的数据,在弹出的菜单项中选择勾选元素。如图,我们可以很方便的获取到元素对应的CSS选择器。
  
  好的,现在我们将部分数据提取代码添加到我们的爬虫中。再次运行程序,提取并打印出书名、封面和介绍信息。
  if __name__== "__main__":
while True:
url = get_unvisited_url()
if url == None:
break

print("\n\nGET " + url)
# 抓取网页内容
response = requests.get(url)
content = response.content.decode("utf-8")
#print(content)
# 提取页面包含的数据
soup = BeautifulSoup(content, "html.parser")
get_web_data(soup)

# 获取页面包含的链接,并加入未访问的队列
for element in soup.select("a[href]"):
new_url = element["href"].strip()
if re.match("^https://book.douban.com/subject/[0-9]+/$", new_url) == None:
continue
unvisited_urls.append(new_url)
time.sleep(1)
  总结
  在本节中,我们将详细介绍如何提取网页数据。 BeautifulSoup 有许多其他 API 来访问 html 内容。详情请参考 BeautifulSoup 文档。下一部分,我们将如何存储爬虫运行数据和捕获的各种数据。
  来源:/i65523560/ 查看全部

  python网页数据抓取(如何使用BeautifulSoup从网页中提取我们需要的数据,你知道吗?)
  通过第一部分的练习,我们有了一个正在运行的爬虫。在这一部分,我们将详细介绍如何使用 BeautifulSoup 从网页中提取我们需要的数据。学习的目标是能够使用 BeautifulSoup 从网页中提取任何数据。
  HTML 文档和 CSS 选择器
  我们知道我们爬回来的网页是由 HTML 和 CSS 组成的,HTML 文档对象模型 (DOM) 将 HTML 文档表示为树状结构。而提取网页特定数据其实就是根据指定的特征匹配文档树,读取数据内容。
  

Python爬虫入门


内容简介
<p id="content_id">这篇文章会从零开始介绍...

  我们已经有一个可运行的爬虫...

</p>
  BeautifulSoup 支持大多数 CSS 选择器。您可以使用 CSS 选择器的语法通过在标签或 BeautifulSoup 对象的 .select() 方法中传递字符串参数来查找标签。以上面的HTML为例,下面使用tag、tag+id、tag+class来定位网页元素:
  >>> soup = BeautifulSoup(html, "html.parser")
>>> soup.select("body h1")
[内容简介]
>>> soup.select("p#content_id")
[<p id="content_id">这篇文章会从零开始介绍...]
>>> soup.select("p.content_class")
[
  我们已经有一个可运行的爬虫...]
</p>
  爬虫示例
  现在回到我们抢豆瓣书的例子。下面我们来看看如何使用BeautifulSoup从网页中提取书名、封面图片、书籍介绍等。代码如下。感兴趣的读者可以添加代码提取更多内容。
  # 从BeautifulSoup对象中提取书名,封面图片和内容简介
def get_web_data(soup):
try:
# 提取书名
elements = soup.select("div#wrapper h1 span")
assert(len(elements) == 1)
print(elements[0].text.strip())
#提取图书的封面图片
elements = soup.select("div#mainpic a.nbg img")
assert(len(elements) == 1)
print(elements[0]["src"])
# 提取图书的内容简介
elements = soup.select("div#link-report span.short div.intro")
if (len(elements) == 1):
print(elements[0].text.strip())
except:
print("ERROR: failed to get data")
  提取数据的关键是分析确定网页元素的CSS选择器。幸运的是,浏览器可以帮到我们很多。以Chrome浏览器为例,在打开的网页上右击要提取的数据,在弹出的菜单项中选择勾选元素。如图,我们可以很方便的获取到元素对应的CSS选择器。
  
  好的,现在我们将部分数据提取代码添加到我们的爬虫中。再次运行程序,提取并打印出书名、封面和介绍信息。
  if __name__== "__main__":
while True:
url = get_unvisited_url()
if url == None:
break

print("\n\nGET " + url)
# 抓取网页内容
response = requests.get(url)
content = response.content.decode("utf-8")
#print(content)
# 提取页面包含的数据
soup = BeautifulSoup(content, "html.parser")
get_web_data(soup)

# 获取页面包含的链接,并加入未访问的队列
for element in soup.select("a[href]"):
new_url = element["href"].strip()
if re.match("^https://book.douban.com/subject/[0-9]+/$", new_url) == None:
continue
unvisited_urls.append(new_url)
time.sleep(1)
  总结
  在本节中,我们将详细介绍如何提取网页数据。 BeautifulSoup 有许多其他 API 来访问 html 内容。详情请参考 BeautifulSoup 文档。下一部分,我们将如何存储爬虫运行数据和捕获的各种数据。
  来源:/i65523560/

python网页数据抓取( Python网络爬虫内容提取器一文项目启动说明(一))

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

  python网页数据抓取(
Python网络爬虫内容提取器一文项目启动说明(一))
  
  一,。导言
  在PythonWebCrawler内容提取器文章中,我们详细解释了核心组件:可插入内容提取器类gsextractor。本文记录了在确定GSR萃取器工艺路线过程中的程序设计实验。这是第一部分。实验使用XSLT一次性提取静态网页内容并将其转换为XML格式
  二,。使用lxml库提取网页内容
  Lxml是python的一个库,它可以快速灵活地处理XML。它支持XML路径语言(XPath)和可扩展样式表语言转换(XSLT),并实现公共元素树API
  在这两天里,我测试了如何在Python中通过XSLT提取网页内容。有关纪录如下:
  2.1,抓住目标
  假设您要提取jisoke官网上旧论坛的帖子标题和回复号,如下图所示,您需要提取整个列表并以XML格式保存
  
  2.2,源代码1:只抓取当前页面,结果显示在控制台上
  Python的优点是它可以用少量代码解决问题。请注意,下面的代码看起来很长。事实上,Python函数调用很少,XSLT脚本占用了很大的空间。在这段代码中,它只是一个长字符串。关于为什么选择XSLT而不是离散XPath或抓头正则表达式,请参阅根据python实时web爬虫项目启动说明,我们希望通过此架构节省程序员一半以上的时间
  您可以复制并运行以下代码(在Windows 10中,python3.2)通过下一次测试:
  from urllib import request
from lxml import etree
url="http://www.gooseeker.com/cn/forum/7"
conn = request.urlopen(url)
doc = etree.HTML(conn.read())
xslt_root = etree.XML("""\
""")
transform = etree.XSLT(xslt_root)
result_tree = transform(doc)
print(result_tree)
  2.3,获取结果
  抓取结果如下图所示:
  
  2.4,源代码2:页面爬网并将结果存储在文件中
  我们是对的2.2对代码进行了进一步修改,增加了翻页、抓取和保存结果文件的功能。代码如下:
  from urllib import request
from lxml import etree
import time
xslt_root = etree.XML("""\
""")
baseurl = "http://www.gooseeker.com/cn/forum/7"
basefilebegin = "jsk_bbs_"
basefileend = ".xml"
count = 1
while (count < 12):
url = baseurl + "?page=" + str(count)
conn = request.urlopen(url)
doc = etree.HTML(conn.read())
transform = etree.XSLT(xslt_root)
result_tree = transform(doc)
print(str(result_tree))
file_obj = open(basefilebegin+str(count)+basefileend,'w',encoding='UTF-8')
file_obj.write(str(result_tree))
file_obj.close()
count += 1
time.sleep(2)
  我们添加了用于编写文件的代码和一个循环来构造每个翻页的web地址。但是,如果网页地址在翻页过程中保持不变怎么办?事实上,这就是动态web内容,将在下面讨论
  三,。总结
  这是开源Python通用爬虫项目的验证过程。在爬虫框架中,其他部分很容易变得通用,也就是说,提取web内容并将其转换为结构的操作很难通用,我们称之为提取器。然而,借助gooseeker视觉提取规则生成器MS,提取程序的生成过程将变得非常方便,可以使用标准化的插入,从而实现通用的爬虫程序。在文章的后续文章中,我们将具体解释MS和python之间合作的具体方法
  四,。下次阅读
  本文介绍的方法通常用于捕获静态web页面的内容,即所谓HTML文档中的内容。目前,许多网站内容是通过JavaScript动态生成的。一开始,HTML没有这些内容。如果通过后加载添加,则需要采用动态技术。请阅读Python crawler使用selenium+phantom JS获取Ajax和动态HTML内容
  五,。Jisoke gooseeker开源代码下载源代码
  1.GooSeeker开源Python web爬虫GitHub源代码
  六,。文档修改历史记录
  2016-05-26:V2.0,新增文字说明;添加了帖子的代码
  2016-05-29:V2.1. 添加上一章的源代码下载源代码 查看全部

  python网页数据抓取(
Python网络爬虫内容提取器一文项目启动说明(一))
  
  一,。导言
  在PythonWebCrawler内容提取器文章中,我们详细解释了核心组件:可插入内容提取器类gsextractor。本文记录了在确定GSR萃取器工艺路线过程中的程序设计实验。这是第一部分。实验使用XSLT一次性提取静态网页内容并将其转换为XML格式
  二,。使用lxml库提取网页内容
  Lxml是python的一个库,它可以快速灵活地处理XML。它支持XML路径语言(XPath)和可扩展样式表语言转换(XSLT),并实现公共元素树API
  在这两天里,我测试了如何在Python中通过XSLT提取网页内容。有关纪录如下:
  2.1,抓住目标
  假设您要提取jisoke官网上旧论坛的帖子标题和回复号,如下图所示,您需要提取整个列表并以XML格式保存
  
  2.2,源代码1:只抓取当前页面,结果显示在控制台上
  Python的优点是它可以用少量代码解决问题。请注意,下面的代码看起来很长。事实上,Python函数调用很少,XSLT脚本占用了很大的空间。在这段代码中,它只是一个长字符串。关于为什么选择XSLT而不是离散XPath或抓头正则表达式,请参阅根据python实时web爬虫项目启动说明,我们希望通过此架构节省程序员一半以上的时间
  您可以复制并运行以下代码(在Windows 10中,python3.2)通过下一次测试:
  from urllib import request
from lxml import etree
url="http://www.gooseeker.com/cn/forum/7"
conn = request.urlopen(url)
doc = etree.HTML(conn.read())
xslt_root = etree.XML("""\
""")
transform = etree.XSLT(xslt_root)
result_tree = transform(doc)
print(result_tree)
  2.3,获取结果
  抓取结果如下图所示:
  
  2.4,源代码2:页面爬网并将结果存储在文件中
  我们是对的2.2对代码进行了进一步修改,增加了翻页、抓取和保存结果文件的功能。代码如下:
  from urllib import request
from lxml import etree
import time
xslt_root = etree.XML("""\
""")
baseurl = "http://www.gooseeker.com/cn/forum/7"
basefilebegin = "jsk_bbs_"
basefileend = ".xml"
count = 1
while (count < 12):
url = baseurl + "?page=" + str(count)
conn = request.urlopen(url)
doc = etree.HTML(conn.read())
transform = etree.XSLT(xslt_root)
result_tree = transform(doc)
print(str(result_tree))
file_obj = open(basefilebegin+str(count)+basefileend,'w',encoding='UTF-8')
file_obj.write(str(result_tree))
file_obj.close()
count += 1
time.sleep(2)
  我们添加了用于编写文件的代码和一个循环来构造每个翻页的web地址。但是,如果网页地址在翻页过程中保持不变怎么办?事实上,这就是动态web内容,将在下面讨论
  三,。总结
  这是开源Python通用爬虫项目的验证过程。在爬虫框架中,其他部分很容易变得通用,也就是说,提取web内容并将其转换为结构的操作很难通用,我们称之为提取器。然而,借助gooseeker视觉提取规则生成器MS,提取程序的生成过程将变得非常方便,可以使用标准化的插入,从而实现通用的爬虫程序。在文章的后续文章中,我们将具体解释MS和python之间合作的具体方法
  四,。下次阅读
  本文介绍的方法通常用于捕获静态web页面的内容,即所谓HTML文档中的内容。目前,许多网站内容是通过JavaScript动态生成的。一开始,HTML没有这些内容。如果通过后加载添加,则需要采用动态技术。请阅读Python crawler使用selenium+phantom JS获取Ajax和动态HTML内容
  五,。Jisoke gooseeker开源代码下载源代码
  1.GooSeeker开源Python web爬虫GitHub源代码
  六,。文档修改历史记录
  2016-05-26:V2.0,新增文字说明;添加了帖子的代码
  2016-05-29:V2.1. 添加上一章的源代码下载源代码

python网页数据抓取(Python精品电子书籍与50G+优质视频学习资料~)

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

  python网页数据抓取(Python精品电子书籍与50G+优质视频学习资料~)
  关注官方账号:小张Python,为您准备了50+Python高质量电子书和50G+高质量视频学习资料。后台回复关键词:可获取1024个;如果您对博客内容有任何疑问,请在后台添加作者【个人微信】,您可以直接与作者沟通
  你好,我在调零~
  今天,我们来谈谈如何使用Python抓取京东产品。数据包括产品名称、价格和其他信息
  
  此爬虫程序使用的核心库是selenium+pyquery。Selenium用于驱动浏览器模拟网页访问,pyquery用于解析网页信息以进行数据提取。让我们先看看最后的效果
  
  脚本启动后,selenium将自动打开JD网页,翻页产品页面信息,并在浏览器翻页时控制后台返回提取的数据
  在介绍主程序之前,这里是selenium包
  硒装置
  Selenium主要用作web应用程序的测试工具。它可以操纵浏览器完成一系列步骤,模拟人工操作;例如,在web上自动填写文本和查询快递订单号没有问题。目前,它支持Java、python、c#、ruby等语言
  
  在进行网页爬网时,某些网页的数据是用Ajax呈现的,例如微博。标题没有进入下一页,通过刷新页面实现翻页效果;这种网页数据不是直接放在HTML中,而是由用户操作触发,触发嵌入HTML中的JS命令,从而调用存储在JSON文件中的数据并最终呈现
  对于此类网页采集,有两个基本思路:
  因此,selenium工具可以有效地抑制网页上的一些反爬行措施
  当Python使用selenium时,它可以使用封装的selenium库。在安装过程中,可以使用PIP命令完成
  pip install selenium
  目前,selenium支持chrome和Firefox。最好选择chrome,因为互联网上有更多关于chrome的文档
  但是,在使用之前,除了确保安装了Chrome浏览器外,还需要确保还安装了chromedriver.exe工具(selenium的核心是webdriver,chromedriver.exe是Chrome的webdriver工具)
  chromedriver的版本需要与Chrome浏览器的版本相对应。你可以在本地下载
  
  下载地址如下:
  二,。爬虫逻辑
  要使用selenium捕获JD数据以模拟人工操作,必须依次执行以下步骤(这里以捕获Python书籍商品为例):
  
  首先,您需要初始化并创建webdriver的Chrome浏览器和数据存储文件(这里我使用TXT文件)
  def __init__(self,item_name,txt_path):
url = &#39;https://www.jd.com/&#39; # 登录网址
self.url = url
self.item_name = item_name
self.txt_file = open(txt_path,encoding=&#39;utf-8&#39;,mode=&#39;w+&#39;)
options = webdriver.ChromeOptions() # 谷歌选项
# 设置为开发者模式,避免被识别
options.add_experimental_option(&#39;excludeSwitches&#39;,
[&#39;enable-automation&#39;])
self.browser = webdriver.Chrome(executable_path= "C:/Program Files/Google/Chrome/Application/chromedriver.exe",
options = options)
self.wait = WebDriverWait(self.browser,2)
  网络驱动程序。Chrome()方法用于创建受驱动浏览器Chrome,并将路径分配给先前下载到可执行路径参数的本地chromedriver.exe文件夹
  当浏览器打开网页时,由于网络速度,可能会出现加载缓慢的问题。因此,webdriverwait方法用于创建等待方法。浏览器需要等待2秒钟才能执行下一个操作
  初始化操作完成后,主程序进行模拟访问、输入、点击等操作;我将所有这些操作封装到run()函数中
   def run(self):
"""登陆接口"""
self.browser.get(self.url)

input_edit = self.browser.find_element(By.CSS_SELECTOR,&#39;#key&#39;)
input_edit.clear()
input_edit.send_keys(self.item_name)
search_button = self.browser.find_element(By.CSS_SELECTOR,&#39;#search > div > div.form > button&#39;)
search_button.click()# 点击
time.sleep(2)
html = self.browser.page_source # 获取 html
self.parse_html(html)
current_url = self.browser.current_url # 获取当前页面 url
initial_url = str(current_url).split(&#39;&pvid&#39;)[0]
for i in range(1,100):
try:
print(&#39;正在解析----------------{}图片&#39;.format(str(i)))
next_page_url = initial_url + &#39;&page={}&s={}&click=0&#39;.format(str(i*2+1),str(i*60+1))
print(next_page_url)
self.browser.get(next_page_url)
self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,&#39;#J_goodsList > ul > li&#39;)))
html = self.browser.page_source
self.parse_html(html)# 对 html 网址进行解析
time.sleep(2) # 设置频率
except Exception as e:
print(&#39;Error Next page&#39;,e)
self.txt_file.close()# 关闭 txt 文件
  首先,使用get()方法访问JD主页,然后在页面编辑、搜索按钮中找到搜索栏和搜索按钮标签输入;完成输入并单击操作
  对于网页元素标记定位,如果没有,可以使用浏览器开发人员模式将其分为以下步骤(以css_选择器为例):
  在翻页操作过程中,根据京东的URL法则进行构建
  第5页
  https://search.jd.com/Search%3 ... k%3D0
  第6页
  https://search.jd.com/Search%3 ... k%3D0
  如果仔细检查,您会发现第5页和第6页上的URL之间的唯一区别是两个参数page和S
  根据这一规则,京东商品信息的前100页是通过改变页面和S参数来构建的,以完成数据捕获
  对于数据提取部分,我使用parse_uhtml函数
  
  为了提高程序的友好性,我将所有函数封装到一个类中。用户只需输入两个参数,一个是所需的采集商品名称,另一个是存储文件路径;可以完成数据爬网
  
  最后,将抓取的数据存储在TXT文件中,结果如下
  
  四,。总结
  尽管selenium已经有效地破解了web端的一些反爬行机制,但对于某些网站应用程序(如pull hook)来说,它是无用的。当您使用selenium驱动浏览器模拟pull hook官方网站上的翻页操作时,网站可以识别非人工操作、阻止IP并发出警告
  本文涉及的完整源代码文章请关注微信公众号:小张python,后台回复关键词:京东商品即可获得 查看全部

  python网页数据抓取(Python精品电子书籍与50G+优质视频学习资料~)
  关注官方账号:小张Python,为您准备了50+Python高质量电子书和50G+高质量视频学习资料。后台回复关键词:可获取1024个;如果您对博客内容有任何疑问,请在后台添加作者【个人微信】,您可以直接与作者沟通
  你好,我在调零~
  今天,我们来谈谈如何使用Python抓取京东产品。数据包括产品名称、价格和其他信息
  
  此爬虫程序使用的核心库是selenium+pyquery。Selenium用于驱动浏览器模拟网页访问,pyquery用于解析网页信息以进行数据提取。让我们先看看最后的效果
  
  脚本启动后,selenium将自动打开JD网页,翻页产品页面信息,并在浏览器翻页时控制后台返回提取的数据
  在介绍主程序之前,这里是selenium包
  硒装置
  Selenium主要用作web应用程序的测试工具。它可以操纵浏览器完成一系列步骤,模拟人工操作;例如,在web上自动填写文本和查询快递订单号没有问题。目前,它支持Java、python、c#、ruby等语言
  
  在进行网页爬网时,某些网页的数据是用Ajax呈现的,例如微博。标题没有进入下一页,通过刷新页面实现翻页效果;这种网页数据不是直接放在HTML中,而是由用户操作触发,触发嵌入HTML中的JS命令,从而调用存储在JSON文件中的数据并最终呈现
  对于此类网页采集,有两个基本思路:
  因此,selenium工具可以有效地抑制网页上的一些反爬行措施
  当Python使用selenium时,它可以使用封装的selenium库。在安装过程中,可以使用PIP命令完成
  pip install selenium
  目前,selenium支持chrome和Firefox。最好选择chrome,因为互联网上有更多关于chrome的文档
  但是,在使用之前,除了确保安装了Chrome浏览器外,还需要确保还安装了chromedriver.exe工具(selenium的核心是webdriver,chromedriver.exe是Chrome的webdriver工具)
  chromedriver的版本需要与Chrome浏览器的版本相对应。你可以在本地下载
  
  下载地址如下:
  二,。爬虫逻辑
  要使用selenium捕获JD数据以模拟人工操作,必须依次执行以下步骤(这里以捕获Python书籍商品为例):
  
  首先,您需要初始化并创建webdriver的Chrome浏览器和数据存储文件(这里我使用TXT文件)
  def __init__(self,item_name,txt_path):
url = &#39;https://www.jd.com/&#39; # 登录网址
self.url = url
self.item_name = item_name
self.txt_file = open(txt_path,encoding=&#39;utf-8&#39;,mode=&#39;w+&#39;)
options = webdriver.ChromeOptions() # 谷歌选项
# 设置为开发者模式,避免被识别
options.add_experimental_option(&#39;excludeSwitches&#39;,
[&#39;enable-automation&#39;])
self.browser = webdriver.Chrome(executable_path= "C:/Program Files/Google/Chrome/Application/chromedriver.exe",
options = options)
self.wait = WebDriverWait(self.browser,2)
  网络驱动程序。Chrome()方法用于创建受驱动浏览器Chrome,并将路径分配给先前下载到可执行路径参数的本地chromedriver.exe文件夹
  当浏览器打开网页时,由于网络速度,可能会出现加载缓慢的问题。因此,webdriverwait方法用于创建等待方法。浏览器需要等待2秒钟才能执行下一个操作
  初始化操作完成后,主程序进行模拟访问、输入、点击等操作;我将所有这些操作封装到run()函数中
   def run(self):
"""登陆接口"""
self.browser.get(self.url)

input_edit = self.browser.find_element(By.CSS_SELECTOR,&#39;#key&#39;)
input_edit.clear()
input_edit.send_keys(self.item_name)
search_button = self.browser.find_element(By.CSS_SELECTOR,&#39;#search > div > div.form > button&#39;)
search_button.click()# 点击
time.sleep(2)
html = self.browser.page_source # 获取 html
self.parse_html(html)
current_url = self.browser.current_url # 获取当前页面 url
initial_url = str(current_url).split(&#39;&pvid&#39;)[0]
for i in range(1,100):
try:
print(&#39;正在解析----------------{}图片&#39;.format(str(i)))
next_page_url = initial_url + &#39;&page={}&s={}&click=0&#39;.format(str(i*2+1),str(i*60+1))
print(next_page_url)
self.browser.get(next_page_url)
self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,&#39;#J_goodsList > ul > li&#39;)))
html = self.browser.page_source
self.parse_html(html)# 对 html 网址进行解析
time.sleep(2) # 设置频率
except Exception as e:
print(&#39;Error Next page&#39;,e)
self.txt_file.close()# 关闭 txt 文件
  首先,使用get()方法访问JD主页,然后在页面编辑、搜索按钮中找到搜索栏和搜索按钮标签输入;完成输入并单击操作
  对于网页元素标记定位,如果没有,可以使用浏览器开发人员模式将其分为以下步骤(以css_选择器为例):
  在翻页操作过程中,根据京东的URL法则进行构建
  第5页
  https://search.jd.com/Search%3 ... k%3D0
  第6页
  https://search.jd.com/Search%3 ... k%3D0
  如果仔细检查,您会发现第5页和第6页上的URL之间的唯一区别是两个参数page和S
  根据这一规则,京东商品信息的前100页是通过改变页面和S参数来构建的,以完成数据捕获
  对于数据提取部分,我使用parse_uhtml函数
  
  为了提高程序的友好性,我将所有函数封装到一个类中。用户只需输入两个参数,一个是所需的采集商品名称,另一个是存储文件路径;可以完成数据爬网
  
  最后,将抓取的数据存储在TXT文件中,结果如下
  
  四,。总结
  尽管selenium已经有效地破解了web端的一些反爬行机制,但对于某些网站应用程序(如pull hook)来说,它是无用的。当您使用selenium驱动浏览器模拟pull hook官方网站上的翻页操作时,网站可以识别非人工操作、阻止IP并发出警告
  本文涉及的完整源代码文章请关注微信公众号:小张python,后台回复关键词:京东商品即可获得

python网页数据抓取( ,涉及Python时间函数及正则匹配的相关操作技巧)

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

  python网页数据抓取(
,涉及Python时间函数及正则匹配的相关操作技巧)
  Python实现周期性抓取网页内容的方法
  更新时间:2015-11-04 15:22:07 作者:intergret
  这个文章主要介绍了Python中定时抓取网页内容的方法,涉及到Python时间函数和正则匹配的相关操作技巧。有一定的参考价值,有需要的朋友可以参考以下
  本文介绍了 Python 如何实现定期抓取网页内容的示例。分享给大家,供大家参考,如下:
  1.使用sched模块定期执行指定的函数
  2.在指定函数的周期性执行中抓取指定网页,解析出想要的网页内容,代码为六味论坛在线人数
  用于统计论坛在线人数的代码:
<p>
#coding=utf-8
import time,sched,os,urllib2,re,string
#初始化sched模块的scheduler类
#第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞。
s = sched.scheduler(time.time,time.sleep)
#被周期性调度触发的函数
def event_func():
req = urllib2.Request('http://bt.neu6.edu.cn/')
response = urllib2.urlopen(req)
rawdata = response.read()
response.close()
usernump = re.compile(r'总计 .*? 人在线')
usernummatch = usernump.findall(rawdata)
if usernummatch:
currentnum=usernummatch[0]
currentnum=currentnum[string.index(currentnum,'>')+1:string.rindex(currentnum,' 查看全部

  python网页数据抓取(
,涉及Python时间函数及正则匹配的相关操作技巧)
  Python实现周期性抓取网页内容的方法
  更新时间:2015-11-04 15:22:07 作者:intergret
  这个文章主要介绍了Python中定时抓取网页内容的方法,涉及到Python时间函数和正则匹配的相关操作技巧。有一定的参考价值,有需要的朋友可以参考以下
  本文介绍了 Python 如何实现定期抓取网页内容的示例。分享给大家,供大家参考,如下:
  1.使用sched模块定期执行指定的函数
  2.在指定函数的周期性执行中抓取指定网页,解析出想要的网页内容,代码为六味论坛在线人数
  用于统计论坛在线人数的代码:
<p>
#coding=utf-8
import time,sched,os,urllib2,re,string
#初始化sched模块的scheduler类
#第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞。
s = sched.scheduler(time.time,time.sleep)
#被周期性调度触发的函数
def event_func():
req = urllib2.Request('http://bt.neu6.edu.cn/')
response = urllib2.urlopen(req)
rawdata = response.read()
response.close()
usernump = re.compile(r'总计 .*? 人在线')
usernummatch = usernump.findall(rawdata)
if usernummatch:
currentnum=usernummatch[0]
currentnum=currentnum[string.index(currentnum,'>')+1:string.rindex(currentnum,'

python网页数据抓取(1.使用urllib.request获取网页使用Python爬取网页数据 )

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

  python网页数据抓取(1.使用urllib.request获取网页使用Python爬取网页数据
)
  过去当你需要一些网页的信息时,用Python写一个爬虫来爬取非常方便。
  转载:
  1. 使用 urllib.request 获取网页 使用 Python 抓取网页数据1. 使用 urllib.request 获取网页
  urllib 是 Python 中的内置 HTTP 库。使用 urllib 可以通过非常简单的步骤高效采集数据;配合Beautiful等HTML解析库,可以为采集网络数据编写大型爬虫;
  注:示例代码是用Python3编写的; urllib 是 Python2 中 urllib 和 urllib2 的组合,Python2 中的 urllib2 对应于 Python3 中的 urllib.request。
  简单例子:
  import urllib.request # 引入urllib.request
response = urllib.request.urlopen(&#39;http://www.zhihu.com&#39;) # 打开URL
html = response.read() # 读取内容
html = html.decode(&#39;utf-8&#39;) # 解码
print(html)
  2.伪造的请求头信息
  有时候爬虫发起的请求会被服务器拒绝。这时候就需要将爬虫伪装成人类用户的浏览器。这通常是通过伪造请求头信息来实现的,例如:
  import urllib.request
head = {}
head[&#39;User-Agent&#39;]=&#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.0..&#39;
req = urllib.request.Request(url,head) # 伪造请求头
response = urllib.request.urlopen(req)
html = response.read().decode(&#39;utf-8&#39;)
print(html)
  3.伪造的请求体
  爬取一些网站时,需要POST数据到服务器,然后需要伪造请求体;
  为了实现有道词典的在线翻译脚本,在Chrome中打开开发工具,在Network下找到方法为POST的请求。观察数据,可以发现请求体中的'i'是需要翻译的URL编码内容。因此,可以伪造请求体,例如:
  import urllib.request
import urllib.parse
import json
while True:
content = input(&#39;请输入要翻译的内容:&#39;)
if content == &#39;exit!&#39;:
break
url=&#39;http://fanyi.youdao.com/transl ... 39%3B
# 请求主体
data = {}
data[&#39;type&#39;] = "AUTO"
data[&#39;i&#39;] = content
data[&#39;doctype&#39;] = "json"
data[&#39;xmlVersion&#39;] = "1.8"
data[&#39;keyfrom&#39;] = "fanyi.web"
data[&#39;ue&#39;] = "UTF-8"
data[&#39;action&#39;] = "FY_BY_CLICKBUTTON"
data[&#39;typoResult&#39;] = "true"
data = urllib.parse.urlencode(data).encode(&#39;utf-8&#39;)
head = {}
head[&#39;User-Agent&#39;] = &#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.0&#39;
req = urllib.request.Request(url,data,head) # 伪造请求头和请求主体
response = urllib.request.urlopen(req)
html = response.read().decode(&#39;utf-8&#39;)
target = json.loads(html)
print(&#39;翻译结果: &#39;,(target[&#39;translateResult&#39;][0][0][&#39;tgt&#39;]))
  也可以使用add_header()方法来伪造请求头,比如:
  import urllib.request
import urllib.parse
import json
while True:
content = input(&#39;请输入要翻译的内容(exit!):&#39;)
if content == &#39;exit!&#39;:
break
url = &#39;http://fanyi.youdao.com/transl ... 39%3B
# 请求主体
data = {}
data[&#39;type&#39;] = "AUTO"
data[&#39;i&#39;] = content
data[&#39;doctype&#39;] = "json"
data[&#39;xmlVersion&#39;] = "1.8"
data[&#39;keyfrom&#39;] = "fanyi.web"
data[&#39;ue&#39;] = "UTF-8"
data[&#39;action&#39;] = "FY_BY_CLICKBUTTON"
data[&#39;typoResult&#39;] = "true"
data = urllib.parse.urlencode(data).encode(&#39;utf-8&#39;)
req = urllib.request.Request(url,data)
req.add_header(&#39;User-Agent&#39;,&#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.0&#39;)
response = urllib.request.urlopen(req)
html=response.read().decode(&#39;utf-8&#39;)
target = json.loads(html)
print(&#39;翻译结果: &#39;,(target[&#39;translateResult&#39;][0][0][&#39;tgt&#39;]))
  4.使用代理IP
  为了避免采集爬虫过于频繁导致的IP阻塞问题,可以使用代理IP,如:
  # 参数是一个字典{&#39;类型&#39;:&#39;代理ip:端口号&#39;}
proxy_support = urllib.request.ProxyHandler({&#39;type&#39;: &#39;ip:port&#39;})
# 定制一个opener
opener = urllib.request.build_opener(proxy_support)
# 安装opener
urllib.request.install_opener(opener)
#调用opener
opener.open(url)
  注意:使用爬虫过于频繁地访问目标站点会占用大量服务器资源。大型分布式爬虫可以爬取某个站点甚至对该站点发起DDOS攻击;因此,应该合理使用爬虫来抓取数据 安排抓取频率和时间;如:在服务器相对空闲的时间(如:清晨)爬取,完成一个爬取任务后暂停一段时间等;
  5.检查网页的编码方式
  虽然大部分网页都采用UTF-8编码,但有时您会遇到使用其他编码方式的网页,因此您必须了解网页的编码方式才能正确解码抓取到的页面;
  chardet是python的第三方模块,使用chardet可以自动检测网页的编码;
  安装chardet:pip install charest
  使用:
  import chardet
url = &#39;http://www,baidu.com&#39;
html = urllib.request.urlopen(url).read()
>>> chardet.detect(html)
{&#39;confidence&#39;: 0.99, &#39;encoding&#39;: &#39;utf-8&#39;}
  6.获取跳转链接
  有时网页的某个页面需要在原创URL的基础上进行一次甚至多次重定向才能最终到达目的页面,因此需要正确处理重定向;
  通过requests模块的head()函数获取跳转链接的URL,如
  url=&#39;https://unsplash.com/photos/B1 ... 39%3B
res = requests.head(url)
re=res.headers[&#39;Location&#39;] 查看全部

  python网页数据抓取(1.使用urllib.request获取网页使用Python爬取网页数据
)
  过去当你需要一些网页的信息时,用Python写一个爬虫来爬取非常方便。
  转载:
  1. 使用 urllib.request 获取网页 使用 Python 抓取网页数据1. 使用 urllib.request 获取网页
  urllib 是 Python 中的内置 HTTP 库。使用 urllib 可以通过非常简单的步骤高效采集数据;配合Beautiful等HTML解析库,可以为采集网络数据编写大型爬虫;
  注:示例代码是用Python3编写的; urllib 是 Python2 中 urllib 和 urllib2 的组合,Python2 中的 urllib2 对应于 Python3 中的 urllib.request。
  简单例子:
  import urllib.request # 引入urllib.request
response = urllib.request.urlopen(&#39;http://www.zhihu.com&#39;) # 打开URL
html = response.read() # 读取内容
html = html.decode(&#39;utf-8&#39;) # 解码
print(html)
  2.伪造的请求头信息
  有时候爬虫发起的请求会被服务器拒绝。这时候就需要将爬虫伪装成人类用户的浏览器。这通常是通过伪造请求头信息来实现的,例如:
  import urllib.request
head = {}
head[&#39;User-Agent&#39;]=&#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.0..&#39;
req = urllib.request.Request(url,head) # 伪造请求头
response = urllib.request.urlopen(req)
html = response.read().decode(&#39;utf-8&#39;)
print(html)
  3.伪造的请求体
  爬取一些网站时,需要POST数据到服务器,然后需要伪造请求体;
  为了实现有道词典的在线翻译脚本,在Chrome中打开开发工具,在Network下找到方法为POST的请求。观察数据,可以发现请求体中的'i'是需要翻译的URL编码内容。因此,可以伪造请求体,例如:
  import urllib.request
import urllib.parse
import json
while True:
content = input(&#39;请输入要翻译的内容:&#39;)
if content == &#39;exit!&#39;:
break
url=&#39;http://fanyi.youdao.com/transl ... 39%3B
# 请求主体
data = {}
data[&#39;type&#39;] = "AUTO"
data[&#39;i&#39;] = content
data[&#39;doctype&#39;] = "json"
data[&#39;xmlVersion&#39;] = "1.8"
data[&#39;keyfrom&#39;] = "fanyi.web"
data[&#39;ue&#39;] = "UTF-8"
data[&#39;action&#39;] = "FY_BY_CLICKBUTTON"
data[&#39;typoResult&#39;] = "true"
data = urllib.parse.urlencode(data).encode(&#39;utf-8&#39;)
head = {}
head[&#39;User-Agent&#39;] = &#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.0&#39;
req = urllib.request.Request(url,data,head) # 伪造请求头和请求主体
response = urllib.request.urlopen(req)
html = response.read().decode(&#39;utf-8&#39;)
target = json.loads(html)
print(&#39;翻译结果: &#39;,(target[&#39;translateResult&#39;][0][0][&#39;tgt&#39;]))
  也可以使用add_header()方法来伪造请求头,比如:
  import urllib.request
import urllib.parse
import json
while True:
content = input(&#39;请输入要翻译的内容(exit!):&#39;)
if content == &#39;exit!&#39;:
break
url = &#39;http://fanyi.youdao.com/transl ... 39%3B
# 请求主体
data = {}
data[&#39;type&#39;] = "AUTO"
data[&#39;i&#39;] = content
data[&#39;doctype&#39;] = "json"
data[&#39;xmlVersion&#39;] = "1.8"
data[&#39;keyfrom&#39;] = "fanyi.web"
data[&#39;ue&#39;] = "UTF-8"
data[&#39;action&#39;] = "FY_BY_CLICKBUTTON"
data[&#39;typoResult&#39;] = "true"
data = urllib.parse.urlencode(data).encode(&#39;utf-8&#39;)
req = urllib.request.Request(url,data)
req.add_header(&#39;User-Agent&#39;,&#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.0&#39;)
response = urllib.request.urlopen(req)
html=response.read().decode(&#39;utf-8&#39;)
target = json.loads(html)
print(&#39;翻译结果: &#39;,(target[&#39;translateResult&#39;][0][0][&#39;tgt&#39;]))
  4.使用代理IP
  为了避免采集爬虫过于频繁导致的IP阻塞问题,可以使用代理IP,如:
  # 参数是一个字典{&#39;类型&#39;:&#39;代理ip:端口号&#39;}
proxy_support = urllib.request.ProxyHandler({&#39;type&#39;: &#39;ip:port&#39;})
# 定制一个opener
opener = urllib.request.build_opener(proxy_support)
# 安装opener
urllib.request.install_opener(opener)
#调用opener
opener.open(url)
  注意:使用爬虫过于频繁地访问目标站点会占用大量服务器资源。大型分布式爬虫可以爬取某个站点甚至对该站点发起DDOS攻击;因此,应该合理使用爬虫来抓取数据 安排抓取频率和时间;如:在服务器相对空闲的时间(如:清晨)爬取,完成一个爬取任务后暂停一段时间等;
  5.检查网页的编码方式
  虽然大部分网页都采用UTF-8编码,但有时您会遇到使用其他编码方式的网页,因此您必须了解网页的编码方式才能正确解码抓取到的页面;
  chardet是python的第三方模块,使用chardet可以自动检测网页的编码;
  安装chardet:pip install charest
  使用:
  import chardet
url = &#39;http://www,baidu.com&#39;
html = urllib.request.urlopen(url).read()
>>> chardet.detect(html)
{&#39;confidence&#39;: 0.99, &#39;encoding&#39;: &#39;utf-8&#39;}
  6.获取跳转链接
  有时网页的某个页面需要在原创URL的基础上进行一次甚至多次重定向才能最终到达目的页面,因此需要正确处理重定向;
  通过requests模块的head()函数获取跳转链接的URL,如
  url=&#39;https://unsplash.com/photos/B1 ... 39%3B
res = requests.head(url)
re=res.headers[&#39;Location&#39;]

python网页数据抓取(Python之旅功能的实现与优势编程技巧)

网站优化优采云 发表了文章 • 0 个评论 • 135 次浏览 • 2021-09-14 11:17 • 来自相关话题

  python网页数据抓取(Python之旅功能的实现与优势编程技巧)
  注:网站已改,但无后续,代码需自行调整。
  本文首发于Trial Research,内容略有不同。
  引用:
  我曾经听过一位理科学生谈论他同事的轶事。这位同事会写一个小程序,解决需要5秒以上,不需要动脑的事情。不用说,即使在讨论项目的工作组中,工作电子邮件也会自动处理。检测到有人在说话,内容与你的工作有关,或者有人@了自己等,连接句库自动回复。
  我听了很羡慕。如果我们司法人员也能有一些编程技巧,那会节省很多时间。例如,您可以通过将填写办案系统和提取证据等事情交给计算机来节省时间并减少错误。也节省了分析证据和法律关系的时间。
  怀着对程序员的羡慕,再加上各种巧合,我开始了自己的Python之旅。现在我对编程的好处有了一点体会。例如,我们在工作中要查询很多法律文件和文件。如果只有一两份,我们可以直接在网页上下载,但是如果有很多份要操作,会很不方便。爬虫功能可以很方便的为我们实现这个需求,还可以顺便删除各种广告和不相关的内容。
  下面简单介绍一下爬虫功能的实现,以法律专业人士会接触到的裁判文书网为例。
  身体:
  一、准备工作
  开始之前,先简单介绍一下 Python 和一些基本问题。
  Python 是一种语法简单、模块众多的计算机语言。它可以轻松实现许多功能;您无需担心如何实现它。只需找到合适的模块并告诉它去做。它非常适合非程序员。开始吧。比如从网上抓取数据,如果你用另一种语言写一个程序,需要很多行,但如果你用Python,几行就可以解决问题。
  选择Python后,语言版本和模块有两个问题。在语言版本方面,主要有2.7和3两种。2.7的优点是历史悠久,可以使用的模块很多; 3的优点是是未来的发展方向,我们能用的大部分模块都已经支持3了,3支持中文好多了。因此,我个人建议直接使用3。当然,这些对我们外行来说都不是很重要。两者几乎相同。只需使用它们。不要卷入程序员之间的口水战。
  除此之外是模块问题。模块就像我们日常工作中的笔、墨、纸、砚等工具。它节省了我们自己“制作工具”的时间。这里推荐使用Anaconda。它就像普通的软件。你只需要在谷歌官网下载安装它,你的电脑就可以用Python编程了。我们可以使用的模块已经打包安装在一起,节省了我们寻找模块、安装模块以及处理模块之间兼容性的时间。可以说是一个工具。
  总结一下,准备就是一句话,搜索Anaconda,下载,安装,DONE!
  二、上手攀虫
  互联网就是网络,在互联网上搜索我们的程序就是爬虫。
  我们要做的判断文档网络比一般的网站要复杂一点,不能直接通过URL爬取。因此,我们首先了解两个问题。一是网上展示的文档内容发送到哪里,二是网站在将内容发送给我们之前必须满足什么条件。
  1. 追踪网页
  
  直接搜索“执行”这个词。这是我们在浏览器上可以看到的网址,但是不能直接抓取内容,所以需要使用软件网页进行跟踪。这个软件不需要安装,不管是IE还是Chrome,按F12都会弹出这个软件。我们以chrome为例。
  
  按F12后,右侧弹出软件界面。选择上面网络的主要项并刷新网页。浏览器和网站之间的所有交互内容都出现在下面的名称项中,我们想要的内容隐藏在里面。在此页面中,内容隐藏在带圆圈的 Listcontent 项下。
  我们选择Listcontent,从右边的header细节可以看出请求方法是POST,后面是真实的内容请求地址,后面是Request URL。
  接下来,我们来解决第二个问题。我们需要发送什么内容才能让这个 URL 返回我们需要的信息?同样在这个界面,我们继续向下滚动,可以看到Form Data的内容(如下图)。
  
  我们可以看到信息内容为:搜索条件“全文搜索:执行”,Index:1(第一页),Page:5(每页出现5个文档,最大值为20,我们可以程序中直接设置为20), order: 法院级别(按法院级别排序),最后一个参数是解码的,直接复制即可。也就是说,我们必须发送到网页的搜索需求是:全文收录“执行”这个词,如果有符合条件的人以这种格式向网页发送内容,就可以得到我们想要的信息。
  2.code
  在您知道消息的格式和发送位置之后,就可以编写代码了。接下来我们在刚才提到的Anaconda软件下打开Spyder。两者的关系就好比Anaconda是win系统,spyder是记事本。 Spyder 是负责编写代码的工具。
  
  出现如下界面。
  
  在左侧,我们可以开始编写自己的代码。在进入具体代码之前,给初学者多说一句。
  现在让我们开始供应主菜。以下代码的作用是在全文中搜索收录“execute”字样的案例,并提取时间、案例编号、案例名称放入excel表格中。
  #到"""之前这一段是打开spyder的界面就会自动添加的内容,一般不用去动。
#这一句是告诉电脑解码方式是UTF-8码,我们可以简单地理解为可以在代码里加中文,建议每次编程都加上。
# -*- coding: utf-8 -*-
#用(""" """)包起来的这一部分电脑也是忽略掉的,主要是给人看的部分,分别是代码首次编写时间和作者,属于可写可不写的部分。
"""
Created on Sun Jul 24 23:11:55 2016
@author: 检
"""
#这里是导入模块,以下模块分别用于抓取网页、数据处理保存、时间、正则表达式
import requests as req
import pandas as pd
import time
import re
#这是刚才我们通过F12查找到的网页
url=&#39;http://wenshu.court.gov.cn/Lis ... 39%3B
#这是页数、程序休息时间的定义和三个空的列表用来装筛选后的数据。
Index=1
SleepNum = 3
dates=[]
titles=[]
nums=[]
#循环模块,因为有很多页,当小于这个数时,不断地传数据,相当于点下一页的功能。最后一句的意思是每执行一次,index加1,就是翻到下一页。具体页数也可以用变量实现。
while Index < 123:
#这是请求头,伪装成浏览器访问网站,以免被网站屏蔽
my_headers={&#39;User-Agent&#39;:&#39;User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.95 Safari/537.36 Core/1.50.1280.400&#39;,}
#这一行就是我们搞定的搜索条件,可以按自己要求设置,比如:“法院名称:北京市人 民法院,案件类型:执行案件,裁判日期:2016-01-01 TO 2016-10-08”。
#如果实在不会设置,可以在文书网上搜索好,再通过F12查看到的内容复制粘贴到代码中&#39;Param&#39;:后即可。
data={&#39;Param&#39;:&#39;全文检索:执行&#39;, &#39;Index&#39;: Index,&#39;Page&#39;:&#39;20&#39;,&#39;Order&#39;:&#39;裁判日期&#39;,&#39;Direction&#39;:&#39;asc&#39;}
#将网址、请求头、搜索条件等数据上传并取得内容
r=req.post(url, headers=my_headers, data = data)
#用 json解码取得的网页内容
raw=r.json()
#用正则表达式将我们需要的内容提取出来,正则表达式真的很有用,要想真正用好westlaw等数据库,这一关也得过
#大意是定义筛选标准,把(“裁判日期”:)后,(&#39;)前的内容截取出来。
pattern1 = re.compile(&#39;"裁判日期":"(.*?)"&#39;, re.S)
date = re.findall(pattern1,raw)
pattern2 = re.compile(&#39;"案号":"(.*?)"&#39;, re.S)
num = re.findall(pattern2,raw)
pattern3 = re.compile(&#39;"案件名称":"(.*?)"&#39;, re.S)
title = re.findall(pattern3,raw)
#把筛选出的数据添加到开始的三个空列表里
dates+=date
titles+=title
nums+=num
#这一行是让程序休息,做事留点余地比较好。通过网页编码可知,文书网是有验证码功能的,如果你抓的太狠中招莫怪。
time.sleep(SleepNum)
Index += 1
#这里我们可以看到,从while开始到此,所有的代码都缩进了四个空格。这是因为要告诉电脑,这一段代码构成一个相对独立的组,当index小于123时,不断地从这个组第一句代码执行到最后一句代码,而不涉及到本文涉及的其他代码。
#这里代码又是顶格写。
#用pandas模块将筛选出的内容转成dataframe格式,并保存到Excel。
df=pd.DataFrame({&#39;时间&#39;:dates,&#39;案号&#39;:nums, &#39;案件名称&#39;:titles})
df.to_excel(&#39;C:\\result.xlsx&#39;)
  好了,工作结束,保存,点击软件界面上的绿色小三角或按F5运行,过一会,我们会发现C盘静静的躺着一个名为result的excel表,里面存储着我们想要的信息。以后我们不用打开编程软件Spyder,把代码保存在桌面,双击,它会根据设置的搜索条件自动找到相关的文档号,保存为excel,不用了登录响应。文档网络慢是不是很方便?
  如果只想要结果,直接粘贴到Spyder左边的框中,直接运行即可。 (但是如果你看完这篇文章想进一步了解编程,个人强烈不推荐这个。因为你自己没有输入很多细节,你不会注意到。比如刚才提到的while语句,按回车行前有个“:”,看代码很容易忽略。当然Spyder编程软件很聪明,会为我们完成,但是我们不能靠机器,对吧。 )
  其他补充:
  首先,编程的好处很多。可以提高我们的工作效率(就像上面的代码,运行2、3分钟,可以下载上千份法律文件);而且因为编程就像教一个什么都不知道怎么做事的孩子,有一个前提,没有明确的解释是做不到的,所以很合乎逻辑,可以反馈合法的工作。例如,在分析法律关系时,编程的思维方式可以帮助我们意识到我们忽略的隐含前提。
  其次,编程并不难。通过这种级别的编程,您不必考虑机器如何理解我在写的内容。这种问题更像是游戏的高级设置选项。大部分代码直接是英文单词,可以看成是写一篇英文论文。 我们的难处主要在于不舒服,这绝不是不可理解的。这个问题可以通过多输入几次代码来解决。
  最后,如果这个文章有幸引起你学习Python的兴趣,可以去这个网站学习基础知识,通俗易懂,而且每节都附有小练习,非常适合初学者(课后一定要练习,写出来就对了) 查看全部

  python网页数据抓取(Python之旅功能的实现与优势编程技巧)
  注:网站已改,但无后续,代码需自行调整。
  本文首发于Trial Research,内容略有不同。
  引用:
  我曾经听过一位理科学生谈论他同事的轶事。这位同事会写一个小程序,解决需要5秒以上,不需要动脑的事情。不用说,即使在讨论项目的工作组中,工作电子邮件也会自动处理。检测到有人在说话,内容与你的工作有关,或者有人@了自己等,连接句库自动回复。
  我听了很羡慕。如果我们司法人员也能有一些编程技巧,那会节省很多时间。例如,您可以通过将填写办案系统和提取证据等事情交给计算机来节省时间并减少错误。也节省了分析证据和法律关系的时间。
  怀着对程序员的羡慕,再加上各种巧合,我开始了自己的Python之旅。现在我对编程的好处有了一点体会。例如,我们在工作中要查询很多法律文件和文件。如果只有一两份,我们可以直接在网页上下载,但是如果有很多份要操作,会很不方便。爬虫功能可以很方便的为我们实现这个需求,还可以顺便删除各种广告和不相关的内容。
  下面简单介绍一下爬虫功能的实现,以法律专业人士会接触到的裁判文书网为例。
  身体:
  一、准备工作
  开始之前,先简单介绍一下 Python 和一些基本问题。
  Python 是一种语法简单、模块众多的计算机语言。它可以轻松实现许多功能;您无需担心如何实现它。只需找到合适的模块并告诉它去做。它非常适合非程序员。开始吧。比如从网上抓取数据,如果你用另一种语言写一个程序,需要很多行,但如果你用Python,几行就可以解决问题。
  选择Python后,语言版本和模块有两个问题。在语言版本方面,主要有2.7和3两种。2.7的优点是历史悠久,可以使用的模块很多; 3的优点是是未来的发展方向,我们能用的大部分模块都已经支持3了,3支持中文好多了。因此,我个人建议直接使用3。当然,这些对我们外行来说都不是很重要。两者几乎相同。只需使用它们。不要卷入程序员之间的口水战。
  除此之外是模块问题。模块就像我们日常工作中的笔、墨、纸、砚等工具。它节省了我们自己“制作工具”的时间。这里推荐使用Anaconda。它就像普通的软件。你只需要在谷歌官网下载安装它,你的电脑就可以用Python编程了。我们可以使用的模块已经打包安装在一起,节省了我们寻找模块、安装模块以及处理模块之间兼容性的时间。可以说是一个工具。
  总结一下,准备就是一句话,搜索Anaconda,下载,安装,DONE!
  二、上手攀虫
  互联网就是网络,在互联网上搜索我们的程序就是爬虫。
  我们要做的判断文档网络比一般的网站要复杂一点,不能直接通过URL爬取。因此,我们首先了解两个问题。一是网上展示的文档内容发送到哪里,二是网站在将内容发送给我们之前必须满足什么条件。
  1. 追踪网页
  
  直接搜索“执行”这个词。这是我们在浏览器上可以看到的网址,但是不能直接抓取内容,所以需要使用软件网页进行跟踪。这个软件不需要安装,不管是IE还是Chrome,按F12都会弹出这个软件。我们以chrome为例。
  
  按F12后,右侧弹出软件界面。选择上面网络的主要项并刷新网页。浏览器和网站之间的所有交互内容都出现在下面的名称项中,我们想要的内容隐藏在里面。在此页面中,内容隐藏在带圆圈的 Listcontent 项下。
  我们选择Listcontent,从右边的header细节可以看出请求方法是POST,后面是真实的内容请求地址,后面是Request URL。
  接下来,我们来解决第二个问题。我们需要发送什么内容才能让这个 URL 返回我们需要的信息?同样在这个界面,我们继续向下滚动,可以看到Form Data的内容(如下图)。
  
  我们可以看到信息内容为:搜索条件“全文搜索:执行”,Index:1(第一页),Page:5(每页出现5个文档,最大值为20,我们可以程序中直接设置为20), order: 法院级别(按法院级别排序),最后一个参数是解码的,直接复制即可。也就是说,我们必须发送到网页的搜索需求是:全文收录“执行”这个词,如果有符合条件的人以这种格式向网页发送内容,就可以得到我们想要的信息。
  2.code
  在您知道消息的格式和发送位置之后,就可以编写代码了。接下来我们在刚才提到的Anaconda软件下打开Spyder。两者的关系就好比Anaconda是win系统,spyder是记事本。 Spyder 是负责编写代码的工具。
  
  出现如下界面。
  
  在左侧,我们可以开始编写自己的代码。在进入具体代码之前,给初学者多说一句。
  现在让我们开始供应主菜。以下代码的作用是在全文中搜索收录“execute”字样的案例,并提取时间、案例编号、案例名称放入excel表格中。
  #到"""之前这一段是打开spyder的界面就会自动添加的内容,一般不用去动。
#这一句是告诉电脑解码方式是UTF-8码,我们可以简单地理解为可以在代码里加中文,建议每次编程都加上。
# -*- coding: utf-8 -*-
#用(""" """)包起来的这一部分电脑也是忽略掉的,主要是给人看的部分,分别是代码首次编写时间和作者,属于可写可不写的部分。
"""
Created on Sun Jul 24 23:11:55 2016
@author: 检
"""
#这里是导入模块,以下模块分别用于抓取网页、数据处理保存、时间、正则表达式
import requests as req
import pandas as pd
import time
import re
#这是刚才我们通过F12查找到的网页
url=&#39;http://wenshu.court.gov.cn/Lis ... 39%3B
#这是页数、程序休息时间的定义和三个空的列表用来装筛选后的数据。
Index=1
SleepNum = 3
dates=[]
titles=[]
nums=[]
#循环模块,因为有很多页,当小于这个数时,不断地传数据,相当于点下一页的功能。最后一句的意思是每执行一次,index加1,就是翻到下一页。具体页数也可以用变量实现。
while Index < 123:
#这是请求头,伪装成浏览器访问网站,以免被网站屏蔽
my_headers={&#39;User-Agent&#39;:&#39;User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.95 Safari/537.36 Core/1.50.1280.400&#39;,}
#这一行就是我们搞定的搜索条件,可以按自己要求设置,比如:“法院名称:北京市人 民法院,案件类型:执行案件,裁判日期:2016-01-01 TO 2016-10-08”。
#如果实在不会设置,可以在文书网上搜索好,再通过F12查看到的内容复制粘贴到代码中&#39;Param&#39;:后即可。
data={&#39;Param&#39;:&#39;全文检索:执行&#39;, &#39;Index&#39;: Index,&#39;Page&#39;:&#39;20&#39;,&#39;Order&#39;:&#39;裁判日期&#39;,&#39;Direction&#39;:&#39;asc&#39;}
#将网址、请求头、搜索条件等数据上传并取得内容
r=req.post(url, headers=my_headers, data = data)
#用 json解码取得的网页内容
raw=r.json()
#用正则表达式将我们需要的内容提取出来,正则表达式真的很有用,要想真正用好westlaw等数据库,这一关也得过
#大意是定义筛选标准,把(“裁判日期”:)后,(&#39;)前的内容截取出来。
pattern1 = re.compile(&#39;"裁判日期":"(.*?)"&#39;, re.S)
date = re.findall(pattern1,raw)
pattern2 = re.compile(&#39;"案号":"(.*?)"&#39;, re.S)
num = re.findall(pattern2,raw)
pattern3 = re.compile(&#39;"案件名称":"(.*?)"&#39;, re.S)
title = re.findall(pattern3,raw)
#把筛选出的数据添加到开始的三个空列表里
dates+=date
titles+=title
nums+=num
#这一行是让程序休息,做事留点余地比较好。通过网页编码可知,文书网是有验证码功能的,如果你抓的太狠中招莫怪。
time.sleep(SleepNum)
Index += 1
#这里我们可以看到,从while开始到此,所有的代码都缩进了四个空格。这是因为要告诉电脑,这一段代码构成一个相对独立的组,当index小于123时,不断地从这个组第一句代码执行到最后一句代码,而不涉及到本文涉及的其他代码。
#这里代码又是顶格写。
#用pandas模块将筛选出的内容转成dataframe格式,并保存到Excel。
df=pd.DataFrame({&#39;时间&#39;:dates,&#39;案号&#39;:nums, &#39;案件名称&#39;:titles})
df.to_excel(&#39;C:\\result.xlsx&#39;)
  好了,工作结束,保存,点击软件界面上的绿色小三角或按F5运行,过一会,我们会发现C盘静静的躺着一个名为result的excel表,里面存储着我们想要的信息。以后我们不用打开编程软件Spyder,把代码保存在桌面,双击,它会根据设置的搜索条件自动找到相关的文档号,保存为excel,不用了登录响应。文档网络慢是不是很方便?
  如果只想要结果,直接粘贴到Spyder左边的框中,直接运行即可。 (但是如果你看完这篇文章想进一步了解编程,个人强烈不推荐这个。因为你自己没有输入很多细节,你不会注意到。比如刚才提到的while语句,按回车行前有个“:”,看代码很容易忽略。当然Spyder编程软件很聪明,会为我们完成,但是我们不能靠机器,对吧。 )
  其他补充:
  首先,编程的好处很多。可以提高我们的工作效率(就像上面的代码,运行2、3分钟,可以下载上千份法律文件);而且因为编程就像教一个什么都不知道怎么做事的孩子,有一个前提,没有明确的解释是做不到的,所以很合乎逻辑,可以反馈合法的工作。例如,在分析法律关系时,编程的思维方式可以帮助我们意识到我们忽略的隐含前提。
  其次,编程并不难。通过这种级别的编程,您不必考虑机器如何理解我在写的内容。这种问题更像是游戏的高级设置选项。大部分代码直接是英文单词,可以看成是写一篇英文论文。 我们的难处主要在于不舒服,这绝不是不可理解的。这个问题可以通过多输入几次代码来解决。
  最后,如果这个文章有幸引起你学习Python的兴趣,可以去这个网站学习基础知识,通俗易懂,而且每节都附有小练习,非常适合初学者(课后一定要练习,写出来就对了)

python网页数据抓取(爬取《斗破苍穹》全文小说网络链接:)

网站优化优采云 发表了文章 • 0 个评论 • 99 次浏览 • 2021-09-14 11:16 • 来自相关话题

  python网页数据抓取(爬取《斗破苍穹》全文小说网络链接:)
  在python爬取数据的过程中,当你使用上面介绍的三大库进行正则爬取时,有时不方便处理路径,可以使用简单的正则表达式来描述路径。抢。
  说到正则表达式,大家往往会觉得很复杂,因为正则表达式是一组特殊的符号,用来帮助开发者检查一个字符串是否与某个模式匹配。其实,当你弄清楚如何匹配字符时,还是很简单的,然后使用re模块完成数据获取。
  1、正则表达式基础
  (1)一般字符
  
  (2)预定义字符集
  
  (3)quantity word
  
  (4)边界匹配
  
  注意:最常用的匹配方式(.*?)表示匹配任意字符
  2、re 模块使用方法
  re 模块使 Python 拥有所有正则表达式功能。
  常用函数1:search()函数匹配提取第一个符合规律的内容,并返回一个正则表达式对象
  常用函数2:findall()函数匹配所有符合规律的内容并以列表的形式返回结果
  备注:一般在爬取数据的时候用的最多的是findall。
  重新模块修饰符
  
  3、案例实践
  案例名称:爬取《斗破苍穹》全文小说
  网络链接:/doupocangqiong/
  
  抓取想法:
  打开网页,了解网页的网址信息。打开第一、二章,链接如下
  /doupocangqiong/1.html
  /doupocangqiong/2.html
  /doupocangqiong/3.html
  明显的链接通过添加数字对每一章进行分页。
  爬取全文信息,找到对应位置如下
  
  数据存储在 TXT 文本中
  4、详细代码如下:
  导入请求
  重新导入
  导入时间
  标题={
  "User-Agent":请求头}
  f=open('doupo.txt','a+')
  def get_info(url):
  res=requests.get(url,headers=headers)
  如果 res.status_code==200:
  contents = re.findall('
  (.*?)
  ',res.content.decode('utf-8'),re.S)
  对于内容中的内容:
  f.write(content+'\n')
  打印(内容)
  其他:
  通过
  如果 __name__=='__main__':
  urls=['/doupocangqiong/{}.html'.format(i) for i in range(2,10)]
  对于网址中的网址:
  get_info(url)
  time.sleep(1)
  f.close()
  运行结果如下:
  
  好的,正则化的使用就是这么简单。当遇到路径困难时,不妨试试正则化来获取数据。非常高效方便! 查看全部

  python网页数据抓取(爬取《斗破苍穹》全文小说网络链接:)
  在python爬取数据的过程中,当你使用上面介绍的三大库进行正则爬取时,有时不方便处理路径,可以使用简单的正则表达式来描述路径。抢。
  说到正则表达式,大家往往会觉得很复杂,因为正则表达式是一组特殊的符号,用来帮助开发者检查一个字符串是否与某个模式匹配。其实,当你弄清楚如何匹配字符时,还是很简单的,然后使用re模块完成数据获取。
  1、正则表达式基础
  (1)一般字符
  
  (2)预定义字符集
  
  (3)quantity word
  
  (4)边界匹配
  
  注意:最常用的匹配方式(.*?)表示匹配任意字符
  2、re 模块使用方法
  re 模块使 Python 拥有所有正则表达式功能。
  常用函数1:search()函数匹配提取第一个符合规律的内容,并返回一个正则表达式对象
  常用函数2:findall()函数匹配所有符合规律的内容并以列表的形式返回结果
  备注:一般在爬取数据的时候用的最多的是findall。
  重新模块修饰符
  
  3、案例实践
  案例名称:爬取《斗破苍穹》全文小说
  网络链接:/doupocangqiong/
  
  抓取想法:
  打开网页,了解网页的网址信息。打开第一、二章,链接如下
  /doupocangqiong/1.html
  /doupocangqiong/2.html
  /doupocangqiong/3.html
  明显的链接通过添加数字对每一章进行分页。
  爬取全文信息,找到对应位置如下
  
  数据存储在 TXT 文本中
  4、详细代码如下:
  导入请求
  重新导入
  导入时间
  标题={
  "User-Agent":请求头}
  f=open('doupo.txt','a+')
  def get_info(url):
  res=requests.get(url,headers=headers)
  如果 res.status_code==200:
  contents = re.findall('
  (.*?)
  ',res.content.decode('utf-8'),re.S)
  对于内容中的内容:
  f.write(content+'\n')
  打印(内容)
  其他:
  通过
  如果 __name__=='__main__':
  urls=['/doupocangqiong/{}.html'.format(i) for i in range(2,10)]
  对于网址中的网址:
  get_info(url)
  time.sleep(1)
  f.close()
  运行结果如下:
  
  好的,正则化的使用就是这么简单。当遇到路径困难时,不妨试试正则化来获取数据。非常高效方便!

python网页数据抓取(Python之旅功能的实现与法律关系(上)首发)

网站优化优采云 发表了文章 • 0 个评论 • 100 次浏览 • 2021-09-14 11:14 • 来自相关话题

  python网页数据抓取(Python之旅功能的实现与法律关系(上)首发)
  本文首发于Trial Research,内容略有不同。
  引用:
  我曾经听过一位理科学生谈论他同事的轶事。这位同事会写一个小程序,解决需要5秒以上,不需要动脑的事情。不用说,即使在讨论项目的工作组中,工作电子邮件也会自动处理。检测到有人在说话,内容与你的工作有关,或者有人@了自己等,连接句库自动回复。
  我听了很羡慕。如果我们司法人员也能有一些编程技巧,那会节省很多时间。例如,您可以通过将填写办案系统和提取证据等事情交给计算机来节省时间并减少错误。也节省了分析证据和法律关系的时间。
  怀着对程序员的羡慕,再加上各种巧合,我开始了自己的Python之旅。现在我对编程的好处有了一点体会。例如,我们在工作中要查询很多法律文件和文件。如果只有一两份,我们可以直接在网页上下载,但是如果有很多份要操作,会很不方便。爬虫功能可以很方便的为我们实现这个需求,还可以顺便删除各种广告和不相关的内容。
  下面简单介绍一下爬虫功能的实现,以法律专业人士会接触到的裁判文书网为例。
  身体:
  一、准备工作
  开始之前,先简单介绍一下 Python 和一些基本问题。
  Python 是一种语法简单、模块众多的计算机语言。它可以轻松实现许多功能;您无需担心如何实现它。只需找到合适的模块并告诉它去做。它非常适合非程序员。开始吧。比如从网上抓取数据,如果你用另一种语言写一个程序,需要很多行,但如果你用Python,几行就可以解决问题。
  选择Python后,语言版本和模块有两个问题。在语言版本方面,主要有2.7和3两种。2.7的优点是历史悠久,可以使用的模块很多; 3的优点是是未来的发展方向,我们能用的大部分模块都已经支持3了,3支持中文好多了。因此,我个人建议直接使用3。当然,这些对我们外行来说都不是很重要。两者几乎相同。只需使用它们。不要卷入程序员之间的口水战。
  除此之外是模块问题。模块就像我们日常工作中的笔、墨、纸、砚等工具。它节省了我们自己“制作工具”的时间。这里推荐使用Anaconda。它就像普通的软件。你只需要在谷歌官网下载安装它,你的电脑就可以用Python编程了。我们可以使用的模块已经打包安装在一起,节省了我们寻找模块、安装模块以及处理模块之间兼容性的时间。可以说是一个工具。
  总结一下,准备就是一句话,搜索Anaconda,下载,安装,DONE!
  二、上手攀虫
  互联网就是网络,在互联网上搜索我们的程序就是爬虫。
  我们要做的判断文档网络比一般的网站要复杂一点,不能直接通过URL爬取。因此,我们首先了解两个问题。一是网上展示的文档内容发送到哪里,二是网站在将内容发送给我们之前必须满足什么条件。
  1. 追踪网页
  
  直接搜索“执行”这个词。这是我们在浏览器上可以看到的网址,但是不能直接抓取内容,所以需要使用软件网页进行跟踪。这个软件不需要安装,不管是IE还是Chrome,按F12都会弹出这个软件。我们以chrome为例。
  
  按F12后,右侧弹出软件界面。选择上面网络的主要项并刷新网页。浏览器和网站之间的所有交互内容都出现在下面的名称项中,我们想要的内容隐藏在里面。在此页面中,内容隐藏在带圆圈的 Listcontent 项下。
  我们选择Listcontent,从右边的header细节可以看出请求方法是POST,后面是真实的内容请求地址,后面是Request URL。
  接下来,我们来解决第二个问题。我们需要发送什么内容才能让这个 URL 返回我们需要的信息?同样在这个界面,我们继续向下滚动,可以看到Form Data的内容(如下图)。
  
  我们可以看到信息内容为:搜索条件“全文搜索:执行”,Index:1(第一页),Page:5(每页出现5个文档,最大值为20,我们可以程序中直接设置为20), order: 法院级别(按法院级别排序),最后一个参数是解码的,直接复制即可。也就是说,我们必须发送到网页的搜索需求是:全文收录“执行”这个词,如果有符合条件的人以这种格式向网页发送内容,就可以得到我们想要的信息。
  2.code
  在您知道消息的格式和发送位置之后,就可以编写代码了。接下来我们在刚才提到的Anaconda软件下打开Spyder。两者的关系就好比Anaconda是win系统,spyder是记事本。 Spyder 是负责编写代码的工具。
  
  出现如下界面。
  
  在左侧,我们可以开始编写自己的代码。在进入具体代码之前,给初学者多说一句。
  现在让我们开始供应主菜。以下代码的作用是在全文中搜索收录“execute”字样的案例,并提取时间、案例编号、案例名称放入excel表格中。
  #"""前的段落是打开spyder界面时会自动添加的内容,一般不需要移动。
  #这句话告诉计算机解码方式是UTF-8编码,我们可以简单的理解为可以在编码中添加中文,建议每次编程时都添加。
  #到"""之前这一段是打开spyder的界面就会自动添加的内容,一般不用去动。
#这一句是告诉电脑解码方式是UTF-8码,我们可以简单地理解为可以在代码里加中文,建议每次编程都加上。
# -*- coding: utf-8 -*-
#用(""" """)包起来的这一部分电脑也是忽略掉的,主要是给人看的部分,分别是代码首次编写时间和作者,属于可写可不写的部分。
"""
Created on Sun Jul 24 23:11:55 2016
@author: 检
"""
#这里是导入模块,以下模块分别用于抓取网页、数据处理保存、时间、正则表达式
import requests as req
import pandas as pd
import time
import re
#这是刚才我们通过F12查找到的网页
url=&#39;http://wenshu.court.gov.cn/Lis ... 39%3B
#这是页数、程序休息时间的定义和三个空的列表用来装筛选后的数据。
Index=1
SleepNum = 3
dates=[]
titles=[]
nums=[]
#循环模块,因为有很多页,当小于这个数时,不断地传数据,相当于点下一页的功能。最后一句的意思是每执行一次,index加1,就是翻到下一页。具体页数也可以用变量实现。
while Index < 123:
#这是请求头,伪装成浏览器访问网站,以免被网站屏蔽
my_headers={&#39;User-Agent&#39;:&#39;User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.95 Safari/537.36 Core/1.50.1280.400&#39;,}
#这一行就是我们搞定的搜索条件,可以按自己要求设置,比如:“法院名称:北京市人 民法院,案件类型:执行案件,裁判日期:2016-01-01 TO 2016-10-08”。
#如果实在不会设置,可以在文书网上搜索好,再通过F12查看到的内容复制粘贴到代码中加红的区域即可。
data={&#39;Param&#39;:&#39;全文检索:执行&#39;, &#39;Index&#39;: Index,&#39;Page&#39;:&#39;20&#39;,&#39;Order&#39;:&#39;裁判日期&#39;,&#39;Direction&#39;:&#39;asc&#39;}
#将网址、请求头、搜索条件等数据上传并取得内容
r=req.post(url, headers=my_headers, data = data)
#用 json解码取得的网页内容
raw=r.json()
#用正则表达式将我们需要的内容提取出来,正则表达式真的很有用,要想真正用好westlaw等数据库,这一关也得过
#大意是定义筛选标准,把(“裁判日期”:)后,(&#39;)前的内容截取出来。
pattern1 = re.compile(&#39;"裁判日期":"(.*?)"&#39;, re.S)
date = re.findall(pattern1,raw)
pattern2 = re.compile(&#39;"案号":"(.*?)"&#39;, re.S)
num = re.findall(pattern2,raw)
pattern3 = re.compile(&#39;"案件名称":"(.*?)"&#39;, re.S)
title = re.findall(pattern3,raw)
#把筛选出的数据添加到开始的三个空列表里
dates+=date
titles+=title
nums+=num
#这一行是让程序休息,做事留点余地比较好。通过网页编码可知,文书网是有验证码功能的,如果你抓的太狠中招莫怪。
time.sleep(SleepNum)
Index += 1
#这里我们可以看到,从while开始到此,所有的代码都缩进了四个空格。这是因为要告诉电脑,这一段代码构成一个相对独立的组,当index小于123时,不断地从这个组第一句代码执行到最后一句代码,而不涉及到本文涉及的其他代码。
#这里代码又是顶格写。
#用pandas模块将筛选出的内容转成dataframe格式,并保存到Excel。
df=pd.DataFrame({&#39;时间&#39;:dates,&#39;案号&#39;:nums, &#39;案件名称&#39;:titles})
df.to_excel(&#39;C:\\result.xlsx&#39;)
  好了,工作结束,保存,点击软件界面上的绿色小三角或按F5运行,过一会,我们会发现C盘静静的躺着一个名为result的excel表,里面存储着我们想要的信息。以后我们不用打开编程软件Spyder,把代码保存在桌面,双击,它会根据设置的搜索条件自动找到相关的文档号,保存为excel,不用了登录响应。文档网络慢是不是很方便?
  如果只想要结果,直接粘贴到Spyder左边的框中,直接运行即可。 (但是如果你看完这篇文章想进一步了解编程,个人强烈不推荐这个。因为你自己没有输入很多细节,你不会注意到。比如刚才提到的while语句,按回车行前有个“:”,看代码很容易忽略。当然Spyder编程软件很聪明,会为我们完成,但是我们不能靠机器,对吧。 )
  其他补充:
  首先,编程的好处很多。可以提高我们的工作效率(就像上面的代码,运行2、3分钟,可以下载上千份法律文件);而且因为编程就像教一个什么都不知道怎么做事的孩子,有一个前提,没有明确的解释是做不到的,所以很合乎逻辑,可以反馈合法的工作。例如,在分析法律关系时,编程的思维方式可以帮助我们意识到我们忽略的隐含前提。
  其次,编程并不难。通过这种级别的编程,您不必考虑机器如何理解我在写的内容。这种问题更像是游戏的高级设置选项。大部分代码直接是英文单词,可以看成是写一篇英文论文。 我们的难处主要在于不舒服,这绝不是不可理解的。这个问题可以通过多输入几次代码来解决。
  最后,如果这个文章有幸引起你学习Python的兴趣,可以去这个网站学习基础知识,通俗易懂,而且每节都附有小练习,非常适合初学者(课后一定要练习,写出来就对了) 查看全部

  python网页数据抓取(Python之旅功能的实现与法律关系(上)首发)
  本文首发于Trial Research,内容略有不同。
  引用:
  我曾经听过一位理科学生谈论他同事的轶事。这位同事会写一个小程序,解决需要5秒以上,不需要动脑的事情。不用说,即使在讨论项目的工作组中,工作电子邮件也会自动处理。检测到有人在说话,内容与你的工作有关,或者有人@了自己等,连接句库自动回复。
  我听了很羡慕。如果我们司法人员也能有一些编程技巧,那会节省很多时间。例如,您可以通过将填写办案系统和提取证据等事情交给计算机来节省时间并减少错误。也节省了分析证据和法律关系的时间。
  怀着对程序员的羡慕,再加上各种巧合,我开始了自己的Python之旅。现在我对编程的好处有了一点体会。例如,我们在工作中要查询很多法律文件和文件。如果只有一两份,我们可以直接在网页上下载,但是如果有很多份要操作,会很不方便。爬虫功能可以很方便的为我们实现这个需求,还可以顺便删除各种广告和不相关的内容。
  下面简单介绍一下爬虫功能的实现,以法律专业人士会接触到的裁判文书网为例。
  身体:
  一、准备工作
  开始之前,先简单介绍一下 Python 和一些基本问题。
  Python 是一种语法简单、模块众多的计算机语言。它可以轻松实现许多功能;您无需担心如何实现它。只需找到合适的模块并告诉它去做。它非常适合非程序员。开始吧。比如从网上抓取数据,如果你用另一种语言写一个程序,需要很多行,但如果你用Python,几行就可以解决问题。
  选择Python后,语言版本和模块有两个问题。在语言版本方面,主要有2.7和3两种。2.7的优点是历史悠久,可以使用的模块很多; 3的优点是是未来的发展方向,我们能用的大部分模块都已经支持3了,3支持中文好多了。因此,我个人建议直接使用3。当然,这些对我们外行来说都不是很重要。两者几乎相同。只需使用它们。不要卷入程序员之间的口水战。
  除此之外是模块问题。模块就像我们日常工作中的笔、墨、纸、砚等工具。它节省了我们自己“制作工具”的时间。这里推荐使用Anaconda。它就像普通的软件。你只需要在谷歌官网下载安装它,你的电脑就可以用Python编程了。我们可以使用的模块已经打包安装在一起,节省了我们寻找模块、安装模块以及处理模块之间兼容性的时间。可以说是一个工具。
  总结一下,准备就是一句话,搜索Anaconda,下载,安装,DONE!
  二、上手攀虫
  互联网就是网络,在互联网上搜索我们的程序就是爬虫。
  我们要做的判断文档网络比一般的网站要复杂一点,不能直接通过URL爬取。因此,我们首先了解两个问题。一是网上展示的文档内容发送到哪里,二是网站在将内容发送给我们之前必须满足什么条件。
  1. 追踪网页
  
  直接搜索“执行”这个词。这是我们在浏览器上可以看到的网址,但是不能直接抓取内容,所以需要使用软件网页进行跟踪。这个软件不需要安装,不管是IE还是Chrome,按F12都会弹出这个软件。我们以chrome为例。
  
  按F12后,右侧弹出软件界面。选择上面网络的主要项并刷新网页。浏览器和网站之间的所有交互内容都出现在下面的名称项中,我们想要的内容隐藏在里面。在此页面中,内容隐藏在带圆圈的 Listcontent 项下。
  我们选择Listcontent,从右边的header细节可以看出请求方法是POST,后面是真实的内容请求地址,后面是Request URL。
  接下来,我们来解决第二个问题。我们需要发送什么内容才能让这个 URL 返回我们需要的信息?同样在这个界面,我们继续向下滚动,可以看到Form Data的内容(如下图)。
  
  我们可以看到信息内容为:搜索条件“全文搜索:执行”,Index:1(第一页),Page:5(每页出现5个文档,最大值为20,我们可以程序中直接设置为20), order: 法院级别(按法院级别排序),最后一个参数是解码的,直接复制即可。也就是说,我们必须发送到网页的搜索需求是:全文收录“执行”这个词,如果有符合条件的人以这种格式向网页发送内容,就可以得到我们想要的信息。
  2.code
  在您知道消息的格式和发送位置之后,就可以编写代码了。接下来我们在刚才提到的Anaconda软件下打开Spyder。两者的关系就好比Anaconda是win系统,spyder是记事本。 Spyder 是负责编写代码的工具。
  
  出现如下界面。
  
  在左侧,我们可以开始编写自己的代码。在进入具体代码之前,给初学者多说一句。
  现在让我们开始供应主菜。以下代码的作用是在全文中搜索收录“execute”字样的案例,并提取时间、案例编号、案例名称放入excel表格中。
  #"""前的段落是打开spyder界面时会自动添加的内容,一般不需要移动。
  #这句话告诉计算机解码方式是UTF-8编码,我们可以简单的理解为可以在编码中添加中文,建议每次编程时都添加。
  #到"""之前这一段是打开spyder的界面就会自动添加的内容,一般不用去动。
#这一句是告诉电脑解码方式是UTF-8码,我们可以简单地理解为可以在代码里加中文,建议每次编程都加上。
# -*- coding: utf-8 -*-
#用(""" """)包起来的这一部分电脑也是忽略掉的,主要是给人看的部分,分别是代码首次编写时间和作者,属于可写可不写的部分。
"""
Created on Sun Jul 24 23:11:55 2016
@author: 检
"""
#这里是导入模块,以下模块分别用于抓取网页、数据处理保存、时间、正则表达式
import requests as req
import pandas as pd
import time
import re
#这是刚才我们通过F12查找到的网页
url=&#39;http://wenshu.court.gov.cn/Lis ... 39%3B
#这是页数、程序休息时间的定义和三个空的列表用来装筛选后的数据。
Index=1
SleepNum = 3
dates=[]
titles=[]
nums=[]
#循环模块,因为有很多页,当小于这个数时,不断地传数据,相当于点下一页的功能。最后一句的意思是每执行一次,index加1,就是翻到下一页。具体页数也可以用变量实现。
while Index < 123:
#这是请求头,伪装成浏览器访问网站,以免被网站屏蔽
my_headers={&#39;User-Agent&#39;:&#39;User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.95 Safari/537.36 Core/1.50.1280.400&#39;,}
#这一行就是我们搞定的搜索条件,可以按自己要求设置,比如:“法院名称:北京市人 民法院,案件类型:执行案件,裁判日期:2016-01-01 TO 2016-10-08”。
#如果实在不会设置,可以在文书网上搜索好,再通过F12查看到的内容复制粘贴到代码中加红的区域即可。
data={&#39;Param&#39;:&#39;全文检索:执行&#39;, &#39;Index&#39;: Index,&#39;Page&#39;:&#39;20&#39;,&#39;Order&#39;:&#39;裁判日期&#39;,&#39;Direction&#39;:&#39;asc&#39;}
#将网址、请求头、搜索条件等数据上传并取得内容
r=req.post(url, headers=my_headers, data = data)
#用 json解码取得的网页内容
raw=r.json()
#用正则表达式将我们需要的内容提取出来,正则表达式真的很有用,要想真正用好westlaw等数据库,这一关也得过
#大意是定义筛选标准,把(“裁判日期”:)后,(&#39;)前的内容截取出来。
pattern1 = re.compile(&#39;"裁判日期":"(.*?)"&#39;, re.S)
date = re.findall(pattern1,raw)
pattern2 = re.compile(&#39;"案号":"(.*?)"&#39;, re.S)
num = re.findall(pattern2,raw)
pattern3 = re.compile(&#39;"案件名称":"(.*?)"&#39;, re.S)
title = re.findall(pattern3,raw)
#把筛选出的数据添加到开始的三个空列表里
dates+=date
titles+=title
nums+=num
#这一行是让程序休息,做事留点余地比较好。通过网页编码可知,文书网是有验证码功能的,如果你抓的太狠中招莫怪。
time.sleep(SleepNum)
Index += 1
#这里我们可以看到,从while开始到此,所有的代码都缩进了四个空格。这是因为要告诉电脑,这一段代码构成一个相对独立的组,当index小于123时,不断地从这个组第一句代码执行到最后一句代码,而不涉及到本文涉及的其他代码。
#这里代码又是顶格写。
#用pandas模块将筛选出的内容转成dataframe格式,并保存到Excel。
df=pd.DataFrame({&#39;时间&#39;:dates,&#39;案号&#39;:nums, &#39;案件名称&#39;:titles})
df.to_excel(&#39;C:\\result.xlsx&#39;)
  好了,工作结束,保存,点击软件界面上的绿色小三角或按F5运行,过一会,我们会发现C盘静静的躺着一个名为result的excel表,里面存储着我们想要的信息。以后我们不用打开编程软件Spyder,把代码保存在桌面,双击,它会根据设置的搜索条件自动找到相关的文档号,保存为excel,不用了登录响应。文档网络慢是不是很方便?
  如果只想要结果,直接粘贴到Spyder左边的框中,直接运行即可。 (但是如果你看完这篇文章想进一步了解编程,个人强烈不推荐这个。因为你自己没有输入很多细节,你不会注意到。比如刚才提到的while语句,按回车行前有个“:”,看代码很容易忽略。当然Spyder编程软件很聪明,会为我们完成,但是我们不能靠机器,对吧。 )
  其他补充:
  首先,编程的好处很多。可以提高我们的工作效率(就像上面的代码,运行2、3分钟,可以下载上千份法律文件);而且因为编程就像教一个什么都不知道怎么做事的孩子,有一个前提,没有明确的解释是做不到的,所以很合乎逻辑,可以反馈合法的工作。例如,在分析法律关系时,编程的思维方式可以帮助我们意识到我们忽略的隐含前提。
  其次,编程并不难。通过这种级别的编程,您不必考虑机器如何理解我在写的内容。这种问题更像是游戏的高级设置选项。大部分代码直接是英文单词,可以看成是写一篇英文论文。 我们的难处主要在于不舒服,这绝不是不可理解的。这个问题可以通过多输入几次代码来解决。
  最后,如果这个文章有幸引起你学习Python的兴趣,可以去这个网站学习基础知识,通俗易懂,而且每节都附有小练习,非常适合初学者(课后一定要练习,写出来就对了)

python网页数据抓取(三种抓取网页数据的方法-2.Beautiful)

网站优化优采云 发表了文章 • 0 个评论 • 135 次浏览 • 2021-09-13 08:02 • 来自相关话题

  python网页数据抓取(三种抓取网页数据的方法-2.Beautiful)
  下面我们将介绍三种抓取网页数据的方法,首先是正则表达式,然后是流行的BeautifulSoup模块,最后是强大的lxml模块。
  1. 正则表达式
  如果你对正则表达式不熟悉,或者需要一些提示,可以参考Regular Expression HOWTO的完整介绍。
  当我们使用正则表达式抓取国家/地区数据时,首先要尽量匹配元素的内容,如下图:
  >>> import re
>>> import urllib2
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> re.findall(&#39;(.*?)&#39;, html)
[&#39;/places/static/images/flags/gb.png&#39;, &#39;244,820 square kilometres&#39;, &#39;62,348,447&#39;, &#39;GB&#39;, &#39;United Kingdom&#39;, &#39;London&#39;, &#39;EU&#39;, &#39;.uk&#39;, &#39;GBP&#39;, &#39;Pound&#39;, &#39;44&#39;, &#39;@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA&#39;, &#39;^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|([A-Z]{2}\\d{2}[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})|([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})|(GIR0AA))$&#39;, &#39;en-GB,cy-GB,gd&#39;, &#39;IE &#39;]
>>>
  从上面的结果可以看出,多个国家/地区属性都使用了标签。分隔area属性,我们可以只选择第二个元素,如下图:
  >>> re.findall(&#39;(.*?)&#39;, html)[1]
&#39;244,820 square kilometres&#39;
  虽然现在可以使用这个计划,但是如果页面发生变化,该计划很可能会失败。比如表变了,去掉了第二行的土地面积数据。如果我们现在只抓取数据,我们可以忽略这种可能的未来变化。但是,如果我们希望将来再次捕获数据,则需要提供更健壮的解决方案,以尽可能避免这种布局更改的影响。为了使正则表达式更加健壮,我们还可以添加其父元素。由于这个元素有一个 ID 属性,所以它应该是唯一的。
  >>> re.findall(&#39;Area: (.*?)&#39;, html)
[&#39;244,820 square kilometres&#39;]
  这个迭代版本看起来更好,但是还有很多其他的更新网页的方式,也会让正则表达式不尽人意。例如,将双引号更改为单引号,在标签之间添加额外的空格,或者更改 area_label 等。以下是尝试支持这些可能性的改进版本。
  >>> re.findall(&#39;.*?(.*?)&#39;,html)[&#39;244,820 square kilometres&#39;]
  这个正则表达式虽然更容易适应未来的变化,但存在构建困难、可读性差的问题。此外,还有一些细微的布局变化会使正则表达式不令人满意,例如在标签中添加标题属性。
  从这个例子可以看出,正则表达式为我们提供了一种快速抓取数据的方式,但是这种方式过于脆弱,在网页更新后容易出现问题。好在还有一些更好的解决方案,后面会介绍。
  2.美汤
  Beautiful Soup 是一个非常流行的 Python 模块。该模块可以解析网页并提供方便的界面来定位内容。如果没有安装模块,可以使用如下命令安装最新版本(需要先安装pip,请自行百度):
  pip install beautifulsoup4
  使用 Beautiful Soup 的第一步是将下载的 HTML 内容解析成一个 Soup 文档。由于大多数网页没有好的 HTML 格式,Beautiful Soup 需要确定其实际格式。例如,在下面的简单网页列表中,存在属性值周围缺少引号和未关闭标签的问题。
  
Area
Population
  如果将 Population 列表项解析为 Area 列表项的子元素,而不是两个并排的列表项,我们在爬行时会得到错误的结果。下面我们来看看Beautiful Soup是如何处理的。
  >>> from bs4 import BeautifulSoup
>>> broken_html = &#39;AreaPopulation&#39;
>>> # parse the HTML
>>> soup = BeautifulSoup(broken_html, &#39;html.parser&#39;)
>>> fixed_html = soup.prettify()
>>> print fixed_html

Area

Population


  从上面的执行结果可以看出,Beautiful Soup可以正确解析缺失的引号并关闭标签。现在我们可以使用 find() 和 find_all() 方法来定位我们需要的元素。
  >>> ul = soup.find(&#39;ul&#39;, attrs={&#39;class&#39;:&#39;country&#39;})
>>> ul.find(&#39;li&#39;) # return just the first match
AreaPopulation
>>> ul.find_all(&#39;li&#39;) # return all matches
[AreaPopulation, Population]
  注:由于不同版本的Python内置库容错能力不同,处理结果可能与上述不同。详情请参考:。如果想知道所有的方法和参数,可以参考Beautiful Soup的官方文档
  以下是使用该方法提取样本国家面积数据的完整代码。
  >>> from bs4 import BeautifulSoup
>>> import urllib2
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> # locate the area row
>>> tr = soup.find(attrs={&#39;id&#39;:&#39;places_area__row&#39;})
>>> # locate the area tag
>>> td = tr.find(attrs={&#39;class&#39;:&#39;w2p_fw&#39;})
>>> area = td.text # extract the text from this tag
>>> print area
244,820 square kilometres
  虽然这段代码比正则表达式代码复杂,但更容易构建和理解。此外,我们不需要担心布局的微小变化,例如额外的空格和标签属性。
  3.Lxml
  Lxml 是一个基于 libxml2(一个 XML 解析库)的 Python 包。这个模块是用C语言编写的,解析速度比Beautiful Soup快,但是安装过程比较复杂。可以参考最新的安装说明。**
  与 Beautiful Soup 一样,使用 lxml 模块的第一步是将潜在的非法 HTML 解析为统一格式。以下是使用此模块解析不完整 HTML 的示例:
  >>> import lxml.html
>>> broken_html = &#39;AreaPopulation&#39;
>>> # parse the HTML
>>> tree = lxml.html.fromstring(broken_html)
>>> fixed_html = lxml.html.tostring(tree, pretty_print=True)
>>> print fixed_html
Area
Population
  同理,lxml 也可以正确解析属性两边缺失的引号并关闭标签,但是模块没有添加和标签。
  解析输入内容后,进入选择元素的步骤。这时候lxml有几种不同的方法,比如XPath选择器和类似于Beautiful Soup的find()方法。但是,我们以后会使用 CSS 选择器,因为它更简洁,可以在解析动态内容时重复使用。另外,一些有jQuery选择器使用经验的读者会比较熟悉。
  以下是使用lxml的CSS选择器提取区域数据的示例代码:
  >>> import urllib2
>>> import lxml.html
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> tree = lxml.html.fromstring(html)
>>> td = tree.cssselect(&#39;tr#places_area__row > td.w2p_fw&#39;)[0] # *行代码
>>> area = td.text_content()
>>> print area
244,820 square kilometres
  * 这行代码会先找到id为places_area__row的表格行元素,然后选择类为w2p_fw的表格数据子标签。
  CSS 选择器指示用于选择元素的模式。以下是一些常用选择器的示例:
  选择所有标签: *
选择 标签: a
选择所有 class="link" 的元素: .link
选择 class="link" 的 标签: a.link
选择 id="home" 的 标签: a#home
选择父元素为 标签的所有 子标签: a > span
选择 标签内部的所有 标签: a span
选择 title 属性为"Home"的所有 标签: a[title=Home]
  W3C 提出了 CSS3 规范,其 URL 为
  Lxml 已经实现了大部分 CSS3 属性,不支持的功能可以在:.
  注意:在lxml的内部实现中,它实际上是将CSS选择器转换成等效的XPath选择器。
  4. 性能对比
  在下面这段代码中,每个爬虫都会执行 1000 次。每次执行都会检查爬取结果是否正确,然后打印总时间。
  # -*- coding: utf-8 -*-
import csv
import time
import urllib2
import re
import timeit
from bs4 import BeautifulSoup
import lxml.html
FIELDS = (&#39;area&#39;, &#39;population&#39;, &#39;iso&#39;, &#39;country&#39;, &#39;capital&#39;, &#39;continent&#39;, &#39;tld&#39;, &#39;currency_code&#39;, &#39;currency_name&#39;, &#39;phone&#39;, &#39;postal_code_format&#39;, &#39;postal_code_regex&#39;, &#39;languages&#39;, &#39;neighbours&#39;)
def regex_scraper(html):
results = {}
for field in FIELDS:
results[field] = re.search(&#39;.*?(.*?)&#39;.format(field), html).groups()[0]
return results
def beautiful_soup_scraper(html):
soup = BeautifulSoup(html, &#39;html.parser&#39;)
results = {}
for field in FIELDS:
results[field] = soup.find(&#39;table&#39;).find(&#39;tr&#39;, id=&#39;places_{}__row&#39;.format(field)).find(&#39;td&#39;, class_=&#39;w2p_fw&#39;).text
return results
def lxml_scraper(html):
tree = lxml.html.fromstring(html)
results = {}
for field in FIELDS:
results[field] = tree.cssselect(&#39;table > tr#places_{}__row > td.w2p_fw&#39;.format(field))[0].text_content()
return results
def main():
times = {}
html = urllib2.urlopen(&#39;http://example.webscraping.com ... %2339;).read()
NUM_ITERATIONS = 1000 # number of times to test each scraper
for name, scraper in (&#39;Regular expressions&#39;, regex_scraper), (&#39;Beautiful Soup&#39;, beautiful_soup_scraper), (&#39;Lxml&#39;, lxml_scraper):
times[name] = []
# record start time of scrape
start = time.time()
for i in range(NUM_ITERATIONS):
if scraper == regex_scraper:
# the regular expression module will cache results
# so need to purge this cache for meaningful timings
re.purge() # *行代码
result = scraper(html)
# check scraped result is as expected
assert(result[&#39;area&#39;] == &#39;244,820 square kilometres&#39;)
times[name].append(time.time() - start)
# record end time of scrape and output the total
end = time.time()
print &#39;{}: {:.2f} seconds&#39;.format(name, end - start)
writer = csv.writer(open(&#39;times.csv&#39;, &#39;w&#39;))
header = sorted(times.keys())
writer.writerow(header)
for row in zip(*[times[scraper] for scraper in header]):
writer.writerow(row)
if __name__ == &#39;__main__&#39;:
main()
  请注意,我们在 * 行代码中调用了 re.purge() 方法。默认情况下,正则表达式将缓存搜索结果。公平地说,我们需要使用这种方法来清除缓存。
  以下是在我的电脑上运行脚本的结果:
  
  由于硬件条件的不同,不同电脑的执行结果也会有一定的差异。但是,每种方法之间的相对差异应该具有可比性。从结果中可以看出,在抓取我们的示例网页时,Beautiful Soup 比其他两种方法慢 7 倍以上。其实这个结果是符合预期的,因为lxml和正则表达式模块是用C语言写的,而Beautiful Soup是用纯Python写的。一个有趣的事实是 lxml 的性能几乎与正则表达式一样好。由于 lxml 必须在搜索元素之前将输入解析为内部格式,因此会产生额外的开销。当抓取同一个网页的多个特征时,这个初步分析的开销会减少,lxml会更有竞争力。因此,lxml 是一个强大的模块。
  5.总结
  三种网页抓取方式的优缺点:
  抓取方法 性能 使用困难 安装困难
  正则表达式
  快速
  难度
  简单(内置模块)
  美汤
  慢
  简单
  简单(纯 Python)
  Lxml
  快速
  简单
  比较难
  如果你的爬虫的瓶颈是下载网页,而不是提取数据,那么使用速度较慢的方法(比如Beautiful Soup)不是问题。正则表达式在一次性提取中非常有用,还可以避免解析整个网页的开销。如果你只需要爬取少量数据,又想避免额外的依赖,那么正则表达式可能更合适。不过一般情况下,lxml是爬取数据的最佳选择,因为它不仅速度更快,而且用途更广,而正则表达式和Beautiful Soup只在某些场景下有用。 查看全部

  python网页数据抓取(三种抓取网页数据的方法-2.Beautiful)
  下面我们将介绍三种抓取网页数据的方法,首先是正则表达式,然后是流行的BeautifulSoup模块,最后是强大的lxml模块。
  1. 正则表达式
  如果你对正则表达式不熟悉,或者需要一些提示,可以参考Regular Expression HOWTO的完整介绍。
  当我们使用正则表达式抓取国家/地区数据时,首先要尽量匹配元素的内容,如下图:
  >>> import re
>>> import urllib2
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> re.findall(&#39;(.*?)&#39;, html)
[&#39;/places/static/images/flags/gb.png&#39;, &#39;244,820 square kilometres&#39;, &#39;62,348,447&#39;, &#39;GB&#39;, &#39;United Kingdom&#39;, &#39;London&#39;, &#39;EU&#39;, &#39;.uk&#39;, &#39;GBP&#39;, &#39;Pound&#39;, &#39;44&#39;, &#39;@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA&#39;, &#39;^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|([A-Z]{2}\\d{2}[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})|([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})|(GIR0AA))$&#39;, &#39;en-GB,cy-GB,gd&#39;, &#39;IE &#39;]
>>>
  从上面的结果可以看出,多个国家/地区属性都使用了标签。分隔area属性,我们可以只选择第二个元素,如下图:
  >>> re.findall(&#39;(.*?)&#39;, html)[1]
&#39;244,820 square kilometres&#39;
  虽然现在可以使用这个计划,但是如果页面发生变化,该计划很可能会失败。比如表变了,去掉了第二行的土地面积数据。如果我们现在只抓取数据,我们可以忽略这种可能的未来变化。但是,如果我们希望将来再次捕获数据,则需要提供更健壮的解决方案,以尽可能避免这种布局更改的影响。为了使正则表达式更加健壮,我们还可以添加其父元素。由于这个元素有一个 ID 属性,所以它应该是唯一的。
  >>> re.findall(&#39;Area: (.*?)&#39;, html)
[&#39;244,820 square kilometres&#39;]
  这个迭代版本看起来更好,但是还有很多其他的更新网页的方式,也会让正则表达式不尽人意。例如,将双引号更改为单引号,在标签之间添加额外的空格,或者更改 area_label 等。以下是尝试支持这些可能性的改进版本。
  >>> re.findall(&#39;.*?(.*?)&#39;,html)[&#39;244,820 square kilometres&#39;]
  这个正则表达式虽然更容易适应未来的变化,但存在构建困难、可读性差的问题。此外,还有一些细微的布局变化会使正则表达式不令人满意,例如在标签中添加标题属性。
  从这个例子可以看出,正则表达式为我们提供了一种快速抓取数据的方式,但是这种方式过于脆弱,在网页更新后容易出现问题。好在还有一些更好的解决方案,后面会介绍。
  2.美汤
  Beautiful Soup 是一个非常流行的 Python 模块。该模块可以解析网页并提供方便的界面来定位内容。如果没有安装模块,可以使用如下命令安装最新版本(需要先安装pip,请自行百度):
  pip install beautifulsoup4
  使用 Beautiful Soup 的第一步是将下载的 HTML 内容解析成一个 Soup 文档。由于大多数网页没有好的 HTML 格式,Beautiful Soup 需要确定其实际格式。例如,在下面的简单网页列表中,存在属性值周围缺少引号和未关闭标签的问题。
  
Area
Population
  如果将 Population 列表项解析为 Area 列表项的子元素,而不是两个并排的列表项,我们在爬行时会得到错误的结果。下面我们来看看Beautiful Soup是如何处理的。
  >>> from bs4 import BeautifulSoup
>>> broken_html = &#39;AreaPopulation&#39;
>>> # parse the HTML
>>> soup = BeautifulSoup(broken_html, &#39;html.parser&#39;)
>>> fixed_html = soup.prettify()
>>> print fixed_html

Area

Population


  从上面的执行结果可以看出,Beautiful Soup可以正确解析缺失的引号并关闭标签。现在我们可以使用 find() 和 find_all() 方法来定位我们需要的元素。
  >>> ul = soup.find(&#39;ul&#39;, attrs={&#39;class&#39;:&#39;country&#39;})
>>> ul.find(&#39;li&#39;) # return just the first match
AreaPopulation
>>> ul.find_all(&#39;li&#39;) # return all matches
[AreaPopulation, Population]
  注:由于不同版本的Python内置库容错能力不同,处理结果可能与上述不同。详情请参考:。如果想知道所有的方法和参数,可以参考Beautiful Soup的官方文档
  以下是使用该方法提取样本国家面积数据的完整代码。
  >>> from bs4 import BeautifulSoup
>>> import urllib2
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> # locate the area row
>>> tr = soup.find(attrs={&#39;id&#39;:&#39;places_area__row&#39;})
>>> # locate the area tag
>>> td = tr.find(attrs={&#39;class&#39;:&#39;w2p_fw&#39;})
>>> area = td.text # extract the text from this tag
>>> print area
244,820 square kilometres
  虽然这段代码比正则表达式代码复杂,但更容易构建和理解。此外,我们不需要担心布局的微小变化,例如额外的空格和标签属性。
  3.Lxml
  Lxml 是一个基于 libxml2(一个 XML 解析库)的 Python 包。这个模块是用C语言编写的,解析速度比Beautiful Soup快,但是安装过程比较复杂。可以参考最新的安装说明。**
  与 Beautiful Soup 一样,使用 lxml 模块的第一步是将潜在的非法 HTML 解析为统一格式。以下是使用此模块解析不完整 HTML 的示例:
  >>> import lxml.html
>>> broken_html = &#39;AreaPopulation&#39;
>>> # parse the HTML
>>> tree = lxml.html.fromstring(broken_html)
>>> fixed_html = lxml.html.tostring(tree, pretty_print=True)
>>> print fixed_html
Area
Population
  同理,lxml 也可以正确解析属性两边缺失的引号并关闭标签,但是模块没有添加和标签。
  解析输入内容后,进入选择元素的步骤。这时候lxml有几种不同的方法,比如XPath选择器和类似于Beautiful Soup的find()方法。但是,我们以后会使用 CSS 选择器,因为它更简洁,可以在解析动态内容时重复使用。另外,一些有jQuery选择器使用经验的读者会比较熟悉。
  以下是使用lxml的CSS选择器提取区域数据的示例代码:
  >>> import urllib2
>>> import lxml.html
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> tree = lxml.html.fromstring(html)
>>> td = tree.cssselect(&#39;tr#places_area__row > td.w2p_fw&#39;)[0] # *行代码
>>> area = td.text_content()
>>> print area
244,820 square kilometres
  * 这行代码会先找到id为places_area__row的表格行元素,然后选择类为w2p_fw的表格数据子标签。
  CSS 选择器指示用于选择元素的模式。以下是一些常用选择器的示例:
  选择所有标签: *
选择 标签: a
选择所有 class="link" 的元素: .link
选择 class="link" 的 标签: a.link
选择 id="home" 的 标签: a#home
选择父元素为 标签的所有 子标签: a > span
选择 标签内部的所有 标签: a span
选择 title 属性为"Home"的所有 标签: a[title=Home]
  W3C 提出了 CSS3 规范,其 URL 为
  Lxml 已经实现了大部分 CSS3 属性,不支持的功能可以在:.
  注意:在lxml的内部实现中,它实际上是将CSS选择器转换成等效的XPath选择器。
  4. 性能对比
  在下面这段代码中,每个爬虫都会执行 1000 次。每次执行都会检查爬取结果是否正确,然后打印总时间。
  # -*- coding: utf-8 -*-
import csv
import time
import urllib2
import re
import timeit
from bs4 import BeautifulSoup
import lxml.html
FIELDS = (&#39;area&#39;, &#39;population&#39;, &#39;iso&#39;, &#39;country&#39;, &#39;capital&#39;, &#39;continent&#39;, &#39;tld&#39;, &#39;currency_code&#39;, &#39;currency_name&#39;, &#39;phone&#39;, &#39;postal_code_format&#39;, &#39;postal_code_regex&#39;, &#39;languages&#39;, &#39;neighbours&#39;)
def regex_scraper(html):
results = {}
for field in FIELDS:
results[field] = re.search(&#39;.*?(.*?)&#39;.format(field), html).groups()[0]
return results
def beautiful_soup_scraper(html):
soup = BeautifulSoup(html, &#39;html.parser&#39;)
results = {}
for field in FIELDS:
results[field] = soup.find(&#39;table&#39;).find(&#39;tr&#39;, id=&#39;places_{}__row&#39;.format(field)).find(&#39;td&#39;, class_=&#39;w2p_fw&#39;).text
return results
def lxml_scraper(html):
tree = lxml.html.fromstring(html)
results = {}
for field in FIELDS:
results[field] = tree.cssselect(&#39;table > tr#places_{}__row > td.w2p_fw&#39;.format(field))[0].text_content()
return results
def main():
times = {}
html = urllib2.urlopen(&#39;http://example.webscraping.com ... %2339;).read()
NUM_ITERATIONS = 1000 # number of times to test each scraper
for name, scraper in (&#39;Regular expressions&#39;, regex_scraper), (&#39;Beautiful Soup&#39;, beautiful_soup_scraper), (&#39;Lxml&#39;, lxml_scraper):
times[name] = []
# record start time of scrape
start = time.time()
for i in range(NUM_ITERATIONS):
if scraper == regex_scraper:
# the regular expression module will cache results
# so need to purge this cache for meaningful timings
re.purge() # *行代码
result = scraper(html)
# check scraped result is as expected
assert(result[&#39;area&#39;] == &#39;244,820 square kilometres&#39;)
times[name].append(time.time() - start)
# record end time of scrape and output the total
end = time.time()
print &#39;{}: {:.2f} seconds&#39;.format(name, end - start)
writer = csv.writer(open(&#39;times.csv&#39;, &#39;w&#39;))
header = sorted(times.keys())
writer.writerow(header)
for row in zip(*[times[scraper] for scraper in header]):
writer.writerow(row)
if __name__ == &#39;__main__&#39;:
main()
  请注意,我们在 * 行代码中调用了 re.purge() 方法。默认情况下,正则表达式将缓存搜索结果。公平地说,我们需要使用这种方法来清除缓存。
  以下是在我的电脑上运行脚本的结果:
  
  由于硬件条件的不同,不同电脑的执行结果也会有一定的差异。但是,每种方法之间的相对差异应该具有可比性。从结果中可以看出,在抓取我们的示例网页时,Beautiful Soup 比其他两种方法慢 7 倍以上。其实这个结果是符合预期的,因为lxml和正则表达式模块是用C语言写的,而Beautiful Soup是用纯Python写的。一个有趣的事实是 lxml 的性能几乎与正则表达式一样好。由于 lxml 必须在搜索元素之前将输入解析为内部格式,因此会产生额外的开销。当抓取同一个网页的多个特征时,这个初步分析的开销会减少,lxml会更有竞争力。因此,lxml 是一个强大的模块。
  5.总结
  三种网页抓取方式的优缺点:
  抓取方法 性能 使用困难 安装困难
  正则表达式
  快速
  难度
  简单(内置模块)
  美汤
  慢
  简单
  简单(纯 Python)
  Lxml
  快速
  简单
  比较难
  如果你的爬虫的瓶颈是下载网页,而不是提取数据,那么使用速度较慢的方法(比如Beautiful Soup)不是问题。正则表达式在一次性提取中非常有用,还可以避免解析整个网页的开销。如果你只需要爬取少量数据,又想避免额外的依赖,那么正则表达式可能更合适。不过一般情况下,lxml是爬取数据的最佳选择,因为它不仅速度更快,而且用途更广,而正则表达式和Beautiful Soup只在某些场景下有用。

python网页数据抓取(Excel教程Excel函数Excel表格制作Excel2010Excel实用技巧Excel视频教程 )

网站优化优采云 发表了文章 • 0 个评论 • 120 次浏览 • 2021-09-12 18:06 • 来自相关话题

  python网页数据抓取(Excel教程Excel函数Excel表格制作Excel2010Excel实用技巧Excel视频教程
)
  本文介绍了BeautifulSoup方法来抓取网页数据并保存
  为了方便查找和保存数据,请求模块、bs4模块BeautifulSoup方法和xlwt模块(下载方法:打开cmd,输入pip安装包名)
  本文将演示抓取豆瓣音乐排行榜()
  图如下:
  
  点击F12打开HTML源代码,我们可以看到每个
  有一个电影名字,下面有一个标签
  标签,所以我们可以定位和搜索电影名称。
  代码如下:
  #抓取网页数据,并保存
from bs4 import BeautifulSoup
import requests
import xlwt
def get_save_music(url):
#抓取数据
f = requests.get(url) #get方法访问网页
soup = BeautifulSoup(f.content, "lxml") #用xlml解析f.content获取网页全部内容html
musics = [] #定义一个列表,存放歌名
for k in soup.find_all(&#39;div&#39;, class_=&#39;intro&#39;): #,找到所有div并且class为&#39;intro&#39;的标签
for i in k.find_all(&#39;a&#39;): #再找到所有a标签
musics.append(i.string) #i.string获取文本,并添加到列表
#写入文档
work = xlwt.Workbook()
sheet = wb.add_sheet(&#39;music&#39;) #设置sheet名
for index, music in enumerate(musics): #enumerate()方法获取索引值及数据
sheet.write(index, 0, index+1) #第一竖列写入编号
sheet.write(index, 1, music) #第二竖列写入歌名
try:
work.save(&#39;music.xls&#39;) #保存文档
except PermissionError as e:
print(&#39;访问拒绝,请先关闭文档!&#39;, e)
#执行
get_save_music("https://music.douban.com/chart")
  执行成功后,文档如下:
   查看全部

  python网页数据抓取(Excel教程Excel函数Excel表格制作Excel2010Excel实用技巧Excel视频教程
)
  本文介绍了BeautifulSoup方法来抓取网页数据并保存
  为了方便查找和保存数据,请求模块、bs4模块BeautifulSoup方法和xlwt模块(下载方法:打开cmd,输入pip安装包名)
  本文将演示抓取豆瓣音乐排行榜()
  图如下:
  
  点击F12打开HTML源代码,我们可以看到每个
  有一个电影名字,下面有一个标签
  标签,所以我们可以定位和搜索电影名称。
  代码如下:
  #抓取网页数据,并保存
from bs4 import BeautifulSoup
import requests
import xlwt
def get_save_music(url):
#抓取数据
f = requests.get(url) #get方法访问网页
soup = BeautifulSoup(f.content, "lxml") #用xlml解析f.content获取网页全部内容html
musics = [] #定义一个列表,存放歌名
for k in soup.find_all(&#39;div&#39;, class_=&#39;intro&#39;): #,找到所有div并且class为&#39;intro&#39;的标签
for i in k.find_all(&#39;a&#39;): #再找到所有a标签
musics.append(i.string) #i.string获取文本,并添加到列表
#写入文档
work = xlwt.Workbook()
sheet = wb.add_sheet(&#39;music&#39;) #设置sheet名
for index, music in enumerate(musics): #enumerate()方法获取索引值及数据
sheet.write(index, 0, index+1) #第一竖列写入编号
sheet.write(index, 1, music) #第二竖列写入歌名
try:
work.save(&#39;music.xls&#39;) #保存文档
except PermissionError as e:
print(&#39;访问拒绝,请先关闭文档!&#39;, e)
#执行
get_save_music("https://music.douban.com/chart";)
  执行成功后,文档如下:
  

python网页数据抓取(如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化)

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

  python网页数据抓取(如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化)
  前几天跟大家分享了如何使用Python词云和wordart可视化工具将朋友圈数据可视化,使用Python网络爬虫抓取微信好友数和男女微信好友比例,并使用Python网络爬虫捕捉微信好友的省市分布及其可视化。感兴趣的朋友可以点击进入查看详情。内容不难。即使你是新手,也可以通过代码爬取。今天小编继续跟大家分享如何使用Python网络爬虫抓取微信好友的签名以及他们的视觉展示。具体教程如下图。
  1、代码实现还是基于itchat库。关于这个神奇的库,我在之前的文章中提到过,不再赘述。下图中代码的作用是实现签名捕获和数据提取。然后将捕获的数据写入本地文件。
  
  2、程序运行完毕后,得到一个文本文件,内容如下图。
  
  第一行的第一个签名是编辑自己的,博学的,审问的,细心的,有洞察力的,有责任心的。后续签名按照微信通讯录中名片的先后顺序呈现。如果好友有微信签名,则会被抓取,如果没有签名,则忽略。
  3、 随机验证一个微信好友的签名,然后以编辑主题的微信签名为例。她的签名是“要安全,要失去,要冷静,要顺其自然,要无可避免!” ”,在TXT文件中搜索后,可以看到签名确实在里面,如下图所示。
  
  4、接下来,我们将这个文件的词云可视化。继续写代码,如下图所示。
  
  代码的关键部分是需要底图和字体。底图的编辑器使用路飞。注意使用带有白色底图的图片,否则词云可视化效果不好。
  
  需要提前下载字体。可视化也可以参考这个文章:如何使用Python词云和艺术字可视化工具来可视化Moments数据。
  5、程序运行后,还需要扫码授权。程序运行如下图所示。
  
  红色代码部分在之前的文章文章中已经有详细说明,不再赘述。
  经过6、后我们可以看到展现在我们面前的美丽的词云图片,如下图所示。
  
  根据词云的可视化,关键词:生命、努力、时间、我们、哈哈哈……词出现的频率更高。能感受到编辑的微信朋友们的签名基本突出了积极、乐观、珍惜时间、努力工作的特点。
  说服国王拿下金榛子,说服他在他十几岁的时候拿回来。花可以折直,一定要折,没有花的不能折。祝大家周末愉快,人生苦短,我用Python~~ 查看全部

  python网页数据抓取(如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化)
  前几天跟大家分享了如何使用Python词云和wordart可视化工具将朋友圈数据可视化,使用Python网络爬虫抓取微信好友数和男女微信好友比例,并使用Python网络爬虫捕捉微信好友的省市分布及其可视化。感兴趣的朋友可以点击进入查看详情。内容不难。即使你是新手,也可以通过代码爬取。今天小编继续跟大家分享如何使用Python网络爬虫抓取微信好友的签名以及他们的视觉展示。具体教程如下图。
  1、代码实现还是基于itchat库。关于这个神奇的库,我在之前的文章中提到过,不再赘述。下图中代码的作用是实现签名捕获和数据提取。然后将捕获的数据写入本地文件。
  
  2、程序运行完毕后,得到一个文本文件,内容如下图。
  
  第一行的第一个签名是编辑自己的,博学的,审问的,细心的,有洞察力的,有责任心的。后续签名按照微信通讯录中名片的先后顺序呈现。如果好友有微信签名,则会被抓取,如果没有签名,则忽略。
  3、 随机验证一个微信好友的签名,然后以编辑主题的微信签名为例。她的签名是“要安全,要失去,要冷静,要顺其自然,要无可避免!” ”,在TXT文件中搜索后,可以看到签名确实在里面,如下图所示。
  
  4、接下来,我们将这个文件的词云可视化。继续写代码,如下图所示。
  
  代码的关键部分是需要底图和字体。底图的编辑器使用路飞。注意使用带有白色底图的图片,否则词云可视化效果不好。
  
  需要提前下载字体。可视化也可以参考这个文章:如何使用Python词云和艺术字可视化工具来可视化Moments数据。
  5、程序运行后,还需要扫码授权。程序运行如下图所示。
  
  红色代码部分在之前的文章文章中已经有详细说明,不再赘述。
  经过6、后我们可以看到展现在我们面前的美丽的词云图片,如下图所示。
  
  根据词云的可视化,关键词:生命、努力、时间、我们、哈哈哈……词出现的频率更高。能感受到编辑的微信朋友们的签名基本突出了积极、乐观、珍惜时间、努力工作的特点。
  说服国王拿下金榛子,说服他在他十几岁的时候拿回来。花可以折直,一定要折,没有花的不能折。祝大家周末愉快,人生苦短,我用Python~~

python网页数据抓取( 美国3.CSDN学院课程数据解析网页函数网页下载地址下载 )

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

  python网页数据抓取(
美国3.CSDN学院课程数据解析网页函数网页下载地址下载
)
  https://edu.csdn.net/courses/p2
https://edu.csdn.net/courses/p3
https://edu.csdn.net/courses/p4
... ...
https://edu.csdn.net/courses/p271
  页码很规律,直接写代码就可以快速爬下来。出于人文关怀,我还是把协程的数量限制在了3个,不然271个请求顺利发送就有点反感了。这不好,不符合我们的精神。
  import asyncio
import aiohttp
from lxml import etree
sema = asyncio.Semaphore(3)
async def get_html(url):
headers = {
"user-agent": "自己找个UA即可"
}
&#39;&#39;&#39;
本文来自 梦想橡皮擦 的博客
地址为: https://blog.csdn.net/hihell
可以任意转载,但是希望给我留个版权。
&#39;&#39;&#39;
print("正在操作{}".format(url))
async with aiohttp.ClientSession() as s:
try:
async with s.get(url, headers=headers, timeout=3) as res:
if res.status==200:
html = await res.text()
html = etree.HTML(html)
get_content(html) # 解析网页
print("数据{}插入完毕".format(url))
except Exception as e:
print(e)
print(html)
time.sleep(1)
print("休息一下")
await get_html(url)
async def x_get_html(url):
with(await sema):
await get_html(url)
if __name__ == &#39;__main__&#39;:
url_format = "https://edu.csdn.net/courses/p{}"
urls = [url_format.format(index) for index in range(1, 272)]
loop = asyncio.get_event_loop()
tasks = [x_get_html(url) for url in urls]
request = loop.run_until_complete(asyncio.wait(tasks))
  3.CSDN大学课程数据分析网页功能
  网页下载后,需要经过两次处理才能放入mongodb,我们只需要使用lxml库
  def get_content(html):
course_item = html.xpath("//div[@class=&#39;course_item&#39;]")
data = []
for item in course_item:
link = item.xpath("./a/@href")[0] # 获取课程详情的链接,方便我们后面抓取
tags = item.xpath(".//div[@class=&#39;titleInfor&#39;]/span[@class=&#39;tags&#39;]/text()") # 获取标签
title = item.xpath(".//div[@class=&#39;titleInfor&#39;]/span[@class=&#39;title&#39;]/text()")[0] # 获取标题
num = item.xpath(".//p[@class=&#39;subinfo&#39;]/span/text()")[0] # 学习人数
subinfo = item.xpath(".//p[@class=&#39;subinfo&#39;]/text()")[1].strip() # 作者
price = item.xpath(".//p[contains(@class,&#39;priceinfo&#39;)]/i/text()")[0].strip() # 作者
data.append({
"title":title,
"link":link,
"tags":tags,
"num":num,
"subinfo":subinfo,
"price":price
})
collection.insert_many(data)
  4. 数据存储
  将数据保存到mongodb并完成。
  
  没有特别突出的地方,简单易操作。
   查看全部

  python网页数据抓取(
美国3.CSDN学院课程数据解析网页函数网页下载地址下载
)
  https://edu.csdn.net/courses/p2
https://edu.csdn.net/courses/p3
https://edu.csdn.net/courses/p4
... ...
https://edu.csdn.net/courses/p271
  页码很规律,直接写代码就可以快速爬下来。出于人文关怀,我还是把协程的数量限制在了3个,不然271个请求顺利发送就有点反感了。这不好,不符合我们的精神。
  import asyncio
import aiohttp
from lxml import etree
sema = asyncio.Semaphore(3)
async def get_html(url):
headers = {
"user-agent": "自己找个UA即可"
}
&#39;&#39;&#39;
本文来自 梦想橡皮擦 的博客
地址为: https://blog.csdn.net/hihell
可以任意转载,但是希望给我留个版权。
&#39;&#39;&#39;
print("正在操作{}".format(url))
async with aiohttp.ClientSession() as s:
try:
async with s.get(url, headers=headers, timeout=3) as res:
if res.status==200:
html = await res.text()
html = etree.HTML(html)
get_content(html) # 解析网页
print("数据{}插入完毕".format(url))
except Exception as e:
print(e)
print(html)
time.sleep(1)
print("休息一下")
await get_html(url)
async def x_get_html(url):
with(await sema):
await get_html(url)
if __name__ == &#39;__main__&#39;:
url_format = "https://edu.csdn.net/courses/p{}"
urls = [url_format.format(index) for index in range(1, 272)]
loop = asyncio.get_event_loop()
tasks = [x_get_html(url) for url in urls]
request = loop.run_until_complete(asyncio.wait(tasks))
  3.CSDN大学课程数据分析网页功能
  网页下载后,需要经过两次处理才能放入mongodb,我们只需要使用lxml库
  def get_content(html):
course_item = html.xpath("//div[@class=&#39;course_item&#39;]")
data = []
for item in course_item:
link = item.xpath("./a/@href")[0] # 获取课程详情的链接,方便我们后面抓取
tags = item.xpath(".//div[@class=&#39;titleInfor&#39;]/span[@class=&#39;tags&#39;]/text()") # 获取标签
title = item.xpath(".//div[@class=&#39;titleInfor&#39;]/span[@class=&#39;title&#39;]/text()")[0] # 获取标题
num = item.xpath(".//p[@class=&#39;subinfo&#39;]/span/text()")[0] # 学习人数
subinfo = item.xpath(".//p[@class=&#39;subinfo&#39;]/text()")[1].strip() # 作者
price = item.xpath(".//p[contains(@class,&#39;priceinfo&#39;)]/i/text()")[0].strip() # 作者
data.append({
"title":title,
"link":link,
"tags":tags,
"num":num,
"subinfo":subinfo,
"price":price
})
collection.insert_many(data)
  4. 数据存储
  将数据保存到mongodb并完成。
  
  没有特别突出的地方,简单易操作。
  

python网页数据抓取(如何使用BeautifulSoup从网页中提取我们需要的数据,你知道吗?)

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

  python网页数据抓取(如何使用BeautifulSoup从网页中提取我们需要的数据,你知道吗?)
  通过第一部分的练习,我们有了一个正在运行的爬虫。在这一部分,我们将详细介绍如何使用 BeautifulSoup 从网页中提取我们需要的数据。学习的目标是能够使用 BeautifulSoup 从网页中提取任何数据。
  HTML 文档和 CSS 选择器
  我们知道我们爬回来的网页是由 HTML 和 CSS 组成的,HTML 文档对象模型 (DOM) 将 HTML 文档表示为树状结构。而提取网页特定数据其实就是根据指定的特征匹配文档树,读取数据内容。
  

Python爬虫入门


内容简介
<p id="content_id">这篇文章会从零开始介绍...

  我们已经有一个可运行的爬虫...

</p>
  BeautifulSoup 支持大多数 CSS 选择器。您可以使用 CSS 选择器的语法通过在标签或 BeautifulSoup 对象的 .select() 方法中传递字符串参数来查找标签。以上面的HTML为例,下面使用tag、tag+id、tag+class来定位网页元素:
  >>> soup = BeautifulSoup(html, "html.parser")
>>> soup.select("body h1")
[内容简介]
>>> soup.select("p#content_id")
[<p id="content_id">这篇文章会从零开始介绍...]
>>> soup.select("p.content_class")
[
  我们已经有一个可运行的爬虫...]
</p>
  爬虫示例
  现在回到我们抢豆瓣书的例子。下面我们来看看如何使用BeautifulSoup从网页中提取书名、封面图片、书籍介绍等。代码如下。感兴趣的读者可以添加代码提取更多内容。
  # 从BeautifulSoup对象中提取书名,封面图片和内容简介
def get_web_data(soup):
try:
# 提取书名
elements = soup.select("div#wrapper h1 span")
assert(len(elements) == 1)
print(elements[0].text.strip())
#提取图书的封面图片
elements = soup.select("div#mainpic a.nbg img")
assert(len(elements) == 1)
print(elements[0]["src"])
# 提取图书的内容简介
elements = soup.select("div#link-report span.short div.intro")
if (len(elements) == 1):
print(elements[0].text.strip())
except:
print("ERROR: failed to get data")
  提取数据的关键是分析确定网页元素的CSS选择器。幸运的是,浏览器可以帮到我们很多。以Chrome浏览器为例,在打开的网页上右击要提取的数据,在弹出的菜单项中选择勾选元素。如图,我们可以很方便的获取到元素对应的CSS选择器。
  
  好的,现在我们将部分数据提取代码添加到我们的爬虫中。再次运行程序,提取并打印出书名、封面和介绍信息。
  if __name__== "__main__":
while True:
url = get_unvisited_url()
if url == None:
break

print("\n\nGET " + url)
# 抓取网页内容
response = requests.get(url)
content = response.content.decode("utf-8")
#print(content)
# 提取页面包含的数据
soup = BeautifulSoup(content, "html.parser")
get_web_data(soup)

# 获取页面包含的链接,并加入未访问的队列
for element in soup.select("a[href]"):
new_url = element["href"].strip()
if re.match("^https://book.douban.com/subject/[0-9]+/$", new_url) == None:
continue
unvisited_urls.append(new_url)
time.sleep(1)
  总结
  在本节中,我们将详细介绍如何提取网页数据。 BeautifulSoup 有许多其他 API 来访问 html 内容。详情请参考 BeautifulSoup 文档。下一部分,我们将如何存储爬虫运行数据和捕获的各种数据。
  来源:/i65523560/ 查看全部

  python网页数据抓取(如何使用BeautifulSoup从网页中提取我们需要的数据,你知道吗?)
  通过第一部分的练习,我们有了一个正在运行的爬虫。在这一部分,我们将详细介绍如何使用 BeautifulSoup 从网页中提取我们需要的数据。学习的目标是能够使用 BeautifulSoup 从网页中提取任何数据。
  HTML 文档和 CSS 选择器
  我们知道我们爬回来的网页是由 HTML 和 CSS 组成的,HTML 文档对象模型 (DOM) 将 HTML 文档表示为树状结构。而提取网页特定数据其实就是根据指定的特征匹配文档树,读取数据内容。
  

Python爬虫入门


内容简介
<p id="content_id">这篇文章会从零开始介绍...

  我们已经有一个可运行的爬虫...

</p>
  BeautifulSoup 支持大多数 CSS 选择器。您可以使用 CSS 选择器的语法通过在标签或 BeautifulSoup 对象的 .select() 方法中传递字符串参数来查找标签。以上面的HTML为例,下面使用tag、tag+id、tag+class来定位网页元素:
  >>> soup = BeautifulSoup(html, "html.parser")
>>> soup.select("body h1")
[内容简介]
>>> soup.select("p#content_id")
[<p id="content_id">这篇文章会从零开始介绍...]
>>> soup.select("p.content_class")
[
  我们已经有一个可运行的爬虫...]
</p>
  爬虫示例
  现在回到我们抢豆瓣书的例子。下面我们来看看如何使用BeautifulSoup从网页中提取书名、封面图片、书籍介绍等。代码如下。感兴趣的读者可以添加代码提取更多内容。
  # 从BeautifulSoup对象中提取书名,封面图片和内容简介
def get_web_data(soup):
try:
# 提取书名
elements = soup.select("div#wrapper h1 span")
assert(len(elements) == 1)
print(elements[0].text.strip())
#提取图书的封面图片
elements = soup.select("div#mainpic a.nbg img")
assert(len(elements) == 1)
print(elements[0]["src"])
# 提取图书的内容简介
elements = soup.select("div#link-report span.short div.intro")
if (len(elements) == 1):
print(elements[0].text.strip())
except:
print("ERROR: failed to get data")
  提取数据的关键是分析确定网页元素的CSS选择器。幸运的是,浏览器可以帮到我们很多。以Chrome浏览器为例,在打开的网页上右击要提取的数据,在弹出的菜单项中选择勾选元素。如图,我们可以很方便的获取到元素对应的CSS选择器。
  
  好的,现在我们将部分数据提取代码添加到我们的爬虫中。再次运行程序,提取并打印出书名、封面和介绍信息。
  if __name__== "__main__":
while True:
url = get_unvisited_url()
if url == None:
break

print("\n\nGET " + url)
# 抓取网页内容
response = requests.get(url)
content = response.content.decode("utf-8")
#print(content)
# 提取页面包含的数据
soup = BeautifulSoup(content, "html.parser")
get_web_data(soup)

# 获取页面包含的链接,并加入未访问的队列
for element in soup.select("a[href]"):
new_url = element["href"].strip()
if re.match("^https://book.douban.com/subject/[0-9]+/$", new_url) == None:
continue
unvisited_urls.append(new_url)
time.sleep(1)
  总结
  在本节中,我们将详细介绍如何提取网页数据。 BeautifulSoup 有许多其他 API 来访问 html 内容。详情请参考 BeautifulSoup 文档。下一部分,我们将如何存储爬虫运行数据和捕获的各种数据。
  来源:/i65523560/

官方客服QQ群

微信人工客服

QQ人工客服


线