爬虫基础——正则、xpath、lxml

1. 直接使用正则re模块的方法

1.1 Re模块直接使用的一些常用方法主要有

  match 方法:从起始位置开始查找,也可以设置从某个位置开始匹配,一次匹配

  search 方法:从任何位置开始查找,也可以设置从某个位置开始匹配,一次匹配

   findall 方法:全部匹配也可以设置从某个位置开始匹配,返回列表

   finditer 方法:全部匹配也可以设置从某个位置开始匹配,返回迭代器

   split 方法:分割字符串,返回列表

   sub 方法:替换,替换多少个字符串

1.2 使用compile 函数后的方法

   1使用 compile() 函数将正则表达式的字符串形式编译为一个 Pattern 对象

   2通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果,一个 Match 对象。

   3最后使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作

  4)re.S和re.I

    re.I:忽略大小写

    re.S:全文匹配


import re

content = "hello world python and python"
#正则表达式:r"python"
#内容:"hello world python and python "
pattern = re.compile(r"python")
#从6位置开始匹配到末尾,匹配成功一个后返回
ret = pattern.match(content,12,len(content))
print(ret)

2. 什么是XML?

XML 指可扩展标记语言(EXtensible Markup Language

XML 是一种标记语言,很类似 HTML

XML 的设计宗旨是传输数据,而非显示数据

2.1 lxml库--解析和提取 HTML/XML 数据

lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据

lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。

lxml python 官方文档:http://lxml.de/index.html

2.2  基本用法

from lxml import etree

html = etree.parse('./hello.html')
# 显示etree.parse() 返回类型
# 获取所有的 <li> 标签
result = html.xpath('//li')
# 获取<li> 标签的所有 class属性
result = html.xpath('//li/@class')
# 继续获取<li>标签下hre f为 link1.html 的 <a>标签
result = html.xpath('//li/a[@href="link1.html"]')
#  获取<li> 标签下的所有 <span> 标签
result = html.xpath('//li//span')
#  获取 <li> 标签下的<a>标签里的所有 class
li_lists = html.xpath("//li/a//@class")
# 获取最后一个 <li> 的 <a> 的 href
li_lists = html.xpath('//li[last()]/a/@href')
# 获取倒数第二个元素li的内容
li_lists = html.xpath('//li[last()-1]/a/text()')
# 获取 class 值为 bold 的标签名
li_lists = html.xpath('//*[@class="bold"]')

3.  使用xpath得到百度贴吧帖子里面的图片

from urllib import parse
from urllib.request import urlopen,Request
from lxml import etree

image_name = 1

#请求网络,返回某个主页html代码
def load_page(full_url,file_name):
   print("正在下载:%s" % file_name)
   #去百度贴吧请求的时候添加请求头的信息和没有添加返回有区别,不要添加请求头
   request = Request(full_url)
   # 打开连接
   response = urlopen(request)
   #返回数据
   return response.read()

#得到贴吧的某页的所以帖子的链接,并且返回
def get_tiebar_urls(html,page):
   print("正在使用xpath得到[%s]页的帖子链接...." % page)
   content = etree.HTML(html)
   tiebar_urls = content.xpath('//div[@class="threadlist_lz clearfix"]/div/a[@rel="noreferrer"]/@href')
   for tiebar_url in tiebar_urls:
      tiebar_url = "http://tieba.baidu.com"+tiebar_url
      # print(tiebar_url)
      get_image_urls(tiebar_url)

#根据某个帖子,从里面得到所以图片的链接
def get_image_urls(tieba_url):
   request = Request(tieba_url)
   # 打开连接
   response = urlopen(request)
   # 返回数据
   html = response.read()
   #得到使用lxml转换后的数据
   content = etree.HTML(html)
   image_urls = content.xpath('//div[@class="d_post_content j_d_post_content "]/img/@src')
   for image_url in image_urls:
      print(image_url)

#组拼1~6页的连接
def tieba_spide(url,start_page,end_page):
  
   for page in range(start_page,end_page+1):
      #每页50条数据:根据数据库分页公式:select * from students where limit (n-1)*m ,m
      #(n-1)*m是起始数据;m是每页多少条数据
      pn = (page-1) * 50
      full_url = url+"&pn="+ str(pn)
      #文件名称
      file_name = "第"+str(page) +"页.html"

      response_data = load_page(full_url,file_name)
      #得到某个贴吧的帖子的所以链接
      get_tiebar_urls(response_data,page)



if __name__ == "__main__":
   kw = input("请输入你要爬取的贴吧名称:")
   start_page = int(input("请输入起始页:"))
   end_page = int(input("请输入结束页面:"))

   kw = {"kw":kw}

   #转换成url编码
   kw = parse.urlencode(kw)

   url = "https://tieba.baidu.com/f?"

   url = url + kw
   # print("url==",url)
   #组装1~6页的数据
   tieba_spide(url,start_page,end_page)

   print("谢谢使用!")



猜你喜欢

转载自blog.csdn.net/fenglei0415/article/details/80315810