Python爬半次元的小姐姐 – Python Spider For BYC

于是上星期说了这星期把半次元的爬虫放出

Github上持续更新:SakuraLove/PythonSpiderForBCY

我捣鼓了几天但是还是有点问题,那就先把初代的发出来,初代的仅能get到 http://bcy.net/u/{id}/post/cos 里面的图片,详细页面里面的图片仍未能获取。

获取详细页面的思路

获取/cos页面,通过A标签遍历获取 href 值,然后把这个值传入一个另一个函数里

另一个函数负责获取详细页面并解析页面获取img的src值,然后遍历下载

实现:

先引入bs4等库

# -*- coding: utf-8 -*
import urllib
import re
from bs4 import BeautifulSoup
from lxml import etree
import os
import requests

首先先前往bcy.net,进入某个coser的主页,然后分析其链接结构:

于是在链接中能够看见链接为 http://bcy.net/u/{id}/post/cos ,于是就能写一个输入id来获取链接

if __name__ == '__main__':
    page = 0
    member_id = raw_input('请输入coser ID,例如:18943,不知道的亲F12在图片的链接里面找')
    getbcy(member_id,page,0,0)
    print "存储在 PY文件目录/CosID 中"

def getbcy(nameid,pageid=1,wrong=0,alltime=0):
 url = u"http://bcy.net/u/%s/post/cos?p=%d" % (nameid,pageid)

然后就能使用request抓取页面。

但在抓取并输出后,我们发现输出的内容是404,于是我们就要开始考虑反爬虫的问题。

在requests库中,如果未定义header的话user_agent会使用python,那么我们就需要递交一个包含浏览器user_agent的header信息

 user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'
    headers = {'User-Agent': user_agent, 'Referer': 'http://bcy.net'}
    # html = urllib.urlopen(url,None,headers).read()
    session = requests.session()
    html = session.get(url, headers=headers)

此时,我们就能正确抓取页面了。再而,我们就需要用到bs4进行解析,然后我们在浏览器中对html的分析中可以得出,图片包含在一个postWorkCard__img ovf的div中

然后在进行遍历,获取在此div中的img的scr的内容

for myimg in soup.find_all('div', class_='postWorkCard__img ovf'):
        img_src = myimg.find('img').get('src')
        img_src = re.sub(r'/tl.*$', "", img_src)
        print img_src

并且我们发现半次元采用的cdn对图片有处理,于是我们用正则把图片链接后的/tl640删去便能获取无压的图片。

soup = BeautifulSoup(html.content, "lxml")
    print soup
    if not os.path.exists("bcy/%s_image" % nameid):
        os.makedirs("bcy/%s_image" % nameid)
    index = 0
    for myimg in soup.find_all('div', class_='postWorkCard__img ovf'):
        img_src = myimg.find('img').get('src')
        img_src = re.sub(r'/tl.*$', "", img_src)

然后在加上下载的代码,便能获取图片

soup = BeautifulSoup(html.content, "lxml")
    print soup
    if not os.path.exists("bcy/%s_image" % nameid):
        os.makedirs("bcy/%s_image" % nameid)
    index = 0
    for myimg in soup.find_all('div', class_='postWorkCard__img ovf'):
        img_src = myimg.find('img').get('src')
        img_src = re.sub(r'/tl.*$', "", img_src)
        print img_src
        picname = re.search(r"(?<=/post/).+?(?=$)", img_src, re.M)
        picname = re.search(r"(?<=/).+?(?=$)", picname.group(0), re.M)
        CurrentPath = os.getcwd()
        filename = CurrentPath + "/bcy/%s_image/%s" % (nameid, picname.group(0))
        print picname.group(0)
        try:
            print u'下完了%s张' % (index + 1)
            alltime +=1
            index += 1
            urllib.urlretrieve(url=img_src, filename=filename)
        except Exception:
            print(u'这张图片下载出问题了: %s' % filename)
    pageid += 1
    if index < 12:
        print u'一共下载了 %d 张照片共 %d 页' %(alltime,pageid)
        print u"存储在 %s/bcy/%d_image/" %(CurrentPath, nameid)
        exit(1)
    else:
        getbcy(member_id, pageid, wrong, alltime)

 

初代:

# -*- coding: utf-8 -*
import urllib
import re
from bs4 import BeautifulSoup
from lxml import etree
import os
import requests

p = 1
def getbcy(nameid,pageid=1,wrong=0,alltime=0):
    url = u"http://bcy.net/u/%s/post/cos?p=%d" % (nameid,pageid)
    print url
    user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'
    headers = {'User-Agent': user_agent, 'Referer': 'http://bcy.net'}
    # html = urllib.urlopen(url,None,headers).read()
    session = requests.session()
    html = session.get(url, headers=headers)
    # page = etree.HTML(html.lower().decode('utf-8'))
    # page=BeautifulSoup(html.text)
    # print page
    soup = BeautifulSoup(html.content, "lxml")
    print soup
    if not os.path.exists("bcy/%s_image" % nameid):
        os.makedirs("bcy/%s_image" % nameid)
    index = 0
    for myimg in soup.find_all('div', class_='postWorkCard__img ovf'):
        img_src = myimg.find('img').get('src')
        img_src = re.sub(r'/tl.*$', "", img_src)
        print img_src
        picname = re.search(r"(?<=/post/).+?(?=$)", img_src, re.M)
        picname = re.search(r"(?<=/).+?(?=$)", picname.group(0), re.M)
        CurrentPath = os.getcwd()
        filename = CurrentPath + "/bcy/%s_image/%s" % (nameid, picname.group(0))
        print picname.group(0)
        try:
            print u'下完了%s张' % (index + 1)
            alltime +=1
            index += 1
            urllib.urlretrieve(url=img_src, filename=filename)
        except Exception:
            print(u'这张图片下载出问题了: %s' % filename)
    pageid += 1
    if index < 12:
        print u'一共下载了 %d 张照片共 %d 页' %(alltime,pageid)
        print u"存储在 %s/bcy/%d_image/" %(CurrentPath, nameid)
        exit(1)
    else:
        getbcy(member_id, pageid, wrong, alltime)

if __name__ == '__main__':
    page = 0
    member_id = raw_input('请输入coser ID,例如:18943,不知道的亲F12在图片的链接里面找')
    getbcy(member_id,page,0,0)
    print "存储在 PY文件目录/CosID 中"

4 条评论

昵称

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  1. 月宅

    爬过哔卡的表示它服务器实在太慢了,24小时才不到1千张Σ(っ °Д °;)っ实在是太狗血了

    1. 很懒的樱花

      我爬半次元的图,单线程几分钟就过千了

  2. 老黄

    666

    1. 很懒的樱花

      泥嚎