Python爬虫实战

需求

具体需求

有一个儿童绘本故事的网站,我想把它的绘本都抓下来

  1. 在本地新建以故事名字命名的文件夹
  2. 然后把每个绘本故事的图片下载下来放到这个文件件
  3. 绘本页面的图片要按顺序命名(0,1,2,3)方便后续操作

这是网站的一些页面的预览

主页:

 具体内容页:

思路

  1. 打开主页解析主页内容获取所有文章列表链接
  2. 解析主页获取下一页链接(因为文章展示是分页的)
  3. 根据#1获取的文章页链接打开具体文章页
  4. 解析文章页过滤所有的图片然后下载到本地
  5. 解析文章页拿到文章下一页的链接(文章内容也是分页的)

代码

上面步骤看起来很多,其实代码并没有多少

用到的工具

  • requests 请求网页内容
  • BeautifulSoup 解析网页内容
  • re 正则匹配
  • os 创建文件

源码分析

主页解析

1. 打开主页

    url = 'https://www.qigushi.com/huiben/index.html'
    headers = {
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.53"}
    r = requests.get(url, verify=False, headers=headers)
    html = r.text.encode(r.encoding).decode()
    soup = BeautifulSoup(html, 'html.parser')

2. 获取所有的页数链接然后循环进入每页的页面

 3. 进过分析我们看出他们的文章都是放到li list里面然后class也是一样的

    pages = soup.select("div .page-links a:not(:last-child)")

    for page in pages:
        # find art list first
        page_link = base_host + page["href"]
        print("start get page: " + page_link)
        r = requests.get(page_link, verify=False)
        page_soup = BeautifulSoup(r.content, 'html.parser')
        arts = page_soup.find_all("li", class_="infinitescroll_li")
        for art in arts:
            detail_link = art.find_all("div", class_="img")[0].find("a")["href"]
            matchObj = re.search(r'https://.*', detail_link, re.M | re.I)
            if matchObj:
                print("start get art: " + detail_link)
                parse_detail_page(detail_link)

文章页解析

1. 先拿到文章标题,然后用标题名建立文件夹

 

def mkdir(path):
    folder = os.path.exists(path)
    if not folder:  # 判断是否存在文件夹如果不存在则创建为文件夹
        os.makedirs(path)  # makedirs 创建文件时如果路径不存在会创建这个路径
        print("create new folder: " + path)
        return True
    else:
        print("existed folder, skip to create: " + path)
        return False
    count = 0
    r = requests.get(link, verify=False)
    soup = BeautifulSoup(r.content, 'html.parser')
    title = soup.select("div .title h1")[0].text
    file_path = base_folder + title
    mkdir(file_path)

2. 因为文章的页数最多显示6个,但是他有可能超过6个,我们在网页上是拿不到一共是有多少页的,所以我们这边要通过点击下一页的方式来进入到下一页​​​​​​​

 

    have_next = True
    while have_next:
        next_page = soup.select("div.pagebox i.fa-chevron-right")
        if next_page.__len__() == 0:
            have_next = False
        else:
            next_link = base_host + next_page[0].parent["href"]
            print("start get next page: " + next_link)
            next_r = requests.get(next_link, verify=False)
            next_soup = BeautifulSoup(next_r.content, 'html.parser')
            count = parse_page(next_soup, count, file_path)
            soup = next_soup

3. 解析当前网页内容拿到图片并下载到文件夹

def parse_page(soup, count, file_path):
    cur_imgs = soup.select("div .article_content img")
    name = ""
    for img in cur_imgs:
        count = count + 1
        img_link = img["src"]
        if name == "":
            name = img["alt"]
        if not img_link.startswith("https"):
            img_link = base_host + img_link
        print("start get art: {} page of {}".format(name, count))
        r = requests.get(img_link, verify=False)
        with open('{}/{}.png'.format(file_path, count), 'wb') as f:
            f.write(r.content)
    return count

运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值