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

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

使用语言:Python3.7

开发工具:PyCharm

引用地址:

[https://my.oschina.net/u/3887904/blog/2965738]:

包的引用

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

注意: python毕竟是个脚本语言,从上到下执行,因此写函数的时候需要注意先后顺序,最先调用的写在文件最上方,main函数一般在最下方,否则会报'XXX' is not defined喔!

执行步骤

1、通过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]:

2、正则解析
# 正则表达式解析网页数据,获取想要的信息
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]
        }

这里你需要注意两部分:

  • 正则的写法

话说我在今天之前,对正则的理解真的→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.

3、写入文件
# 把数据保存在本地
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

4、整体实现
# 主函数模块
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~

转载于:https://my.oschina.net/u/2427564/blog/3001098

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值