文本内容获取-python爬虫

  • Post author:
  • Post category:python




前言

本文汇总各种方法对web爬取的方法。

国内无法访问Google,在必应也可以使用高级检索指令来过滤内容,可以获取大部分表层网络和少部分深层网络的内容,使用这种技术互联网上绝大部分能访问的资源应该都是可以获取的,这取决于搜索引擎的网络爬虫爬取的广度和深度,个人建议使用顶级的搜索引擎。或者使用聚合多个搜索引擎的结果的搜索引擎,它没有爬虫,而是针对其它搜索引擎返回的结果进行处理

找资源个人建议使用网盘搜索引擎(比如罗马盘,​史莱​姆搜索,以及资源网站和资源导航网站)和BT搜索引擎(电影娱乐资源丰富些,去中心化)。公开的个人网盘的资源质量相对较高,找电子书资源很适合。网盘搜索引擎使用爬虫技术爬取特定网站公布的网盘资源信息,有些结合调用搜索引擎API的返回的结果,资源还是比较全的,但是百度网盘大部分私密的资源是无法获取的,还有公布了但是不知道验证码的资源也是无法获取的。如果可以获取百度网盘用户列表和用户资源列表,将网盘资源解析为直链就更好了,但是用户隐私将被侵犯。

★一些网站和论坛也可以获取不好找的资源,有些需要注册账号和使用积分。这些网站或许资源不全面,但是在某些专业方向资源丰富,有些只是内部共享交流,外面找不到的。

当然如果拥有顶级的黑客技术,潜在能访问的资源是能访问的,整个互联网的存储设备都是你外存。

使用网络爬虫和搜索引擎API+搜索引擎高级检索技术对特定资源、信息网站(打★这些网站)进行采集处理分析。Web API,URL及其参数。★自己用Python写爬虫程序。​



目的

本文通过python工具,对网页信息进行爬取下载



原理

借鉴:

1、python网络爬虫入门篇:

https://www.cnblogs.com/wenwei-blog/p/10435602.html

:其博客对python部分学习比较基础,可学习

2、结合http协议的爬虫介绍:

https://www.cnblogs.com/sss4/p/7809821.html



要点

一、基本原理

模拟浏览器发送请求(获取网页代码)——>提取有用的数据——>存放于数据库或文件中

二、使用的库

Requests:用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库。

URL管理器:管理待爬取的url集合和已爬取的url集合,传送待爬取的url给网页下载器。

网页下载器(urllib):爬取url对应的网页,存储成字符串,传送给网页解析器。

网页解析器(BeautifulSoup):解析出有价值的数据,存储下来,同时补充url到URL管理器。



准备工作

python工具下载安装:详情请移步到

这里


库安装:window系统,进入cmd,输入pip install 对应库名称,若遇到意外,请移步到

这里



爬取工作

分为两部分,一是初级的,获取网页全部内容,较简单,入门操作学习;二是高级的,获取网页特定内容,即获取自己想要的内容,这个需要借用很多种方法,难点之处。



一、获取网页全部内容



方法一:使用基于urllib编写的requests库


官方学习requests链接


一、代码1

import requests
req = requests.get("目标网址")
print(req.text)

1、代码解析如下:

import request:导入request库

req = requests.get(“目标网址”):requests.get函数对目标网址进行处理,并把传回值赋值到变量req中,存储在变量req中有很多内容,其中网页内容会固定存在req.txt中

print(req.txt):打印出网页内容

2、应用案例

import requests
req = requests.get("https://rate.bot.com.tw/xrt?Lang=zh-TW")
print(req.text)

输入如下结果:

在这里插入图片描述

3、故障收集

故障1:报如下error

在这里插入图片描述

解决办法:将.py名字修改成不以requests命名。

二、代码二

1、代码和解析:

#一、requests库的get()方法:命令:requests.get(url,params=None,**kwargs)
#1、url:拟获取页面的url链接
#2、params:url中的额外参数,字典活字节流格式,可选
#**kwargs:12个控制访问的参数
import requests
def getHTMLText(url):
    try:
        r = requests.get(url,timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "产生异常"

if __name__ == "__main__":
    url = "http://www.baidu.com"
    print(getHTMLText(url))

执行结果如下:

在这里插入图片描述

2、应用

import requests
url = 'http://product.dangdang.com/26487763.html'
try:
    r = requests.get(url)
    r.raise_for_status()
    r.encoding =r.apparent_encoding
    print(r.text[:1000])
except IOError as e:
    print(str(e))

执行结果出现如下问题:

HTTPConnectionPool(host=‘127.0.0.1’, port=80): Max retries exceeded with url: /26487763.html (Caused by NewConnectionError(‘<urllib3.connection.HTTPConnection object at 0x000002019275A2B0>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。’))

报错原因:当当网拒绝不合理的浏览器访问,查看http请求头:

在这里插入图片描述

#命令:requests.method(url,**kwargs)
#解析:1、method:请求方式,对应有get/put/post等7种
#2、url:获取页面的url链接
#3、**kwargs:控制访问的参数,均为可选项,共13个,其中一个,params:字典或字节系列,作为参数增加到url中;headers:字典,http定制头
import requests
url = 'http://product.dangdang.com/26487763.html'
try:
    hd = {'user-agent':'Mozilla/5.0'} 
    r = requests.get(url,headers=hd)  #这里的headers=hd,是上述解析中的http定制头的写法
    r.raise_for_status()
    r.encoding =r.apparent_encoding
    print(r.text[:1000])
except IOError as e:
    print(str(e))

执行结果如下:

在这里插入图片描述



方法二:使用网页下载urllib


学习请移步这里

import urllib.request

response = urllib.request.urlopen('http://www.baidu.com')
buff = response.read()
html = buff.decode("utf8")
print(html)



二、获取网页特定内容



方法一:使用网页解析Beautiful Soup——标签类内容

Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析“标签树”等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。

Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。

库安装:pip install beautifulsoup4

1、核心代码解析如下

在这里插入图片描述

soup = BeautifulSoup(req.text,features="html.parser")  

用html解析器(parser)来分析我们requests得到的html文字内容,soup就是我们解析出来的结果

company_item = soup.find("div",class_="detail_head")  

find是查找,find_all查找全部。查找标记名是div并且class属性是detail_head的全部元素

dd = company_item.text.strip()

strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。在这里就是移除多余的尖括号的html数据

2、应用案例

示例1:

在这里插入图片描述

import requests   #导入我们需要的requests功能模块
from bs4 import BeautifulSoup  #使用BeautifulSoup这个功能模块来把充满尖括号的html数据变为更好用的格式,from bs4 import BeautifulSoup这个是说从bs4这个功能模块中导入BeautifulSoup,是的,因为bs4中包含了多个模块,BeautifulSoup只是其中一个

req = requests.get(url="https://www.crrcgo.cc/admin/crr_supplier.html?page=1")  #使用get方式获取该网页的数据。实际上我们获取到的就是浏览器打开百度网址时候首页画面的数据信息
#print(req.text)   #把我们获取数据的文字(text)内容输出(print)出来
req.encoding = "utf-8"  #指定获取的网页内容,即第二句定义req的内容,用utf-8编码
html = req.text   #指定获取的网页内容,即第二句定义req的内容,用text
soup = BeautifulSoup(req.text,features="html.parser")  #用html解析器(parser)来分析我们requests得到的html文字内容,soup就是我们解析出来的结果
company_item = soup.find("div",class_="detail_head")  #find是查找,find_all查找全部。查找标记名是div并且class属性是detail_head的全部元素
dd = company_item.text.strip()   #strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。在这里就是移除多余的尖括号的html数据
print(dd)

示例2:

在这里插入图片描述

获取class_=的内容,操作如下:

在这里插入图片描述

3、不足

(1)当想获取的数据,网页F12选中后发现不是< p >的内容,代码执行失败

在这里插入图片描述

在这里插入图片描述

(2)失败案例2

在这里插入图片描述

在这里插入图片描述

搜索:AttributeError: ‘NoneType’ object has no attribute ‘text’



方法二:使用基于网页下载urlib编写的request——标签类内容

添加头等信息headers,headers是解决requests请求反爬的方法之一,相当于我们进去这个网页的服务器本身,假装自己本身在爬取数据。对反爬虫网页,可以设置一些headers信息,模拟成浏览器取访问网站 。

在这里插入图片描述

header = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
}
import requests
from lxml import html
url = 'https://movie.douban.com/' #爬取的网址
header = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"} #heard,反爬克星
page = requests.Session().get(url, headers=header)
tree = html.fromstring(page.text)
result = tree.xpath('//div[@class="nav-items"]//a/text()')# 参数查询方式如下下图
print(result)

结果如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述



方法三:使用pandas库——表格类内容

方法1:使用pandas库

import pandas
dfs = pandas.read_html("目标网址")
print(dfs[0])

1、代码解析如下:

dfs = pandas.read_html(“目标网址”):使用pandas.read_html函数对目标网址处理,把传回的结果保存在dfs变量,存储在dfs变量的内容有很多,但只要pandas有侦测到表格资料,就会放在第0号元素里面

print(dfs[0]):根据pandas的特性,使用print将dfs第0号元素打印出来

2、应用案例

import pandas

dfs = pandas.read_html("https://rate.bot.com.tw/xrt?Lang=zh-TW")
print(dfs[0])



方法四:正则表达式



方法五:Scrapy框架



附录


https://blog.csdn.net/Appleyk/article/details/78070098



爬取网址数据很仔细的教程,推荐推荐



版权声明:本文为stqer原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。