python 爬虫入门–文字爬取
对于爬虫,相信大家都不陌生,但是如何入门,大家还是停留在了解认知阶段吗?那可以试试下边的方法,一起来试一下。
首先我们试试爬取网页中的***文本信息***
使用的是我们的一个requests 第三方库。
#使用 import 导入requests库
import requests
# 使用requests库中 get方法,打开网址
r = requests.get('https://www.qiushibaike.com/text/')
#打印出网页HTML信息
print(r.text)
下边是打印出来的内容。
C:\Users\XiaoMi>python D:\微信小程序demo1\小玩意儿\糗事百科爬虫.py
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="chrome=1,IE=edge">
<meta name="renderer" content="webkit" />
<meta name="applicable-device" content="pc">
<meta name="domain_verify" content="pmrgi33nmfuw4ir2ejyws5ltnbuweyljnnss4y3pnurcyithovuwiir2ejqwmyrtguzdgobsmezdgnbyheywcmzthbrdmmtemu4tamrqg5rtmirmej2gs3lfknqxmzjchiytkmrzgq4demjugaydcnd5">
...
这里打印出来的,就是本网站中 HTML页面代码。
——————————————————————————————
获取页面文本信息
下边获取页面中的文本信息,可以使用到相关的信息。
下边三种都是可以使用,但是各有利弊。
-
正则表达式
适用于数据的匹配,正则表达式写起来会很绕,同时页面内容稍微变化,正则就会失效。对于对正则不是很熟悉的内容,那么写出来的正则表达式会很长,简单匹配会好很多。
-
Lxml
Lxml 是专门用来解析 XML 格式文件的库,该模块用 C 语言编写,解析速度很快,和正则表达式速度差不多,但是提供了 XPath 和 CSS 选择器等定位元素的方法。
-
Beautiful Soup
这是一个 Python 实现的解析库,相比较于前两种来说,语法会更简单明了一点,文档也比较详细。唯一的一点就是运行速度比前两种方式慢几倍,当数据量非常大时相差会更多。
我们试着写一个简单的网页结构,使用一下bs4试着获取其中内容。
<body>
<div >
<ul>
<li>首页</li>
<li>新闻</li>
<li>影视</li>
</ul>
</div>
</body>
那写在python中为:
from bs4 import BeautifulSoup
html = '''
<body>
<div >
<ul>
<li>首页</li>
<li>新闻</li>
<li>影视</li>
</ul>
</div>
<p style="margin-top: 8px">
科技有限公司
</p>
</body>
'''
soup = BeautifulSoup(html, 'html.parser') #加载我们的html文件
print(soup.find('div')) # 找到 div 标签
C:\Users\XiaoMi>python D:\微信小程序demo1\小玩意儿\糗事百科爬虫.py
<div>
<ul>
<li>首页</li>
<li>新闻</li>
<li>影视</li>
</ul>
</div>
现在我们获取的就是所有div内的信息。不包含P标签信息。
现在我们试着获取,li标签中的信息。
html = '''
<body>
<div >
<ul>
<li>首页</li>
<li>新闻</li>
<li>影视</li>
</ul>
</div>
<p style="margin-top: 8px">
科技有限公司
</p>
</body>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser') #加载我们的html文件
# print(soup.find('div')) # 找到 div 标签
print(soup.find_all('li')) # 找到所有 li 标签
[<li>首页</li>, <li>新闻</li>, <li>影视</li>]
那么使用for循环,获取内部文本信息。
li = soup.find_all('li') # 找到所有 li 标签
# '[<li>首页</li>, <li>新闻</li>, <li>影视</li>]'
for i in li:
print(i.text) #获取每个 li 标签的内容
打印出内容如下:
首页
新闻
影视
============================================
那么已经可以使用我们的bs4来获取相应网页信息,
那么试着根据网页代码信息,获取一下文本信息吧。
#爬取糗事百科中文本信息
url = https://www.qiushibaike.com/text/
我们发现 其实都写在了span标签中了,那么我们可以获取所有span中文本信息。
#导入requests和bs4模块
import requests
from bs4 import BeautifulSoup
#返回网页信息
def download_page(url):
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"}
# 增加headers, 模拟浏览器
r = requests.get(url, headers=headers)
return r.text
#获取页面中相关作者性别年龄点赞数等信息,
#以及下载糗事内容和评论
def get_content(html, page):
output = """第{}页 作者:{} 性别:{} 年龄:{} 点赞:{} 评论:{}\n{}\n------------\n""" # 最终输出格式
soup = BeautifulSoup(html, 'html.parser')
con = soup.find(id='content') # 获取每一个填写的div块
# print(con)
con_list = con.find_all('div', class_="article") # 找到文章列表
print(con_list)
for i in con_list:
author = i.find('h2').string # 获取作者名字
content = i.find('div', class_='content').find('span').get_text() # 获取内容
stats = i.find('div', class_='stats')
vote = stats.find('span', class_='stats-vote').find('i', class_='number').string
comment = stats.find('span', class_='stats-comments').find('i', class_='number').string
author_info = i.find('div', class_='articleGender') # 获取作者 年龄,性别
if author_info is not None: # 非匿名用户
class_list = author_info['class']
if "womenIcon" in class_list:
gender = '女'
elif "manIcon" in class_list:
gender = '男'
else:
gender = ''
age = author_info.string # 获取年龄
else: # 匿名用户
gender = ''
age = ''
save_txt(output.format(page, author, gender, age, vote, comment, content))
#文本信息加载到统一文档,并且命名为qiubai.txt ,编码格式为UTF-8
def save_txt(*args):
for i in args:
with open('qiubai.txt', 'a', encoding='utf-8') as f:
f.write(i)
def main():
# 在页面下方可以看到共有13页,可以构造如下 url,
for i in range(1, 14):
url = 'https://qiushibaike.com/text/page/{}'.format(i)
html = download_page(url)
get_content(html, i)
if __name__ == '__main__':
main()
这样,我们第一次使用python爬虫,爬取文本信息就完了。
能跑得动的,记得点个赞呗。
后期会有其他方法更新,关注一波呗