精华内容
下载资源
问答
  • 小白学 Python 爬虫(25):爬取股票信息

    万次阅读 多人点赞 2019-12-24 08:43:56
    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...

    人生苦短,我用 Python

    前文传送门:

    小白学 Python 爬虫(1):开篇

    小白学 Python 爬虫(2):前置准备(一)基本类库的安装

    小白学 Python 爬虫(3):前置准备(二)Linux基础入门

    小白学 Python 爬虫(4):前置准备(三)Docker基础入门

    小白学 Python 爬虫(5):前置准备(四)数据库基础

    小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装

    小白学 Python 爬虫(7):HTTP 基础

    小白学 Python 爬虫(8):网页基础

    小白学 Python 爬虫(9):爬虫基础

    小白学 Python 爬虫(10):Session 和 Cookies

    小白学 Python 爬虫(11):urllib 基础使用(一)

    小白学 Python 爬虫(12):urllib 基础使用(二)

    小白学 Python 爬虫(13):urllib 基础使用(三)

    小白学 Python 爬虫(14):urllib 基础使用(四)

    小白学 Python 爬虫(15):urllib 基础使用(五)

    小白学 Python 爬虫(16):urllib 实战之爬取妹子图

    小白学 Python 爬虫(17):Requests 基础使用

    小白学 Python 爬虫(18):Requests 进阶操作

    小白学 Python 爬虫(19):Xpath 基操

    小白学 Python 爬虫(20):Xpath 进阶

    小白学 Python 爬虫(21):解析库 Beautiful Soup(上)

    小白学 Python 爬虫(22):解析库 Beautiful Soup(下)

    小白学 Python 爬虫(23):解析库 pyquery 入门

    小白学 Python 爬虫(24):2019 豆瓣电影排行

    引言

    上一篇的实战写到最后没有用到页面元素解析,感觉有点小遗憾,不过最后的电影列表还是挺香的,真的推荐一看。

    本次选题是先写好代码再写的文章,绝对可以用到页面元素解析,并且还需要对网站的数据加载有一定的分析,才能得到最终的数据,并且小编找的这两个数据源无 ip 访问限制,质量有保证,绝对是小白练手的绝佳之选。

    郑重声明: 本文仅用于学习等目的。

    分析

    首先要爬取股票数据,肯定要先知道有哪些股票吧,这里小编找到了一个网站,这个网站上有股票的编码列表:https://hq.gucheng.com/gpdmylb.html 。

    打开 Chrome 的开发者模式,将股票代码一个一个选出来吧。具体过程小编就不贴了,各位同学自行实现。

    我们可以将所有的股票代码存放在一个列表中,剩下的就是找一个网站,循环的去将每一只股票的数据取出来咯。

    这个网站小编已经找好了,是同花顺,链接: http://stockpage.10jqka.com.cn/000001/ 。

    想必各位聪明的同学已经发现了,这个链接中的 000001 就是股票代码。

    我们接下来只需要拼接这个链接,就能源源不断的获取到我们想要的数据。

    实战

    首先,还是先介绍一下本次实战用到的请求库和解析库为: Requests 和 pyquery 。数据存储最后还是落地在 Mysql 。

    获取股票代码列表

    第一步当然是先构建股票代码列表咯,我们先定义一个方法:

    def get_stock_list(stockListURL):
        r =requests.get(stockListURL, headers = headers)
        doc = PyQuery(r.text)
        list = []
        # 获取所有 section 中 a 节点,并进行迭代
        for i in doc('.stockTable a').items():
            try:
                href = i.attr.href
                list.append(re.findall(r"\d{6}", href)[0])
            except:
                continue
        list = [item.lower() for item in list]  # 将爬取信息转换小写
        return list
    

    将上面的链接当做参数传入,大家可以自己运行下看下结果,小编这里就不贴结果了,有点长。。。

    获取详情数据

    详情的数据看起来好像是在页面上的,但是,实际上并不在,实际最终获取数据的地方并不是页面,而是一个数据接口。

    http://qd.10jqka.com.cn/quote.php?cate=real&type=stock&callback=showStockDate&return=json&code=000001
    

    至于是怎么找出来,小编这次就不说,还是希望各位想学爬虫的同学能自己动动手,去寻找一下,多找几次,自然就摸到门路了。

    现在数据接口有了,我们先看下返回的数据吧:

    showStockDate({"info":{"000001":{"name":"\u5e73\u5b89\u94f6\u884c"}},"data":{"000001":{"10":"16.13","8":"16.14","9":"15.87","13":"78795234.00","19":"1262802470.00","7":"16.12","15":"40225508.00","14":"37528826.00","69":"17.73","70":"14.51","12":"5","17":"945400.00","264648":"0.010","199112":"0.062","1968584":"0.406","2034120":"9.939","1378761":"16.026","526792":"1.675","395720":"-948073.000","461256":"-39.763","3475914":"313014790000.000","1771976":"1.100","6":"16.12","11":""}}})
    

    很明显,这个结果并不是标准的 json 数据,但这个是 JSONP 返回的标准格式的数据,这里我们先处理下头尾,将它变成一个标准的 json 数据,再对照这页面的数据进行解析,最后将分析好的值写入数据库中。

    def getStockInfo(list, stockInfoURL):
        count = 0
        for stock in list:
            try:
                url = stockInfoURL   stock
                r = requests.get(url, headers=headers)
                # 将获取到的数据封装进字典
                dict1 = json.loads(r.text[14: int(len(r.text)) - 1])
                print(dict1)
    
                # 获取字典中的数据构建写入数据模版
                insert_data = {
                    "code": stock,
                    "name": dict1['info'][stock]['name'],
                    "jinkai": dict1['data'][stock]['7'],
                    "chengjiaoliang": dict1['data'][stock]['13'],
                    "zhenfu": dict1['data'][stock]['526792'],
                    "zuigao": dict1['data'][stock]['8'],
                    "chengjiaoe": dict1['data'][stock]['19'],
                    "huanshou": dict1['data'][stock]['1968584'],
                    "zuidi": dict1['data'][stock]['9'],
                    "zuoshou": dict1['data'][stock]['6'],
                    "liutongshizhi": dict1['data'][stock]['3475914']
                }
                cursor.execute(sql_insert, insert_data)
                conn.commit()
                print(stock, ':写入完成')
            except:
                print('写入异常')
                # 遇到错误继续循环
                continue
    

    这里我们加入异常处理,因为本次爬取的数据有些多,很有可能由于某些原因抛出异常,我们当然不希望有异常的时候中断数据抓取,所以这里添加异常处理继续抓取数据。

    完整代码

    我们将代码稍作封装,完成本次的实战。

    import requests
    import re
    import json
    from pyquery import PyQuery
    import pymysql
    
    # 数据库连接
    def connect():
        conn = pymysql.connect(host='localhost',
                               port=3306,
                               user='root',
                               password='password',
                               database='test',
                               charset='utf8mb4')
    
        # 获取操作游标
        cursor = conn.cursor()
        return {"conn": conn, "cursor": cursor}
    
    connection = connect()
    conn, cursor = connection['conn'], connection['cursor']
    
    sql_insert = "insert into stock(code, name, jinkai, chengjiaoliang, zhenfu, zuigao, chengjiaoe, huanshou, zuidi, zuoshou, liutongshizhi, create_date) values (%(code)s, %(name)s, %(jinkai)s, %(chengjiaoliang)s, %(zhenfu)s, %(zuigao)s, %(chengjiaoe)s, %(huanshou)s, %(zuidi)s, %(zuoshou)s, %(liutongshizhi)s, now())"
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }
    
    def get_stock_list(stockListURL):
        r =requests.get(stockListURL, headers = headers)
        doc = PyQuery(r.text)
        list = []
        # 获取所有 section 中 a 节点,并进行迭代
        for i in doc('.stockTable a').items():
            try:
                href = i.attr.href
                list.append(re.findall(r"\d{6}", href)[0])
            except:
                continue
        list = [item.lower() for item in list]  # 将爬取信息转换小写
        return list
    
    
    def getStockInfo(list, stockInfoURL):
        count = 0
        for stock in list:
            try:
                url = stockInfoURL   stock
                r = requests.get(url, headers=headers)
                # 将获取到的数据封装进字典
                dict1 = json.loads(r.text[14: int(len(r.text)) - 1])
                print(dict1)
    
                # 获取字典中的数据构建写入数据模版
                insert_data = {
                    "code": stock,
                    "name": dict1['info'][stock]['name'],
                    "jinkai": dict1['data'][stock]['7'],
                    "chengjiaoliang": dict1['data'][stock]['13'],
                    "zhenfu": dict1['data'][stock]['526792'],
                    "zuigao": dict1['data'][stock]['8'],
                    "chengjiaoe": dict1['data'][stock]['19'],
                    "huanshou": dict1['data'][stock]['1968584'],
                    "zuidi": dict1['data'][stock]['9'],
                    "zuoshou": dict1['data'][stock]['6'],
                    "liutongshizhi": dict1['data'][stock]['3475914']
                }
                cursor.execute(sql_insert, insert_data)
                conn.commit()
                print(stock, ':写入完成')
            except:
                print('写入异常')
                # 遇到错误继续循环
                continue
    def main():
        stock_list_url = 'https://hq.gucheng.com/gpdmylb.html'
        stock_info_url = 'http://qd.10jqka.com.cn/quote.php?cate=real&type=stock&callback=showStockDate&return=json&code='
        list = get_stock_list(stock_list_url)
        # list = ['601766']
        getStockInfo(list, stock_info_url)
    
    if __name__ == '__main__':
        main()
    

    成果

    最终小编耗时 15 分钟左右,成功抓取数据 4600 条,结果就不展示了。

    示例代码

    本系列的所有代码小编都会放在代码管理仓库 Github 和 Gitee 上,方便大家取用。

    示例代码-Github

    示例代码-Gitee

    您的扫码关注,是对小编坚持原创的最大鼓励:)
    展开全文
  • 人生苦短,我用 Python前文传送门:小白学 Python 爬虫(1):开篇小白学 Python 爬虫(2):前置准备(一)基本类库的安装小白学 Python 爬虫(3):前置准备(二)Linux基础入门小白学 Python 爬虫(4):前置准备(三)Docker...
    7abf1eaf73f3aa3b59ce9eb8c8d2e9b4.png

    人生苦短,我用 Python

    前文传送门:

    小白学 Python 爬虫(1):开篇

    小白学 Python 爬虫(2):前置准备(一)基本类库的安装

    小白学 Python 爬虫(3):前置准备(二)Linux基础入门

    小白学 Python 爬虫(4):前置准备(三)Docker基础入门

    小白学 Python 爬虫(5):前置准备(四)数据库基础

    小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装

    小白学 Python 爬虫(7):HTTP 基础

    小白学 Python 爬虫(8):网页基础

    爬虫的核心

    什么是爬虫,讲点通俗易懂的,爬虫就是爬取网页,从中按照一定规则提取信息,重复以上过程自动化重复完成的程序。

    9df07bc7dcaf12370e9e1609bdab91c7.png

    一只爬虫,第一件事情就是要爬取网页,这里主要是指获取网页的源代码。在网页的源代码里,会含有我们所需要的信息,而我们要做的事情就是从源代码中将这些信息提取出来。

    我们请求网页的时候, Python 为我们提供了很多库来做这件事情,比如官方提供的 urllib ,以及第三方提供的 requests 、 Aiohttp 等。

    我们可以使用这些库来发送 HTTP 请求,获取响应的数据,得到响应之后,我们只需要解析其中 body 部分的数据,就可以获得网页的源代码。

    获取到源代码以后,我们接下来的工作就是解析源代码,从中提取出我们需要的数据。

    提取数据最基础也是最常用的是使用正则表达式的方式的,但是这种方式比较复杂,也比较容易出错,不过不得不说,一个正则表达式写的非常厉害的人,完全用不着下面的这些解析类库,这是一个万能的方法。

    悄悄的说一句,小编的正则表达式写的也不好,才会使用到这些由第三方提供的类库。

    用于提取数据的类库有 Beautiful Soup 、 pyquery 、 lxml 等等。使用这些库,我们可以高效快速地从 HTML 中提取网页信息,如节点的属性、文本值等。

    a43392db76c7405ea5642cd1dd087157.png

    从源代码中提取到数据以后,我们会对数据进行保存,这里的保存形式多种多样,可以直接保存成 txt 、 json 、 Excel 文件等等,也可以保存至数据库,如 Mysql 、 Oracle 、 SQLServer 、 MongoDB 等等。

    82bc44cf03261545e85d3d7e1fbd407c.png

    抓取的数据格式

    一般而言,我们抓取到的都是 HTML 的网页源代码,这个是我们看得到的、常规的、直观的网页信息。

    但是有些信息,并不是直接和 HTML 一起返回至网页的,会存在各种各样的 API 接口,这种接口返回的数据现在大多数是 JSON 的格式,也有一些会返回 XML 的数据格式,还会有一些个别的奇葩的接口直接返回程序猿自定义的字符串。这种 API 数据接口就需要具体问题具体分析了。

    还有一些信息,比如各大图片站、视频站(如抖音、 B站),我们想要爬取的信息是图片或者视频,这些信息是已二进制的形式存在的,我们需要将这些二进制的数据爬取下来再进行转储。

    此外,我们还能抓取到一些资源文件,如 CSS 、 JavaScript 等脚本资源,有的还会有一些 woff 等字体信息。这些信息是一个网页组成不可或缺的元素,只要浏览器能访问到的,我们都可以将其爬取下来。

    现代前端页面爬取

    今天核心内容来了!!!

    221a77843c147c5c8ef0a0657792f05e.png

    很多时候,我们使用 HTTP 请求库爬取网页源代码时,爬取到的信息和我们在网页上看到的信息完全不一样,只有短短的几行。

    这是因为最近这几年,前端技术突飞猛进,大量的采用前端模块化工具来构建前端页面,比较常用的框架有 Vue 、 React 等等。

    导致我们获取到的网页只有一个空壳子,例如这种:

      演示项目 We're sorry but xxxxxx doesn't work properly without JavaScript enabled. Please enable it to continue.     

    代码来源是博主平时做的一些小东西,其中博主已经省略大量引入的 JavaScript。

    body 节点里面只有一个 id 为 app 的节点,但是需要注意在 body 节点的最后引入了 JavaScript 文件,它们负责整个网页的渲染。

    在浏览器打开这个页面后,首先会加载这个 HTML 的内容,接着会发现有 JavaScript 的脚本文件加载,获取到这些脚本文件后,开始执行其中的代码,而 JavaScript 脚本文件则会修改整个页面的 HTML 代码,向其中添加节点,从而完成整个页面的渲染。

    但是当我们使用请求库去请求这个页面的时候,只能获得当前的 HTML 的内容,它并不会去帮我们获取这个 JavaScript 脚本文件并且帮我们执行这个脚本文件渲染整个 HTML DOM 节点,我们当然也就看不到浏览器当中看到的内容。

    这也解释了为什么有时我们得到的源代码和浏览器中看到的不一样。

    当然,遇到这种情况也不要慌,我们还可以使用Selenium、Splash这样的库来实现模拟浏览器中的 JavaScript 渲染。

    后面,我们会慢慢聊这些内容,本文主要先帮各位同学对爬虫有一个基础的了解,方便后续的学习。

    参考:

    https://cuiqingcai.com/5484.html

    展开全文
  • 人生苦短,我用 Python前文传送门:小白学 Python 爬虫(1):开篇小白学 Python 爬虫(2):前置准备(一)基本类库的安装小白学 Python 爬虫(3):前置准备(二)Linux基础入门小白学 Python 爬虫(4):前置准备(三)Docker...

    e424340f71858aaae2004ad3041af3c1.gif

    12edfa3102e5144dfd36aa9ef2a892d7.gif

    34564e0ccf0f175d7f452e31d96f23cd.png

    人生苦短,我用 Python

    前文传送门:

    小白学 Python 爬虫(1):开篇

    小白学 Python 爬虫(2):前置准备(一)基本类库的安装

    小白学 Python 爬虫(3):前置准备(二)Linux基础入门

    小白学 Python 爬虫(4):前置准备(三)Docker基础入门

    小白学 Python 爬虫(5):前置准备(四)数据库基础

    小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装

    小白学 Python 爬虫(7):HTTP 基础

    小白学 Python 爬虫(8):网页基础

    小白学 Python 爬虫(9):爬虫基础

    小白学 Python 爬虫(10):Session 和 Cookies

    小白学 Python 爬虫(11):urllib 基础使用(一)

    小白学 Python 爬虫(12):urllib 基础使用(二)

    小白学 Python 爬虫(13):urllib 基础使用(三)

    小白学 Python 爬虫(14):urllib 基础使用(四)

    小白学 Python 爬虫(15):urllib 基础使用(五)

    小白学 Python 爬虫(16):urllib 实战之爬取妹子图

    引言

    在前面的前置准备中,我们安装了好多第三方的请求库,如 Request 、 AioHttp 等,不知各位同学还有印象不,没印象的同学可以翻翻前面的文章。

    前面几篇文章我们大致了解了 urllib 的基本用法,其中确实有很多使用不便的地方,如处理 Cookies 或者使用代理访问的时候,都需要使用 Opener 和 Handler 来处理。

    这时,更加强大的 Request 库的出现就顺理成章。有了 Request 库,我们可以更加简单方便的使用这些高阶操作。

    简介

    首先还是各种官方地址敬上:

    • GitHub:https://github.com/requests/requests

    • 官方文档:http://www.python-requests.org

    • 中文文档:http://docs.python-requests.org/zh_CN/latest

    这里列出各种官方文档的目的是希望各位同学能养成查阅官方文档的习惯,毕竟小编也是人,也会犯错,相比较而言,官方文档的错误率会非常低,包括有时候一些疑难问题都能通过官方文档来解决。

    各种基础概念我们已经在介绍 urllib 基础使用的时候都介绍过了,这里也就不再多 BB ,直接进入干货环节:写代码 。

    这里我们使用的测试地址依然事前面提到过的:https://httpbin.org/ 。

    GET 请求

    GET 请求是我们最常用的请求,先来了解一下如何使用 Requests 发送一个 GET 请求。代码如下:

    import requests

    r = requests.get('https://httpbin.org/get')
    print(r.text)

    结果如下:

    {
    "args": {},
    "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.22.0"
    },
    "origin": "116.234.254.11, 116.234.254.11",
    "url": "https://httpbin.org/get"
    }

    这里就不多讲了,和前面的 urllib 是一样的。

    如果我们想在 GET 请求中添加请求参数,需要如何添加呢?

    import requests

    params = {
    'name': 'geekdigging',
    'age': '18'
    }

    r1 = requests.get('https://httpbin.org/get', params)
    print(r1.text)

    结果如下:

    {
    "args": {
    "age": "18",
    "name": "geekdigging"
    },
    "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.22.0"
    },
    "origin": "116.234.254.11, 116.234.254.11",
    "url": "https://httpbin.org/get?name=geekdigging&age=18"
    }

    可以看到,请求的链接被自动构造成了:https://httpbin.org/get?name=geekdigging&age=18 。

    值得注意的一点是, r1.text 返回的数据类型是 str 类型,但是实际上是一个 json ,如果想直接将这个 json 转化成我们可以直接使用的字典格式,可以使用以下方法:

    print(type(r1.text))
    print(r1.json())
    print(type(r.json()))

    结果如下:

    <class 'str'>
    {'args': {'age': '18', 'name': 'geekdigging'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.22.0'}, 'origin': '116.234.254.11, 116.234.254.11', 'url': 'https://httpbin.org/get?name=geekdigging&age=18'}
    <class 'dict'>

    添加请求头:

    import requests

    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
    'referer': 'https://www.geekdigging.com/'
    }
    r2 = requests.get('https://httpbin.org/get', headers = headers)
    print(r2.text)

    结果如下:

    {
    "args": {},
    "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "Referer": "https://www.geekdigging.com/",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
    },
    "origin": "116.234.254.11, 116.234.254.11",
    "url": "https://httpbin.org/get"
    }

    与 urllib.request 一样,我们也是通过 headers 参数来传递头信息。

    如果我们想要抓取一张图片或者一个视频这种文件,可以怎么做呢?

    这些文件本质上都是由二进制码组成的,由于有特定的保存格式和对应的解析方式,我们才可以看到这些形形色色的多媒体。所以,想要抓取它们,就要拿到它们的二进制码。

    比如我们抓取一张百度上的 logo 图片,图片地址为:https://www.baidu.com/img/superlogo_c4d7df0a003d3db9b65e9ef0fe6da1ec.png

    import requests

    r3 = requests.get("https://www.baidu.com/img/superlogo_c4d7df0a003d3db9b65e9ef0fe6da1ec.png")
    with open('baidu_logo.png', 'wb') as f:
    f.write(r3.content)

    结果小编就不展示了,可以正常下载。

    POST 请求

    我们接着来介绍一个非常常用的 POST 请求。和上面的 GET 请求一样,我们依然使用: https://httpbin.org/post 进行测试。示例代码如下:

    import requests

    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
    'referer': 'https://www.geekdigging.com/'
    }

    params = {
    'name': 'geekdigging',
    'age': '18'
    }

    r = requests.post('https://httpbin.org/post', data = params, headers = headers)
    print(r.text)

    结果如下:

    {
    "args": {},
    "data": "",
    "files": {},
    "form": {
    "age": "18",
    "name": "geekdigging"
    },
    "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Content-Length": "23",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "Referer": "https://www.geekdigging.com/",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
    },
    "json": null,
    "origin": "116.234.254.11, 116.234.254.11",
    "url": "https://httpbin.org/post"
    }

    我们在这个 POST 请求中添加了请求头和参数。

    Response 响应

    上面我们使用过 text 和 json 来获取响应内容,除了这两个,还有很多属性和方法可以用来获取其他信息。

    我们来访问百度首页演示一下:

    import requests

    r = requests.get('https://www.baidu.com')
    print(type(r.status_code), r.status_code)
    print(type(r.headers), r.headers)
    print(type(r.cookies), r.cookies)
    print(type(r.url), r.url)
    print(type(r.history), r.history)

    结果如下:

    <class 'int'> 200
    <class 'requests.structures.CaseInsensitiveDict'> {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Thu, 05 Dec 2019 13:24:11 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:23:55 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
    <class 'requests.cookies.RequestsCookieJar'> Cookie BDORZ=27315 for .baidu.com/>]>
    <class 'str'> https://www.baidu.com/
    <class 'list'> []

    这里分别打印输出 status_code 属性得到状态码,输出 headers 属性得到响应头,输出 cookies 属性得到 Cookies ,输出 url 属性得到 URL ,输出 history 属性得到请求历史。

    示例代码

    本系列的所有代码小编都会放在代码管理仓库 Github 和 Gitee 上,方便大家取用。

    示例代码-Githubhttps://github.com/meteor1993/python-learning/tree/master/python-spider/requests-demo

    示例代码-Giteehttps://gitee.com/inwsy/python-learning/tree/master/python-spider/requests-demo

    ced6b3145f32497d88304d6e2a5f7e53.gif

    fc50b2956479a5ce4f557529a09e5907.gif

    展开全文
  • 小白学 Python 爬虫(9):爬虫基础

    千次阅读 2019-12-03 08:42:37
    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...

    人生苦短,我用 Python

    前文传送门:

    小白学 Python 爬虫(1):开篇

    小白学 Python 爬虫(2):前置准备(一)基本类库的安装

    小白学 Python 爬虫(3):前置准备(二)Linux基础入门

    小白学 Python 爬虫(4):前置准备(三)Docker基础入门

    小白学 Python 爬虫(5):前置准备(四)数据库基础

    小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装

    小白学 Python 爬虫(7):HTTP 基础

    小白学 Python 爬虫(8):网页基础

    爬虫的核心

    什么是爬虫,讲点通俗易懂的,爬虫就是爬取网页,从中按照一定规则提取信息,重复以上过程自动化重复完成的程序。

    一只爬虫,第一件事情就是要爬取网页,这里主要是指获取网页的源代码。在网页的源代码里,会含有我们所需要的信息,而我们要做的事情就是从源代码中将这些信息提取出来。

    我们请求网页的时候, Python 为我们提供了很多库来做这件事情,比如官方提供的 urllib ,以及第三方提供的 requests 、 Aiohttp 等。

    我们可以使用这些库来发送 HTTP 请求,获取响应的数据,得到响应之后,我们只需要解析其中 body 部分的数据,就可以获得网页的源代码。

    获取到源代码以后,我们接下来的工作就是解析源代码,从中提取出我们需要的数据。

    提取数据最基础也是最常用的是使用正则表达式的方式的,但是这种方式比较复杂,也比较容易出错,不过不得不说,一个正则表达式写的非常厉害的人,完全用不着下面的这些解析类库,这是一个万能的方法。

    悄悄的说一句,小编的正则表达式写的也不好,才会使用到这些由第三方提供的类库。

    用于提取数据的类库有 Beautiful Soup 、 pyquery 、 lxml 等等。使用这些库,我们可以高效快速地从 HTML 中提取网页信息,如节点的属性、文本值等。

    从源代码中提取到数据以后,我们会对数据进行保存,这里的保存形式多种多样,可以直接保存成 txt 、 json 、 Excel 文件等等,也可以保存至数据库,如 Mysql 、 Oracle 、 SQLServer 、 MongoDB 等等。

    抓取的数据格式

    一般而言,我们抓取到的都是 HTML 的网页源代码,这个是我们看得到的、常规的、直观的网页信息。

    但是有些信息,并不是直接和 HTML 一起返回至网页的,会存在各种各样的 API 接口,这种接口返回的数据现在大多数是 JSON 的格式,也有一些会返回 XML 的数据格式,还会有一些个别的奇葩的接口直接返回程序猿自定义的字符串。这种 API 数据接口就需要具体问题具体分析了。

    还有一些信息,比如各大图片站、视频站(如抖音、 B站),我们想要爬取的信息是图片或者视频,这些信息是已二进制的形式存在的,我们需要将这些二进制的数据爬取下来再进行转储。

    此外,我们还能抓取到一些资源文件,如 CSS 、 JavaScript 等脚本资源,有的还会有一些 woff 等字体信息。这些信息是一个网页组成不可或缺的元素,只要浏览器能访问到的,我们都可以将其爬取下来。

    现代前端页面爬取

    今天核心内容来了!!!

    很多时候,我们使用 HTTP 请求库爬取网页源代码时,爬取到的信息和我们在网页上看到的信息完全不一样,只有短短的几行。

    这是因为最近这几年,前端技术突飞猛进,大量的采用前端模块化工具来构建前端页面,比较常用的框架有 Vue 、 React 等等。

    导致我们获取到的网页只有一个空壳子,例如这种:

    <!DOCTYPE html>
    <html lang="en" style="background-color: #26282A; height: 100%">
      <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
        <link rel="icon" href="<%= BASE_URL %>favicon.ico">
        <title>演示项目</title>
      </head>
      <style>
        html,
        body,
        #app {
          height: 100%
        }
      </style>
      <body>
        <noscript>
          <strong>We're sorry but xxxxxx doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
        </noscript>
        <div id="app"></div>
        <!-- built files will be auto injected -->
        <script src=/js/chunk-vendors.84ee7bec.js></script>
        <script src=/js/app.4170317d.js></script>
      </body>
    </html>
    

    代码来源是博主平时做的一些小东西,其中博主已经省略大量引入的 JavaScript。

    body 节点里面只有一个 id 为 app 的节点,但是需要注意在 body 节点的最后引入了 JavaScript 文件,它们负责整个网页的渲染。

    在浏览器打开这个页面后,首先会加载这个 HTML 的内容,接着会发现有 JavaScript 的脚本文件加载,获取到这些脚本文件后,开始执行其中的代码,而 JavaScript 脚本文件则会修改整个页面的 HTML 代码,向其中添加节点,从而完成整个页面的渲染。

    但是当我们使用请求库去请求这个页面的时候,只能获得当前的 HTML 的内容,它并不会去帮我们获取这个 JavaScript 脚本文件并且帮我们执行这个脚本文件渲染整个 HTML DOM 节点,我们当然也就看不到浏览器当中看到的内容。

    这也解释了为什么有时我们得到的源代码和浏览器中看到的不一样。

    当然,遇到这种情况也不要慌,我们还可以使用Selenium、Splash这样的库来实现模拟浏览器中的 JavaScript 渲染。

    后面,我们会慢慢聊这些内容,本文主要先帮各位同学对爬虫有一个基础的了解,方便后续的学习。

    参考:

    https://cuiqingcai.com/5484.html

    您的扫码关注,是对小编坚持原创的最大鼓励:)
    展开全文
  • 人生苦短,我用 Python前文传送门:小白学 Python 爬虫(1):开篇小白学 Python 爬虫(2):前置准备(一)基本类库的安装小白学 Python 爬虫(3):前置准备(二)Linux基础入门小白学 Python 爬虫(4):前置准备(三)Docker...
  • 人生苦短,我用 Python前文传送门:小白学 Python 爬虫(1):开篇小白学 Python 爬虫(2):前置准备(一)基本类库的安装小白学 Python 爬虫(3):前置准备(二)Linux基础入门小白学 Python 爬虫(4):前置准备(三)Docker...
  • 人生苦短,我用 Python如果我的文章对您有帮助,请关注支持下作者的公众号:极客挖掘机,您的关注,是对小编坚持原创的最大鼓励:)前文传送门:小白学 Python 爬虫(1):开篇小白学 Python 爬虫(2):前置准备(一)基本...
  • 小白学 Python 爬虫(19):Xpath 基操

    千次阅读 多人点赞 2019-12-16 08:48:33
    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...
  • 小白学 Python 爬虫(8):网页基础

    千次阅读 2019-12-02 08:44:45
    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...
  • 小白学 Python 爬虫(30):代理基础

    千次阅读 2019-12-30 08:43:13
    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...
  • 小白学 Python 爬虫(7):HTTP 基础

    千次阅读 2019-11-29 08:43:52
    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...
  • 小白学 Python 爬虫(20):Xpath 进阶

    千次阅读 2019-12-17 08:46:14
    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...
  • 人生苦短,我用 Python如果我的文章对您有帮助,请关注支持下作者的公众号:极客挖掘机,您的关注,是对小编坚持原创的最大鼓励:)前文传送门:小白学 Python 爬虫(1):开篇小白学 Python 爬虫(2):前置准备(一)基本...
  • 人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...
  • 人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...
  • 人生苦短,我用 Python前文传送门:小白学 Python 爬虫(1):开篇小白学 Python 爬虫(2):前置准备(一)基本类库的安装小白学 Python 爬虫(3):前置准备(二)Linux基础入门小白学 Python 爬虫(4):前置准备(三)Docker...
  • 人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...
  • 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 ...
  • 人生苦短,我用 Python如果我的文章对您有帮助,请关注支持下作者的公众号:极客挖掘机,您的关注,是对小编坚持原创的最大鼓励:)前文传送门:小白学 Python 爬虫(1):开篇小白学 Python 爬虫(2):前置准备(一)基本...
  • 人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...
  • 人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...
  • 人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...
  • 人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...
  • 人生苦短,我用 Python如果我的文章对您有帮助,请关注支持下作者的公众号:极客挖掘机,您的关注,是对小编坚持原创的最大鼓励:)前文传送门:小白学 Python 爬虫(1):开篇小白学 Python 爬虫(2):前置准备(一)基本...
  • 人生苦短,我用 Python前文传送门:小白学 Python 爬虫(1):开篇小白学 Python 爬虫(2):前置准备(一)基本类库的安装小白学 Python 爬虫(3):前置准备(二)Linux基础入门小白学 Python 爬虫(4):前置准备(三)Docker...
  • 人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...
  • 人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...
  • 人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)...小白学 Python 爬虫(6):前置准备(...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,786
精华内容 714
关键字:

小白学python爬虫

python 订阅
爬虫 订阅