Python爬取当当网销量最高的100本书

前言:这是学习Python的第三天,草草查阅了Python基础语法以后想写个demo练练手。找到一篇,效仿着写了一遍,对于初学Python爬虫的人来讲是个很好的学习案例。如下是代码解读和关键点标注。html

使用语言:Python3.7python

开发工具:PyCharm正则表达式

引用地址:json

[http://www.javashuo.com/article/p-ovmsfcer-hr.html]:函数

包的引用

# re库,提供正则表达式支持
import re
import json
# requests库,提供HTTP支持
import requests
from requests import RequestException

注意: python毕竟是个脚本语言,从上到下执行,所以写函数的时候须要注意前后顺序,最早调用的写在文件最上方,main函数通常在最下方,不然会报'XXX' is not defined喔!工具

执行步骤

一、经过url获取网页内容

# 经过url地址拿到网页内容
def get_page(url):
     try:
         result = requests.get(url)
         if result.status_code == 200:
             return result.text
         return None
     except RequestException:
         return None

这里写法比较固定,你可能须要去了解的是HTTP各类状态码:学习

[https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660?fr=aladdin]:开发工具

二、正则解析

# 正则表达式解析网页数据,获取想要的信息
def compile_html(html):
    pattern = re.compile('<li>.*?list_num.*?>(.*?).</div>.*?<img.*?src="(.*?)".*?class="name".*?title="(.*?)".*?class="tuijian">(.*?)</span>.*?</li>', re.S)
    items = re.findall(pattern, html)
    for item in items:
        yield {
            'index': item[0],
            'image': item[1],
            'title': item[2],
            'introducePercent': item[3]
        }

这里你须要注意两部分:ui

  • 正则的写法

话说我在今天以前,对正则的理解真的→0,好在这里的正则不难。“.*?”三个符号构成一个模糊替换单位,若是(.*?)使用括号括起来,表示括号内的内容就是你要获取的内容。你只须要写出.*?x(.*?)y.*?就能够过滤出元素x与y之间的数据了,easy HA~?编码

  • compile与findall

首先,re.compile(pattern, flags)的解释:

​ pattern 指定编译时的表达式字符串;

​ flags 编译标志位,用来声明正则表达式的匹配方式。支持 re.L|re.M 同时匹配

因此,这里pattern 不须要解释,这里的flags的声明可查文档,例:re.S 表明匹配包括换行在内的全部字符。

因此re.findall(pattern, html)还须要解释?返回匹配成功的对象啊!

到此,这篇文章的核心代码其实也就结束了。。。Yeah~ That’s it.

三、写入文件

# 把数据保存在本地
def save_to_txt(item):
    with open("books.txt", "a+", encoding="utf-8") as file:
        file.write(json.dumps(item, ensure_ascii=False) + "\n")
        file.close()

这里须要注意俩部分:

  • open的时候声明一下编码方式

  • json.dumps(item, ensure_ascii=False)

    (1) json.dumps() 将字典转化为字符串;

    (2) ensure_ascii=False:json.dumps 序列化时对中文默认使用ascii编码,想输出真正的中文须要指定ensure_ascii=False

四、总体实现

# 主函数模块
def main(pageIndex):
    # 根据不一样页数获取对应页面数据,当当网每条数据在20条
    url = "http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-" + str(pageIndex)
    # 获取url中的网页内容
    html = get_page(url)
    # 正则表达式获取每条信息并打印,打印后存入本地文本文件
    for item in compile_html(html):
        print(item)
        save_to_txt(item)

if __name__ == '__main__':
    for i in range(1, 6):
        main(i)

嗯,总体代码比较简单,初学python很适合。Over~

相关文章
相关标签/搜索