分享

谈一谈|以实践谈爬虫思路

 算法与编程之美 2020-08-08

1.开篇

本文旨在给python初学者在进行爬虫时进行一些启发,主要是给出爬虫的基本思路,然后介绍这个第一次成果。

2.爬虫介绍

简单的爬虫主要分为四部分:了解网页、获取网页数据、解析网页、清洗数据。首先需要了解几个库:requests,beautifulsoup,urllib等。这些都是接触爬虫必须用到的库,不必再过多介绍。下面就通过四个部分来完成一次简单爬虫。

3.步骤解析

本次任务是从:

http://www.chinacdio./List_Extend.aspx?id=101&CurrentPage=0所有页面上的pdf文件下载下来,并且pdf文件名和网页上的文件名一致。

首先分析该网页:

图3.1 第一页

图3.2 第二页

可以发现网址最后“page=“后的数字可以代表页数,既然如此,那么就可以通过一个for循环将四个数字填充到“page=”后以来获取这四页的信息。目录页分析完就该分析每一项的网页:

图3.3 第一项内容

图3.4 第二项内容

这里笔者只点进了两页,可以看到网址中除了id进行变化其他均未变,只要细心去找,其他所有页面皆如此,那么我们的下一步就是从目录页中找到每一个子网页的id。

图3.5 解析目录获得子网页id

运用谷歌浏览器开发者功能,很容易能找到其id,通过beautifulsoup解析获取的目录页,根据每个id前的标签截取id储存在list中。有了独特的id,就可以自动从list中获取id填充至固有网址,达到自动分别解析所有子页面。然后再看单个pdf:

图3.6 pdf1

图3.7 pdf2

相信规律很容易被发现,和获取id的方式一样,运用谷歌开发者功能,利用标签,从子网页中找到每个pdf的名字,也就是每个pdf网址中不同的部分,并保存至一个list。

接下来就是最后一步,前面的操作无非是使用了几个for循环将改网页下所有页面的pdf名称也就是最后获取pdf网址中不同部分保存了起来。只需要最后一个for循环将这些带入到不变的部分中,就可以获取每个pdf网址内容,因为每个pdf网页中无其它内容,只需要将所有数据保存,写入一个.pdf文件中就完成了。Pdf的名称也可以从最后一个list中获取。

Python代码:

import requests

from bs4 import BeautifulSoup

from urllib import parse

for page in range(0,4):

 html=requests.get("http://www.chinacdio./List_Extend.aspx?id=101&CurrentPage=%d"%page)

     html = html.text

     soup = BeautifulSoup(html,"lxml")

     Id_list = []

     for item in soup.find_all(class_="main"):

         for link in item.find_all("li"):

            for i in  link.find_all("a"):

                pdf_link =  i["href"]

                Id = "".join([x for  x in pdf_link if 48<=ord(x)<=57][:-3])

                Id_list.append(int(Id))

     pdf_dict = {}

     pdf_names = []

     for i in Id_list:

         page_html=requests.get("http://www.chinacdio./Detail_Code.aspx?Content_ID=%d&Channel_ID=101"%i)

         page_html = page_html.text

         page_soup = BeautifulSoup(page_html,"lxml")

         for item in page_soup.find_all(class_="main"):

            for item2 in  item.find_all("a"):

                pdf_name =  item2["href"]

                if pdf_name[0:7] ==  "/Upload" and pdf_name[-4:] == ".pdf":

                    pdf_dict[pdf_name] =  item2.text

                pdf_names.append(pdf_name)

     for name in pdf_names:

         if name[-4:] == ".pdf":

            name = name[7:]

            name1 = parse.quote(name)

            pdf_html=requests.get("http://www.chinacdio./upload/%s"%name1)

            pdf_html.encoding =  pdf_html.apparent_encoding

            # print(pdf_html)

            with open('%s'%name, 'wb') as f:

                f.write(pdf_html.content)

            print("%s       下载完成!"%name)

            print()

         else:

            continue

     for name in pdf_dict.keys():

         if name[-4:] == ".pdf":

            names = name[8:]

             pdf_html=requests.get("http://www.chinacdio./Upload/%s"  % names)

            pdf_html.encoding =  pdf_html.apparent_encoding

            # print(pdf_html)

            with open('%s' % pdf_dict[name],  'wb') as f:

                f.write(pdf_html.content)

            print("%s       下载完成!" %  pdf_dict[name])

            print()

         else:

            continue

4.总结

因本网页存在一些特殊问题,所以还需要具体分析才能得到笔者的代码。当然如果你们已经看明白了解说部分,那么多余的代码自然能够看懂。

笔者这里只是想通过一次自己的实践来给爬虫初学者一个思路,希望能帮助到你们。并且这里只是一些简单的爬虫,更加深层次还需要大家去探索。



END

编  辑   |   王楠岚

责  编   |   李和龙

 where2go 团队


微信号:算法与编程之美          

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多