不用scrapy也能提取整站内容(用 request 和 正则表达式 提取整站图片)

之前我们讲过用scrapy提取整站的图片和小说,无疑,用scrapy是一个捷径,你可以用CrawlSpider类指定的规则很方便的匹配图片和页面的链接。
不过我为了加深自己去request和对网站提取的理解的深度,想用request这一个请求库结合一些常用的解析方法(如正则,xpath等)实现对一个图片网站的所有图片的爬取。我们的目标网站是:目标网站
我们的目地是:
这里写图片描述

如图中红色方框里面的所有版块的内容,有些版块还有sub_class,这样,
这里写图片描述
如图中有sub_class,我们同样不能忽略这个,同样要进行爬取没商量!

好了,讲了目标和目的,接下来就是具体分析这个爬取的策略!
我个人偏向于从小到大的分析。所以,

  1. 第一步:我会先从一个套图开始分析,在页面上随便找一个套图,编写函数将它爬取下来。
    这里写图片描述
  2. 第二步:能爬取一个套图了,那就接下来可以去爬取一个页面了,一个套图页面的分析,也就是将一个页面上所有的套图链接提取出来进行爬取
    这里写图片描述
  3. 第三步:一个套图页面能够爬取了,一个版块是由多个套图页面组成的,接下来就是爬取一个版块了,编写函数,遍历版块下的所有页面,进行版块爬取。
    这里写图片描述
  4. 第四步:能进行版块爬取了,那我们是不是找到所有版块的链接就可以了,是的,最后一步就是从初始页面找到所有版块的链接
    这里写图片描述

上面已经讲了爬取的策略,只要思路清晰,那爬取并不是难事!!!接下来就是编码的细节了。
首先,我们是对一个套图的分析和爬取。
每个套图的每张图片都是有一个页面,那么我们应该遍历每张套图的所有页面,爬取每个页面上的图片。
这里写图片描述
我们以套图的总页数为网页跳转的次数,所以我们这里的关键就是提取出套图的总页数,代码:

def parse_detail(url,big_title):
    # 解析每个套图的详情页,因为每个套图的每一张图片在不同的页面,那就要解析每张图片所在的页面
    base_url = re.search('(http://www.mmonly.cc/mmtp/.*?).html',url).group(1)
    # 用 正则匹配出我们的连接规则的基础url
    html = requests.get(url=url,headers=HEADERS)
    parse_xpath = etree.HTML(html.text)
    total_page =int(parse_xpath.xpath('.//*[@id="picnum"]/*[@class="totalpage"]/text()')[0])
    for page in range(1,total_page+1):
        if page == 1:
            pic_url = url
        # 因为套图详情页的首页并不遵守一个连接的规则,所以我们作为一个特殊情况处理。
        else:
            pic_url = base_url + '_{page}.html'.format(page=page)
            print(pic_url)
            # 组装每个图片页面的链接
        pic_html = requests.get(url=pic_url,headers=HEADERS)
        # 请求图片页面
        parse_pic = etree.HTML(pic_html.text)
        # 解析图片页面
        title = ''.join(parse_pic.xpath('.//h1/text()'))
        file_path = r'D:/pictures/{file}/{picture}.png'.format(file=big_title, picture=page)
        # 以每张图片的标题给每个图片命名
        pics_url = parse_pic.xpath('.//*[@id="big-pic"]//img/@src')[0]
        pics = requests.get(url=pics_url,headers=HEADERS)
        # 解析出每张图片的具体的uri,然后请求图片的数据,并存储到本地的文件夹中
        with open(file_path,'wb') as f:
            f.write(pics.content)

上面一步我们已经爬取了一个套图,接下来就是爬取一个版块的所有链接,这个比较简单。
打开检查元素,如图:
这里有我们爬取所有套图的入口链接
这里写图片描述

xpath(你常用的解析方法)提取图片方框中的套图入口链接。
注意:有些链接是不可用的(应该是一些新闻链接,它的链接格式和套图入口链接的格式有差别,所以我们可以用正则表达式进行一下链接的赛选)
特殊套图:
这里写图片描述

parse_by_xpath = etree.HTML(html.text)
    picture_list = parse_by_xpath.xpath('.//*[@id="infinite_scroll"]/div')
    for single_pic in picture_list:
        picture_href = single_pic.xpath('.//*[@class="item_b clearfix"]/div/span/a/@href')[0]
        # 解析出每个套图详情页的链接
        if re.match('http://www.mmonly.cc/mmtp/.*?html',picture_href):
        # 用正则指定出套图入口连接的规则,不符合规则的就抛弃。
            big_title = single_pic.xpath('.//*[@class="item_b clearfix"]/div/span/a//text()')[0]
            # 套图的大标题
            os.makedirs('D:/pictures/{file}'.format(file=big_title))
            # 创建一个以套图大标题为文件夹名称的文件夹
            parse_detail(picture_href,big_title)

当然我们还有一个解析出所有页面的式子:
这里写图片描述
起始页面中已经有了所有页面的链接,我们需要的只是进行链接的重组和对首页和末页的链接进行剔除就可以了

start_html = requests.get(url=url,headers=HEADERS)
    parse_single_page(start_html)
    parse_this_html = etree.HTML(start_html.text)
    lis = parse_this_html.xpath('.//*[@class="pages"]/ul/li')[1:-2]
    # 找到起始页面中指向其他页面的标签,并用分片除去下一页和末页的链接
    for li in lis:
        url = 'http://www.mmonly.cc'+li.xpath('./a/@href')[0]
        # 组装各个页面的链接
        every_page_html = requests.get(url=url,headers=HEADERS)
        sleep(1)
        parse_single_page(every_page_html)

经过上一步我们已经能够提取出来一个模块的所有图片了,接下来只是要在首页中找到其他各个模块的链接就可以了
这里写图片描述

这个我们用正则表达式匹配出各个模块的链接刚刚好,对不对。
首先用正则匹配出所有链接在的那个代码块:

    re_pattern = re.compile('id="SonNavBox".*?</ul>',re.S)
    this = re.search(re_pattern,html.text).group()
    # 这个就是那个包含所有链接的代码块。

接下来有用正则匹配出符合规则的所有链接

re_url_pattern = re.compile('http://www.mmonly.cc/\w+?/\w+?/|http://www.mmonly.cc/\w+?/')
# 注意看正则表达式那个竖杠|是可选的意思,就是匹配两个模式之一都可以。
urls = re.findall(re_url_pattern,this)

那么我们已经完成了基本上所有页面的提取,接下来只是要整合代码就可以了!
详细的代码,要的话私信留言就可以了!

猜你喜欢

转载自blog.csdn.net/killeri/article/details/80363726