网页抓取数据百度百科(聊一聊Python与网络爬虫的主要框架程序的特点及应用)

优采云 发布时间: 2022-03-09 19:26

  网页抓取数据百度百科(聊一聊Python与网络爬虫的主要框架程序的特点及应用)

  我们来谈谈 Python 和网络爬虫。

  1、爬虫的定义

  Crawler:自动抓取互联网数据的程序。

  2、爬虫主要框架

  

  爬虫程序的主框架如上图所示。爬虫调度器通过URL管理器获取要爬取的URL链接。如果URL管理器中有需要爬取的URL链接,爬虫调度器调用网页下载器下载对应的URL。网页,然后调用网页解析器解析网页,将网页中新的URL添加到URL管理器中,输出有价值的数据。

  3、爬虫时序图

  

  4、网址管理器

  网址管理器管理要爬取的URL集合和已经爬取的URL集合,防止重复爬取和循环爬取。 URL管理器的主要功能如下图所示:

  

  URL管理器的实现主要使用Python中的内存(set)和关系型数据库(MySQL)。对于小程序,一般在内存中实现,Python 内置的 set() 类型可以自动判断元素是否重复。对于较大的程序,一般采用数据库来实现。

  5、网页下载器

  Python中的网页下载器主要使用了urllib库,这是python自带的一个模块。对于2.x版本的urllib2库,在其request和其他子模块中集成到python3.x中的urllib中。 urllib 中的 urlopen 函数用于打开 url 并获取 url 数据。 urlopen函数的参数可以是url链接,也可以是请求对象。对于简单的网页,直接使用url字符串作为参数就足够了,但是对于复杂的网页,带有反爬虫机制的网页,在使用urlopen函数时,需要添加http头。对于有登录机制的网页,需要设置cookie。

  6、网页解析器

  网页解析器从网页下载器下载的 url 数据中提取有价值的数据和新的 url。对于数据提取,可以使用正则表达式、BeautifulSoup等方法。正则表达式使用基于字符串的模糊匹配,对特征比较鲜明的目标数据有很好的效果,但并不通用。 BeautifulSoup 是一个用于对 url 内容进行结构化解析的第三方模块。下载的网页内容被解析成 DOM 树。下图是BeautifulSoup截取的百度百科网页的部分输出。

  

  BeautifulSoup的具体使用会在以后写文章。以下代码使用python抓取百度百科中其他英雄联盟相关条目,并将这些条目保存在新建的excel中。以上代码:

  from bs4 import BeautifulSoup import re import xlrd import xlwt from urllib.request import urlopenexcelFile=xlwt.Workbook() sheet=excelFile.add_sheet('英雄联盟') ## 维基百科:英雄联盟## html=urlopen( "") bsObj=BeautifulSoup(html.read(),"html.parser") #print(bsObj.prettify()) row=0 for node in bsObj.find("div",{"class":"main- content"}).findAll("div",{"class":"para"}): links=node.findAll("a",href=pile("^(/view/)[0-9]+. htm$")) 用于链接中的链接:if 'href' in link.attrs:print(link.attrs['href'],link.get_text())sheet.write(row,0,link.attrs['href '])sheet.write(row,1,link.get_text())row=row+1excelFile.save('E:ProjectPythonlol.xls')

  部分输出截图如下:

  

  excel部分截图如下:

  

  以上就是本文的全部内容,希望对大家学习Python网络爬虫有所帮助。

  自动发微博最简单的方法是调用新浪微博的API(因为发微博很简单,不需要使用它的SDK)。编码参考开发文档

  创建应用

  要使用微博的API,你需要先有一个应用程序。任何申请都可以,你可以去这里注册一个现场申请申请注册。注册应用的主要目的是获取MY_A*敏*感*词*EY和MY_ACCESS_TOKEN,如图

  

  获取 access_token

  API 调用需要登录授权才能获取 access_token。参考

  首先调用接口获取代码。

  接口有三个必填参数:

  •client_id:申请应用时分配的A*敏*感*词*ey。

  •redirect_url:是创建应用中设置的回调地址

  •response_type:响应类型,可设置为code

  具体方法是在浏览器中打开:///response&response_type=code。该方法会进入授权页面,授权后会进入url中的CODE。

  接下来调用接口获取access_token。

  接口有以下必要参数:

  •client_id:申请应用时分配的A*敏*感*词*ey。

  •client_secret:申请应用时分配的AppSecret。

  •grant_type:请求的类型,填写authorization_code

  •code:调用authorize获取的code值。

  •redirect_uri:是创建应用程序中设置的回调地址

  具体方法是构造一个POST请求,然后在返回的数据中找到access_token并保存。具体Python代码:

  import requestsurl_get_token = ""#Build POST 参数 playload = {"client_id":"填写你的","client_secret":"填写你的","grant_type":"authorization_code","code":" 获取的代码above","re​​direct_uri":"你的回调地址"}#POST请求r = requests.post(url_get_token,data=playload)#输出响应信息打印r.text

  如果正常,会返回如下json数据:

  {"access_token":"我们要记住的内容","re​​mind_in":"157679999","expires_in":157679999,"uid":"1739207845"}

  根据返回的数据,access_token的值就是我们想要的。 remember_in 的值是 access_token 的有效期,以秒为单位。我们可以看到,这个时间是3、4年,对我们来说已经足够了。

  发布纯文本推文

  调用接口发布文字微博,参数如下

  

  这是必需的:

  •access_token:这是我们上一步得到的access_token

  •状态:要发布的微博文字内容必须经过URL编码,内容不得超过140个汉字

  具体代码:

  #微博发文接口 url_post_a_text = ""#构建 POST 参数 playload = {"access_token":"填写你的","status":"这是一个文本 test@TaceyWong"}#POST 请求,发文微博r = requests.post(url_post_a_text,data = playload)

  如果正常,会有如下结果

  

  发一条带图片的微博

  调用接口发布图片微博,其参数如下:

  

  所需参数:

  •access_token:这是我们上一步得到的access_token

  •状态:要发布的微博文字内容必须经过URL编码,内容不得超过140个汉字

  •pic:要发布的图片,采用multipart/form-data编码方式

  具体代码:

  #微博发图文接口 url_post_pic = ""#构建文本类POST参数playload={"access_token":"2.0086XhtBIQLH7Ed67706b6c8TQ8XdE","status":"测试:发一个带a的文本pic & AT某人@馠子覠"}#构造二进制multipart/form-data编码参数files={"pic":open("logo.png","rb")}#POST请求,发布微博r=requests。 post(url_post_pic,data=playload,files=files)

  如果正常,结果如下:

  

  注意:requests的具体用法请参考[requests document]()

  本文总结了python遍历目录的方法。分享给大家,供大家参考,如下:

  方法一使用递归:

  """def WalkDir(dir, dir_callback = None, file_callback = None): for item in os.listdir(dir):print item;fullpath = dir + os.sep + itemif os.path.isdir(fullpath) :WalkDir(fullpath,dir_callback,file_callback)if dir_callback:dir_callback(fullpath)else:if file_callback:file_callback(fullpath)"""def DeleteDir(dir): print "path"#os.rmdir(dir)def DeleteFile(file) : try:print "file"#os.unlink( file ) except WindowsError, e:passWalkDir( os.environ['TEMP'], DeleteDir, DeleteFile )

  方法二:

  import os, statdef WalkDir( dir, dir_callback = None, file_callback = None ): for root, dirs, files in os.walk(dir): for f in files:print ffile_path = os.path.join(root, f)if file_callback: file_callback(file_path)for d in dirs:dir_path = os.path.join(root, d)if dir_callback: dir_callback(dir_path)def DeleteDir(dir): print "path"#os.rmdir(dir) def DeleteFile( file ): try:print "file"#os.unlink( file ) except WindowsError, e:passWalkDir( os.environ['TEMP'], DeleteDir, DeleteFile )

  希望这篇文章对你的 Python 编程有所帮助。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线