数据采集——爬虫实战

355次阅读
没有评论

爬虫原理

网络连接
简单来说,计算机一次request请求和服务器端的response回应,即实现了网络连接。
数据采集——爬虫实战
返回响应信息的类型:
数据采集——爬虫实战
爬虫原理

网络连接需要计算机一次request请求和服务器端的response回应。爬虫也是需要做两件事:

  • 模拟计算机对服务器发起request请求。
  • 接收服务器端的response内容并解析、提取所需信息。
  • 爬虫体验:爬取北京天气信息

    使用云服务来获取信息

    请同学们复制下面的代码到idle中并运行

    import requests url = 'https://api.seniverse.com/v3/weather/daily.json?key=8eb3luvplbmdykzh&location=beijing&language=zh-Hans&unit=c&start=0&days=5' r =requests.get(url) tomorrow = r.json()['results'][0]['daily'][1] print("北京明天的最高气温是",tomorrow['high'],"摄氏度"," 最低气温是",tomorrow['low']," 摄氏度。")

    • requests库是第三方库,用于访问网站并获取网页相关信息
    • url是指统一资源定位系统,可以理解为网址
    • API是"应用编程接口"的缩写。通过 API,就算你不知道如何操作,也能将你的产品或服务与其他的互通。这样可以简化应用的开发,节省时间和成本。
    • JSON是一种与开发语言无关的、轻量级的数据存储格式,全称JavaScript Object Notation,一种数据格式的标准规范

    将上段代码的json数据输出,如下所示:
    数据采集——爬虫实战

    直接看json代码有点乱,可以使用json解析器
    https://www.sojson.com/
    数据采集——爬虫实战

    任务1
    尝试修改代码,输出风的方向风的级别

    提示:列表和字典的用法

    • 列表的格式:list=[value1,value2,value3]
    • 列表数据的获取:通过索引值获取,如获取第一个元素list[0]
    • 字典的格式:d = {key1 : value1, key2 : value2 }
    • 字典数据的获取:通过key来获取value,如d[key1]的值为value

    爬虫实例:获取《斗破苍穹》小说全文

    爬虫的一般过程为:
    准备链接——获取数据——解析数据——保存数据

    1.准备链接:

    今天我们需要准备的网址是:
    http://www.doupoxs.com/doupocangqiong/1.html

    我们需要爬取小说第一章的内容

    2.获取数据:

    • 根据上个案例代码可知,用requests.get()方法就可以获取网页上所有的信息。
    • 我们将获取的数据存储在res变量里,print(res.text)就能获得数据。

    import requests url ="http://www.doupoxs.com/doupocangqiong/1.html" res = requests.get(url) res.encoding = 'utf-8' print(res.text)

    复制代码,看能否输出网页信息

    3.解析数据:

    (1)网页构造
    打开一个网页,右击空白处,在弹出的快捷菜单中选择“检查”命令,可以看见网页的代码。(或者按下键盘F12)
    数据采集——爬虫实战
    (2)查询网页信息
    点击代码左上方箭头图标,再将鼠标光标移至网页上想要查询的信息的位置,右侧代码区会显示该元素在网页代码中的具体位置。
    数据采集——爬虫实战
    (3)定位信息
    通过手动查找的方式,发现我们需要的文字信息全部在’<.p>…<./p >'之间
    数据采集——爬虫实战
    (4)re.findall()方法抓取信息

    如何利用程序自动抓取信息呢?这里需要告诉程序我们要抓取的信息有什么特点。从上文分析可知,需要的文字信息全部在’<.p>…<./p >之间。
    可以用正则表达式来抓取信息。

    下段代码是用“贪心算法”,从字符串中找到指定子字符并输出

    • (.*?)为通用匹配符,在re.findall()方法中替换目标字符

    ##例子 import re a="<h1>第一章 陨落的天才</h1>" text=re.findall('<h1>(.*?)</h1>',a,re.S) #第一部分是规则,第二部分是需要匹配的文本,第三部分是匹配所有的字符 print(text)

    ['第一章 陨落的天才'] >>>

    正则表达式的符号很多,有兴趣的同学可以深入学习,可参考下面链接
    https://www.runoob.com/regexp/regexp-syntax.html

    尝试着用re.findall()方法解析《斗破苍穹》第一章的文本内容。

  • 获取小说第一章的URL链接
  • 通过前面介绍的requests.get()方法,获取网页上所有的信息
  • 用贪心算法re.findall()方法准确找到文本内容
  • 输出文本内容
  • import requests import re url ="http://www.doupoxs.com/doupocangqiong/1.html" res = requests.get(url) text=re.findall('<p>(.*?)</p>',res.content.decode('utf-8'),re.S) print(text)

    扩展内容:

    1.获取《斗破苍穹》整本小说的文字信息
    上文的代码只获取了一个网页的信息。
    为了爬取所有章节的信息,通过手动浏览,以下为前五章的网址:

    http://www.doupoxs.com/doupocangqiong/1.html
    http://www.doupoxs.com/doupocangqiong/2.html
    http://www.doupoxs.com/doupocangqiong/3.html
    http://www.doupoxs.com/doupocangqiong/4.html
    http://www.doupoxs.com/doupocangqiong/5.html

    可以看出,每章节的URL有明显的规律,通过数字递加来分页。可以通过循环语句来构造URL列表。
    这里我们可以使用format()方法。

    • format()方法是将字符串进行格式化,就像做了选择题,留了空给做题者选择。

    a='{} is my love'.format('python') print(a)

    python is my love >>>

    观察每个页面的URL可以发现,只有尾部的数字不一样,且十分有规律,从1开始递加,因此可以使用for…range()来构造列表。

    url =["http://www.doupoxs.com/doupocangqiong/{}.html".format(str(i)) for i in range(2,1647)] print(url)

    复制上段代码看能否输出所有的网页URL

    上文通过re.findall()获得页面的所有文本信息。要获得整本书的信息,可以设置一个循环,依次爬取每一页的信息。

    扩展任务1:
    尝试着获取整本小说的文本信息。

    2.将文字信息写入记事本文档中

    f=open('E:\doupo.txt','a+')

    在代码最开始的部分新建一个TXT文档

    扩展任务1中获取的文本内容均存储在text中,用for循环语句逐字写入记事本中

    for content in text: f.write(content+'\n')

    最后关闭文档

    f.close()

    扩展任务2:
    请将上述代码合并整理成完整的代码,使之能生成包含《斗破苍穹》全文的一个TXT文件

    小彩蛋

    import requests url ="http://www.doupoxs.com/doupocangqiong/1.html" res = requests.get(url) print(res)

    输入以上代码,得到以下结果

    <Response [200]>

    • [200]为网页正常的代号

    输入其他网址,例如https://movie.douban.com/等,看看能得返回什么代号,并上网查找该代号的含义。

    神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

    相关文章:

    版权声明:Python教程2022-10-27发表,共计3351字。
    新手QQ群:570568346,欢迎进群讨论 Python51学习