Python 爬虫入门 requests lxml bs4

我会带着你远行 2021-09-04 10:32 691阅读 0赞

一:前言

正式学习爬虫的第一天,感觉信息量巨大。用此篇博客来快速入门爬虫并爬取古诗文网的内容。(使用 requests lxml bs4)

9bc6456371e07b3243d45df8c83e6f60.png

cfa253b6981ecaf57ec910c17f332526.png

二:过程

2.1 获取 url 中的 html 代码

中文官方文档指引(http://docs.python-requests.org/zh_CN/latest/user/quickstart.html),内容繁琐比较多,本文精简整理必要内容。

1e6358f18ddcb1b74446099fe03b3949.png

先安装requests

  1. pip install requests

在文档中引入

  1. import requests
  2. # url 是古诗文网的
  3. url = 'https://so.gushiwen.org/guwen/Default.aspx?p=1&type=%e6%ad%a3%e5%8f%b2%e7%b1%bb'
  4. html = requests.get(url)
  5. print('该响应状态码:', html.status_code)
  6. print('相应内容:', html.text)

a7cccd52c08d7ad6fdcc98ec7ed45495.png

如此获得到相应页面的html代码

02ddb9aaa496430e7788c14f08d50cf4.png

2.2 解析所需要的HTML代码(beautifulsoup 和lxml是两种解析方式,推荐lxml方式,简单快速)

2.2.1 使用BeautifulSoup来解析

先安装bs4

  1. pip install bs4

用靓汤来对response进行解析,获取网页源代码

00994479e95066f81a32524020daf23c.png

46b0325534070ae88375406edeeeed31.png

方法:

1.find(name,attrs,recursive,text,**wargs) find(‘p’)即寻找第一个匹配的p节点

2.find_all(name,attrs,recursive,text,**wargs) find_all(‘p’)即寻找所有p节点

attrs
有两种情况则要用到参数attrs:一是标签字符中带有-,比如data-custom;二是class不能看作标签属性。解决的办法是在attrs属性用字典进行传递参数

css选择器 select()

2a25680fd77ebc131cf08941a70f70c0.png

实例解析:

  1. # 首先引入BeautifulSoup
  2. import requests
  3. from bs4 import BeautifulSoup
  4. # url 是古诗文网的
  5. url = 'https://so.gushiwen.org/guwen/Default.aspx?p=1&type=%e6%ad%a3%e5%8f%b2%e7%b1%bb'
  6. html = requests.get(url)
  7. print('该响应状态码:', html.status_code)
  8. # print(html.content)
  9. bs = BeautifulSoup(html.content, 'html.parser')
  10. b = bs.select('a')
  11. print(b)

eff3451205b88d13c818f5582fa95a01.png

6ac0ac691a8ea7b001456b3069b3fc0f.png

2.2.2 使用lxml来解析

先安装lxml

  1. pip install lxml

requests是用来获取网页源代码,lxml.etree是用来解析网页的,和beautifulsoup中的html.parser或者lxml解析是一个作用。

  1. # encoding=utf8
  2. import requests
  3. from lxml import etree
  4. # url 是古诗文网的
  5. url = 'https://so.gushiwen.org/guwen/Default.aspx?p=1&type=%e6%ad%a3%e5%8f%b2%e7%b1%bb'
  6. html = requests.get(url)
  7. print('该响应状态码:', html.status_code)
  8. et = etree.HTML(html.content)
  9. t = et.xpath('/html/body/div[2]/div[1]/div[3]/div[1]/p[2]/text()')
  10. print(t)

效果:

36c922ac5fb31080bb02516d8550ed81.png

如何获取xpath:

1.打开F12 ,选取所需要的元素

4df0333835c9dd9ecf1fba1efdd88fbb.png

  1. 复制xpath

3fb9c9b1e274334b8b6993740a94a0e5.png

  1. 替换,发现没有效果。。。。
  2. 原来是开头那里有一个这个东西

    42487fc6816b9d4305bb604ea50c368a.png

导致爬下来的内容中缺了这东西导致爬下来的内容不对称(可能是标签iframe爬不下来。。。。。。)

5df2903c1222ffec977b6513d3eabf0d.png

所以它的xpath应该改一改

aa4421203989f19354665520faab2556.png

这样就可以弄下来了。

xpath语法:

Xpath的使用要用到lxml库解析
@lang 使用@获取属性
@href
详细语法: https://www.runoob.com/xpath/xpath-syntax.html

0d7a3fda254c7f40e401055fd71dcd10.png

2.3 装饰器

891546b7eccf288f35f0b1b9419f1ce0.png

三:总结

最后发现爬虫也太难搞了吧,一不小心就掉坑里了,找了好久才发现问题。

这个可能要多练习,多熟悉套路啊!!

802b9e13fb3e7e213d4b1b6db5f71cd5.png

这几种方法多练习吧,一种不行就换另一种。

发表评论

表情:
评论列表 (有 0 条评论,691人围观)

还没有评论,来说两句吧...

相关阅读