python 爬虫爬取煎蛋网妹子图

首先查看js渲染前的html源码,发现放图片的位置是这样的

本该放地址的地方赫然放着blank.gif,并且在onload属性上绑定了一个jandan_load_img函数。这个jandan_load_img就成为本次爬虫的突破所在了。继续ctrl+shift+F全局搜索,找到这个函数

流程图:

import hashlib
import base64
from bs4 import BeautifulSoup
import requests
import re
import random
import shutil
import os
import time
import queue
import threading
import math

‘‘‘
url解码
‘‘‘

def parse(imgHash, constant):

    ‘‘‘
    以下是原来的解码方式,近日(2018/5/25)已被修改不再生效
    q = 4
    hashlib.md5()
    constant = md5(constant)
    o = md5(constant[0:16])
    n = md5(constant[16:32])
    l = imgHash[0:q]
    c = o + md5(o + l)
    imgHash = imgHash[q:]
    k = decode_base64(imgHash)
    h =list(range(256))
    b = list(range(256))
    for g in range(0,256):
        b[g] = ord(c[g % len(c)])
    f=0
    for g in range(0,256):
        f = (f+h[g]+b[g]) % 256
        tmp = h[g]
        h[g] = h[f]
        h[f] = tmp

    result = ""
    p=0
    f=0
    for g in range(0,len(k)):
        p = (p + 1) % 256;
        f = (f + h[p]) % 256
        tmp = h[p]
        h[p] = h[f]
        h[f] = tmp
        result += chr(k[g] ^ (h[(h[p] + h[f]) % 256]))

    result = result[26:]
    return result
    ‘‘‘
    return decode_base64(imgHash).decode(‘utf8‘)

def md5(src):
    m = hashlib.md5()
    m.update(src.encode("utf8"))
    return m.hexdigest()

def decode_base64(data):
    missing_padding = 4 - len(data) % 4
    if missing_padding:
        data += ‘=‘ * missing_padding
    return base64.b64decode(data)

headers = {
    ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36‘
}

‘‘‘
页面抓取类
‘‘‘

class Spider(threading.Thread):

    def __init__(self, pages, proxies, url_manager):
        threading.Thread.__init__(self)
        self.pages = pages
        self.proxies = proxies
        self.url_manager = url_manager

    def get_Page(self, page, proxies, url_manager):
        bs_page = BeautifulSoup(page, "lxml")

        ‘‘‘
        获取js文件地址从而得到constant常量
        ‘‘‘
        try:
            model = re.findall(r‘.*<script\ssrc=\"\/\/(cdn.jandan.net\/static\/min.*?)\"><\/script>.*‘, page)
            jsfile_url = "http://" + model[len(model) - 1]  # 页面上可能有两个地址,取最后一个匹配的地址
        except Exception as e:
            print(e)
        jsfile = requests.get(jsfile_url, headers=headers, proxies=proxies, timeout=3).text

        constant = re.search(r‘.*remove\(\);var\sc=\w+\(e,\"(\w+)\".*‘, jsfile).group(1)
        ‘‘‘
        向parse函数传入constant常量和img-hash得到图片地址
        ‘‘‘
        for item in bs_page.select(‘.img-hash‘):
            img_url = ‘http:‘ + parse(item.text, constant)
            url_manager.addNewUrl(img_url)

    def run(self):
        for page in self.pages:
            self.get_Page(page, self.proxies, self.url_manager)

‘‘‘
程序入口
‘‘‘

def main(amount):
    url_manager = UrlManager()
    proxies = {‘http‘: ‘‘}  # 尚未添加ip代理功能,程序已能正常运行

    current_url = ‘http://jandan.net/ooxx‘  # 当前页面url
    ‘‘‘
    多线程抓取页面地址
    ‘‘‘
    pages = []  # 所有待抓取页面
    try:
        for i in range(amount):
            current_page = requests.get(current_url, headers=headers).text  # 当前页面源码
            pages.append(current_page)
            current_url = ‘http:‘ + re.search(r‘.*Older\sComments\"\shref=\"(.*?)\"\sclass.*‘, current_page).group(
                1)  # 提取下个页面url
    except Exception as e:
        pass

    page_threads = []
    t_amount = 10 if len(pages) > 10 else len(pages)  # 页面抓取线程数
    for i in range(t_amount):
        t = Spider(pages[math.ceil(int((len(pages)) / t_amount) * i):math.ceil(int((len(pages)) / t_amount) * (i + 1))],
                   proxies, url_manager)
        page_threads.append(t)
    for t in page_threads:
        t.start()
    for t in page_threads:
        t.join()

    img_threads = []
    for i in range(10):  # 固定10个线程用于下载图片
        t = Download(url_manager)
        img_threads.append(t)
    for t in img_threads:
        t.start()
    for t in img_threads:
        t.join()

L = threading.Lock()

‘‘‘
图片下载类
‘‘‘

class Download(threading.Thread):
    def __init__(self, url_manager):
        threading.Thread.__init__(self)
        self.url_manager = url_manager
        self.pic_headers = headers
        self.pic_headers[‘Host‘] = ‘wx3.sinaimg.cn‘

    def download_Img(self, url):
        isGif = re.match(r‘(.*\.sinaimg\.cn\/)(\w+)(\/.+\.gif)‘, url)
        if isGif:
            url = isGif.group(1) + ‘large‘ + isGif.group(3)

        extensionName = re.match(r‘.*(\.\w+)‘, url).group(1)  # 图片扩展名

        L.acquire()
        if not os.path.exists(‘img‘):
            os.mkdir(‘img‘)
        with open(‘img/‘ + str(len(os.listdir(‘./img‘))) + extensionName, ‘wb‘) as f:
            # headers[‘Host‘]=‘wx3.sinaimg.cn‘
            f.write(requests.get(url, headers=self.pic_headers).content)
            f.close()
        L.release()

    def run(self):
        while not self.url_manager.isEmpty():
            imgUrl = self.url_manager.getNewUrl()
            self.download_Img(imgUrl)
            self.url_manager.addOldUrl(imgUrl)

‘‘‘
url仓库,提供url更新以及记录功能
‘‘‘

class UrlManager:
    def __init__(self):
        self.url_used = []
        self.url_target = queue.Queue()
        if os.path.exists(‘url.txt‘):
            with open(‘url.txt‘, ‘r‘) as f:
                for eachline in f.readlines():
                    self.url_used.append(eachline.strip())
        else:
            open("url.txt", ‘w‘)

    def getNewUrl(self):
        return self.url_target.get()

    def isEmpty(self):
        return self.url_target.empty()

    def addNewUrl(self, newUrl):
        if newUrl in self.url_used:
            pass
        else:
            self.url_target.put(newUrl)

    def addOldUrl(self, oldUrl):
        self.url_used.append(oldUrl)
        with open(‘url.txt‘, ‘a‘) as f:
            f.write(oldUrl + ‘\n‘)

if __name__ == ‘__main__‘:

    amount = input(‘请输入抓取页数后按回车开始(小于100),从首页开始计数):‘)
    main(int(amount))  # 抓取首页开始的前amount页的图片

爬取代码

原文地址:https://www.cnblogs.com/a-dyw/p/9328439.html

时间: 2024-10-19 13:55:33

python 爬虫爬取煎蛋网妹子图的相关文章

Python爬虫之爬取煎蛋网妹子图

这篇文章通过简单的Python爬虫(未使用框架,仅供娱乐)获取并下载煎蛋网妹子图指定页面或全部图片,并将图片下载到磁盘. 首先导入模块:urllib.request.re.os import urllib.request import re import os urllib.request模块用于获取HTML页面数据 re模块用于通过正则表达式解析并截取HTML页面图片url os模块用于文件夹相关操作 代码不多,直接贴出来,代码解释在注释中: def crawl_jiandan(page, p

python3爬虫爬取煎蛋网妹纸图片

其实之前实现过这个功能,是使用selenium模拟浏览器页面点击来完成的,但是效率实际上相对来说较低.本次以解密参数来完成爬取的过程. 首先打开煎蛋网http://jandan.net/ooxx,查看网页源代码.我们搜索其中一张图片的编号,比如3869006,看下在源代码中是否能找到图片链接 从上面的HTML结构中找到这个标号对应的一些属性,没有直接的图片链接地址,只有一个src=//img.jandan.net/blank.gif,这很明显不是个真实的链接地址,因为每一个图片编号都有这个值.我

使用Python爬取煎蛋网妹纸图片

import urllib.request import os import os.path import re def dir(dir_name="images"):     """设定图片保存目录,基于当前程序运行目录"""     if os.path.isdir(dir_name):         os.chdir(dir_name)     else:         os.mkdir(dir_name)     

selenium爬取煎蛋网

selenium爬取煎蛋网 直接上代码 from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as ES import requests import urllib.requ

爬虫实例——爬取煎蛋网OOXX频道(反反爬虫——伪装成浏览器)

煎蛋网在反爬虫方面做了不少工作,无法通过正常的方式爬取,比如用下面这段代码爬取无法得到我们想要的源代码. import requests url = 'http://jandan.net/ooxx' print requests.get(url).text 执行上述代码,你得到的结果应该跟我一样: 煎蛋网应该是通过检测headers来判断是否爬虫,要想获取正常的源代码,需要伪装成浏览器. # -*- coding: utf-8 -*- import re import requests from

用python来抓取“煎蛋网”上面的美女图片,尺度很大哦!哈哈

废话不多说,先上代码: import urllib.request import re #获得当前页面的页数page_name def get_pagenum(url): req = urllib.request.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safar

Python 爬取煎蛋网妹子图片

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Date : 2017-08-24 10:17:28 4 # @Author : EnderZhou ([email protected]) 5 # @Link : http://www.cnblogs.com/enderzhou/ 6 # @Version : $Id$ 7 8 import requests 9 from bs4 import BeautifulSoup as bs

python 爬取煎蛋网图片

__author__ = mkdir(path):     os     path = path.strip()  path = path.rstrip()  mkfile = os.path.exists(path)     mkfile:         ()     :         os.makedirs(path)         () urllib, urllib2, re geturl(url):     file_lists = []     req = urllib2.Req

python爬取煎蛋网图片

py2版本: #-*- coding:utf-8 -*-#from __future__ import unicode_literimport urllib,urllib2,timeimport re,sys,osheaders={'Referer':'http://jandan.net/','User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2