学做网络爬虫【三】- 数据提取

学做网络爬虫【一】- 爬虫原理
学做网络爬虫【二】- 数据抓取(Requests)
学做网络爬虫【三】- 数据提取
学做网络爬虫【四】- 动态HTML
学做网络爬虫【五】- Scrapy(框架)
学做网络爬虫【六】- Scrapy-redis(分布式)
学做网络爬虫【七】- 反爬虫​​​​​​​


页面解析和数据提取

一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值。内容一般分为两部分,非结构化的数据 和 结构化的数据。


非结构化的数据处理

文本、电话号码、邮箱地址

  • 正则表达式

HTML 文件

  • 正则表达式
  • XPath
  • CSS选择器

结构化的数据处理

JSON 文件

  • JSON Path
  • 转化成Python类型进行操作(json类)

XML 文件

  • 转化成Python类型(xmltodict)
  • XPath
  • CSS选择器
  • 正则表达式

为什么要学正则表达式

实际上爬虫一共就四个主要步骤:

  1. 明确目标 (要知道你准备在哪个范围或者网站去搜索)
  2. 爬 (将所有的网站的内容全部爬下来)
  3. 取 (去掉对我们没用处的数据)
  4. 处理数据(按照我们想要的方式存储和使用)

上一节的案例里实际上省略了第3步,也就是"取"的步骤。因为我们down下了的数据是全部的网页,这些数据很庞大并且很混乱,大部分的东西使我们不关心的,因此我们需要将之按我们的需要过滤和匹配出来。

那么对于文本的过滤或者规则的匹配,最强大的就是正则表达式,是Python爬虫世界里必不可少的神兵利器。

python基础 - 正则表达式(re模块)

案例:使用正则表达式的爬虫

第一步:获取数据

按照我们之前的用法,我们需要写一个加载页面的方法。

第二步:筛选数据

接下来我们已经得到了整个页面的数据。 但是,很多内容我们并不关心,所以下一步我们需要进行筛选。 如何筛选,就用到了上一节讲述的正则表达式。

  • 在我们得到的response中进行筛选匹配。

我们需要一个匹配规则:

我们可以打开网页,鼠标点击右键 " 查看源代码 " ,根据源码进行正则匹配想要的内容。

正则表达式中匹配的参数:re.S

  • 如果 没有re.S 则是 只匹配一行 有没有符合规则的字符串,如果没有则下一行重新匹配。

  • 如果 加上re.S 则是将 所有的字符串 将一个整体进行匹配,findall 将所有匹配到的结果封装到一个list中。

我们第一页的全部段子,不包含其他信息全部的打印了出来。

  • 你会发现段子中有很多 <p> , </p> 很是不舒服,实际上这个是html的一种段落的标签。
  • 在浏览器上看不出来,但是如果按照文本打印会有<p>出现,那么我们只需要把我们不希望的内容去掉即可了。

  • 我们可以如下简单修改一下 get_content().

j = re.sub(r"[<b>|</b>|<br />|<br>|<p>|</p>|\\u3000|\\r\\n|\s]","",j)
j = j.replace("&ldqo;",'"').replace("&helli;","...").replace("&dqo;",'"').strip()

第三步:保存数据

  • 我们可以将所有的内容存放在文件中。比如,我们可以将得到的每个item不是打印出来,而是存放在一个叫res.txt 的文件中也可以。
def save_content(self,content):
    myFile = open("./res.txt", 'a')
    for temp in content:
        myFile.write("\n"+temp[0]+"\n"+temp[1]+"\n")
        myFile.write("-----------------------------------------------------")
    myFile.close()
  • 然后我们实现保存的方法 ,当前页面的所有内容就存在了本地的res.txt文件中。

第四步:实现循环抓取

  • 接下来我们就通过参数的传递对page进行叠加来遍历 内涵段子吧的全部段子内容。

  • 同时也通过这个run方法实现整个程序的主要逻辑

def run(self):
        i = 1
        while True:
                html = self.load_page(self.url%i)
                result = self.get_content(html)
                print ("按回车继续...")
                print ("输入 quit 退出")
                command = input()
                if (command == "quit"):
                        break
                i+=1

最后,我们执行我们的代码,完成后查看当前路径下的res.txt文件,里面已经有了我们要的内容。

以上便是一个非常精简使用的小爬虫程序,使用起来很是方便,如果想要爬取其他网站的信息,只需要修改其中某些参数和一些细节就行了。


如果正则用的不好,处理HTML文档很累,有没有其他的方法?

有!那就是XPath,我们可以先将 HTML文件 转换成 XML文档,然后用 XPath 查找 HTML 节点或元素。

python基础 - Xpath 和 xml

案例:使用XPath的爬虫

现在我们用XPath来做一个简单的爬虫,我们尝试爬取某个贴吧里的所有帖子,并且将该这个帖子里每个楼层发布的图片下载到本地。

# coding=utf-8
import requests
from lxml import etree
import json


class Tieba:

    def __init__(self, tieba_name):
        self.tieba_name = tieba_name  # 接收贴吧名
        # 设置为手机端的UA
        self.headers = {
            "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"}

    def get_total_url_list(self):
        '''获取所有的urllist'''
        url = "https://tieba.baidu.com/f?kw=" + self.tieba_name + "&ie=utf-8&pn={}&"
        url_list = []
        for i in range(1):  # 通过循环拼接100个url
            url_list.append(url.format(i * 50))
        return url_list  # 返回100个url的urllist

    def parse_url(self, url):
        """一个发送请求,获取响应,同时etree处理html"""
        print("parsing url:", url)
        response = requests.get(url, headers=self.headers, timeout=10)  # 发送请求
        html = response.content.decode()  # 获取html字符串
        html = etree.HTML(html)  # 获取element 类型的html
        return html

    def get_title_href(self, url):
        """获取一个页面的title和href"""
        html = self.parse_url(url)
        li_temp_list = html.xpath("//a[@class='tl_shadow']")  # 分组,按照li标签分组
        total_items = []
        for i in li_temp_list:  # 遍历分组
            print(i)
            href = "https:" + i.xpath("./a/@href")[0] if len(i.xpath("./a/@href")) > 0 else None
            text = i.xpath("./a/div[1]/span[1]/text()")
            text = text[0] if len(text) > 0 else None
            item = dict(  # 放入字典
                href=href,
                text=text
            )
            total_items.append(item)
        return total_items  # 返回一个页面所有的item

    def get_img(self, url):
        '''获取一个帖子里面的所有图片'''
        html = self.parse_url(url)  # 返回elemet累心的html,具有xpath方法
        img_list = html.xpath('//div[@data-class="BDE_Image"]/@data-url')
        img_list = [i.split("src=")[-1] for i in img_list]  # 提取图片的url
        img_list = [requests.utils.unquote(i) for i in img_list]
        return img_list

    def save_item(self, item):
        '''保存一个item'''
        with open("./teibatupian.txt", "a") as f:
            f.write(json.dumps(item, ensure_ascii=False, indent=2))
            f.write("\n")
        print("end")

    def run(self):
        # 1、找到了url规律,url list
        url_list = self.get_total_url_list()
        for url in url_list:
            # 2、遍历urllist 发送请求,获得响应,etree处理html
            # 3、提取title,href
            total_item = self.get_title_href(url)
            for item in total_item:
                href = item["href"]
                img_list = self.get_img(href)  # 获取到了帖子的图片列表
                item["img"] = img_list
                # 4、保存到本地
                print(item)
                self.save_item(item)


if __name__ == "__main__":
    tieba = Tieba("猫")
    tieba.run()

jsonpath应用案例

python基础 - json与jsonpath

我们以拉勾网城市JSON文件 http://www.lagou.com/lbs/getAllCitySearchLabels.json 为例,获取所有城市。

import requests
import jsonpath
import json
import chardet

url = 'http://www.lagou.com/lbs/getAllCitySearchLabels.json'
response = requests.get(url)
html = response.text

# 把json格式字符串转换成python对象
jsonobj = json.loads(html)

# 从根节点开始,匹配name节点
citylist = jsonpath.jsonpath(jsonobj, '$..name')

print(type(citylist))
fp = open('city.json', 'w')

content = json.dumps(citylist, ensure_ascii=False)
print(content)
print(type(content.encode('utf-8')))
fp.write(content.encode('utf-8'))
fp.close()

学做网络爬虫【四】- 动态HTML

展开阅读全文

从零开始scrapy网络爬虫

01-22
课程目标 《从零开始Scrapy网络爬虫》从零开始,循序渐进地介绍了目前流行的网络爬虫框架Scrapy。即使你没有任何编程基础,习起来也不会有压力,因为我们有针对性地介绍了Python编程技术。另外,《从零开始Scrapy网络爬虫》在讲解过程中以案例为导向,通过对案例的不断迭代、优化,让读者加深对知识的理解,并通过14个项目案例,提高习者解决实际问题的能力。 适合对象 爬虫者、爬虫爱好者、高校相关专业的生、数据爬虫工程师。 课程介绍 《从零开始Scrapy网络爬虫》共13章。其中,第1~4章为基础篇,介绍了Python基础、网络爬虫基础、Scrapy框架及基本的爬虫功能。第5~10章为进阶篇,介绍了如何将爬虫数据存储于MySQL、MongoDB和Redis数据库中;如何实现异步AJAX数据的爬取;如何使用Selenium和Splash实现动态网站的爬取;如何实现模拟登录功能;如何突破反爬虫技术,以及如何实现文件和图片的下载。第11~13章为高级篇,介绍了使用Scrapy-Redis实现分布式爬虫;使用Scrapyd和Docker部署分布式爬虫;使用Gerapy管理分布式爬虫,并实现了一个抢票软件的综合项目。       由于目标网站可能会对页面进行改版或者升级反爬虫措施,如果发现视频中的方法无法成功爬取数据,敬请按照页面实际情况修改XPath的路径表达式。视频教程主要提供理论、方法支撑。我们也会在第一时间更新源代码,谢谢! 课程特色
©️2020 CSDN 皮肤主题: 创作都市 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值